npm vs yarn

npm 和 yarn 是目前比较常用的包管理工具。本文主要对 npm5+ 和 yarn 来做简单的对比和介绍。

npm 与 yarn 主要的命令对比:

npm命令yarn命令
npm installyarn (install)
npm install –save / npm iyarn add
npm install –save-dev / npm i -Dyarn add –dev
npm uninstallyarn remove
npm inityarn init
npm install -gyarn global add
npm uninstall -gyarn global remove
npm startyarn start
npm runyarn run
npm lsyarn list

一、yarn

yarn是2016年10月发布,目前在Github上获取了3.4w+的 star。官方给出的解释是:快速、可靠、安全的依赖管理。

1.1 特点

1.1.1 并行安装:

无论 npm 还是 yarn 在执行包的安装时,都会执行一系列任务。npm 是按照队列执行每个 package,也就是说必须要等到当前 package 安装完成之后,才能继续后面的安装。而 yarn 是同步执行所有任务,提高了性能。

1.1.2 离线模式:

如果之前已经安装过一个软件包,再次安装时就不用再从网络下载了。

1.1.3安装版本统一:

安装版本统一为了防止拉取到不同的版本,yarn 有一个锁定文件 (lock file) 记录了被确切安装上的模块的版本号。每次只要新增了一个模块,Yarn 就会创建(或更新)yarn.lock 这个文件。这么做就保证了,每一次拉取同一个项目依赖时,使用的都是一样的模块版本。

1.1.4 多注册来源处理:

所有的依赖包,不管他被不同的库间接关联引用多少次,安装这个包时,只会从一个注册来源去装,要么是 npm 要么是 bower, 防止出现混乱不一致

二、npm5+

node 升级到了 8.0 后 npm 也随之升到 5.0,相比与老的 npm,npm5 有了巨大的变化,

2.1 特性

2.1.1 锁文件(lockfile):

新增了 package-lock.json 文件,在操作依赖时默认生成,用于记录和锁定依赖树的信息。使用过 yarn 的同学应该能感觉到,这里估计也是在 yarn 的 lockfile 大受欢迎的背景下做出了这个修改。

2.1.2 缓存优化:

新版本重写了整个缓存系统,缓存将由 npm 来全局维护(~/.npm)不用用户操心,这点也是在向 yarn 看齐。

2.1.3 Git 依赖支持优化:

对 Git 依赖支持了通过 semver 版本号安装指定的版本。例如可以通过以下命令安装 Github 上的 abc 1.0.0 版本,这个特性在需要安装大量内部项目(例如在没有自建源的内网开发),或需要使用某些依赖的未发布版本时很有用。

1
npm install git+https://github.com/abc/abc.git#semver:1.0.0

2.1.4 文件依赖优化:

在之前的版本,如果将本地目录作为依赖来安装,将会把文件目录作为副本拷贝到 node_modules 中。而在 npm5 中,将改为使用创建 symlinks 的方式来实现(使用本地 tarball 包除外),而不再执行文件拷贝。这将会提升安装速度。

2.1.5 npx:

npm v5.2.0 引入的一条命令(npx),npx 会帮你执行依赖包里的二进制文件。引入这个命令的目的是为了提升开发者使用包内提供的命令行工具的体验。在以往中,我们在 node 项目中要执行一个脚本,需要将它在 scripts 中声明

1
2
3
4
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"init:runtime-only": "vue init webpack vue-cms"
}

然后需要执行命令

1
npm run init:runtime-only

用了 npx 以后呢,你不需要在 scripts 中声明了,就可以直接敲键盘了:

1
npx vue init webpack vue-cms

三、速度对比

下面是测试了npm 4.6.1,npm 5.5.1和 yarn安装速度的对比:来源

0_1545701475038_Jietu20181224-150021@2x.jpg

通过对比可以看出,npm 从 4 到 5,有了很大的飞跃,yarn与npm5对比速度在大部分正常场景下还是略高一筹,特别是有缓存的情况下,不过相比之下 npm5 的差距已经很小。

四、其他

4.1 NPM依赖包版本号~和^和*的区别

  • ~会匹配最近的小版本依赖包,比如~1.2.3会匹配-所有1.2.x版本,但是不包括1.3.0
  • ^会匹配最新的大版本依赖包,比如^1.2.3会匹配所有1.x.x的包,包括1.3.0,但是不包括2.0.0
  • *这意味着安装最新版本的依赖包

推荐使用~,只会修复版本的bug,比较稳定。使用^ ,有的小版本更新后会引入新的问题导致项目不稳定。
或者版本号写*,这意味着安装最新版本的依赖包,但缺点同上,可能会造成版本不兼容,慎用!

五、总结

通过以上一系列对比,我们可以看到 npm5 在速度和使用上确实有了很大提升。但从速度上来说 yarn 貌似还是更快一点。但是 npm 社区似乎更加的活跃,后续的发展也很值得期待的。

六、参考资料