npm和yarn之间的区别

1. NPM

NPM(node package manager),通常称为node包管理器,主要功能就是管理node包,包括:安装、卸载、更新、查看、搜索、发布等。NPM是基于couchdb一个数据库,详细记录了每个包的信息(作者、版本、依赖、授权信息等)。它是Node.js能够如此成功的主要原因之一。

npm是围绕着语义版本控制(semver)的思想而设计的
给定一个版本号:主版本号.次版本号.补丁版本号, 以下这三种情况需要增加相应的版本号

  • 主版本号: 当API发生改变,并与之前的版本不兼容的时候
  • 次版本号: 当增加了功能,但是向后兼容的时候
  • 补丁版本号: 当做了向后兼容的缺陷修复的时候

npm使用一个名为package.json的文件来管理node包,用户可以通过npm install --save命令把项目里所有的依赖项保存在这个文件里。

例如,运行npm install --save react会将以下几行添加到package.json文件中。

"dependencies": {
    "react": "^16.3.0"
}

请注意下面三个版本号在安装的时候代表不同的含义

"16.3.0"
"~16.3.0"
"^16.3.0"

“16.3.0”表示安装指定的16.3.0版本,“~16.3.0”表示安装16.3.X中最新的版本,“^16.3.0”表示安装16.X.X中最新的版本。
这就导致了不同的开发人员即使使用了相同的package.json文件,在他们自己的机器上也可能会安装同一个库的不同种版本,这样就会存在潜在的难以调试的错误和“在我的电脑上…”的情形。

2. Yarn

Yarn是由Facebook、Google、Exponent 和 Tilde 联合推出了一个新的 JS 包管理工具,其目的是解决团队在 npm 面临的问题,即

  • npm install的时候速度不够快
  • 同一个项目,由于package.json文件中版本号的特点,安装的时候无法保持一致性
  • npm 允许在安装 packages 时执行代码,这就埋下了安全隐患
  • 安装的时候,包会在同一时间下载和安装,中途某个时候,一个包抛出了一个错误,但是npm会继续下载和安装包。因为npm会把所有的日志输出到终端,你可能不会注意到实际发生的错误。

2.1 速度快

Yarn安装包的速度快主要来自以下两个方面

  • 并行安装:无论npm还是Yarn在执行包的安装时,都会执行一系列任务。npm是按照队列执行每个package,也就是说必须要等到当前package安装完成之后,才能继续后面的安装。而 Yarn是同步执行所有任务,提高了性能
  • 离线模式:如果之前已经安装过一个软件包,用Yarn再次安装时之间从缓存中获取,就不用像npm那样再从网络下载了

2.2 安装版本统一

为了防止拉取到不同的版本,Yarn 有一个锁定文件yarn.lock记录了被确切安装上的模块的版本号。每次只要新增了一个模块,Yarn 就会创建(或更新)yarn.lock这个文件。这么做就保证了,每一次拉取同一个项目依赖时,使用的都是一样的模块版本。npm 其实也有办法实现处处使用相同版本的 packages,但需要开发者执行 npm shrinkwrap 命令。这个命令将会生成一个锁定文件,在执行 npm install 的时候,该锁定文件会先被读取,和 Yarn 读取 yarn.lock 文件一个道理。npm 和 Yarn 两者的不同之处在于,Yarn 默认会生成这样的锁定文件,而 npm 要通过 shrinkwrap 命令生成 npm-shrinkwrap.json 文件,只有当这个文件存在的时候,packages 版本信息才会被记录和更新。

2.3 简洁的输出

npm 的输出信息比较冗长。在执行 npm install 的时候,命令行里会不断地打印出所有被安装上的依赖。相比之下,Yarn 简洁太多:默认情况下,结合了emoji直观且直接地打印出必要的信息,也提供了一些命令供开发者查询额外的安装信息。