先说结论:yarn 和 npm 没本质区别。Node.js 程序写不出来,yarn 玩出花来也没用。


yarn 是由 Facebook 开发的 JavaScript 包管理器,可以用来替代 npm。但是 yarn 并没有另起炉灶,而是沿用了 npm 的托管仓库(Registry),事实上你可以用 npm 安装 yarn ……

yarn 针对 npm 的一些不足加以改进,然后 npm 较新的版本(v5)又加以吸收,现在两者的差别不大,选择使用哪个取决于个人偏好。

如果是初学者,用 npm。部分教程和说明会使用 yarn,只要明了两个是类似的工具,把略有不同的指令的对应关系搞清楚就好了。

npm yarn
npm init yarn init
npm install yarn add
npm install -g yarn global add
npm uninstall yarn remove
…… ……

lock 文件

package-lock.json 看着像程序运行过程中产生的临时文件,删除掉往往并不影响程序的运行,所以这个文件要不要添加到版本控制?答案是:要。

package-lock.json 文件的作用是什么?

首先,npm 软件包的版本编号遵照的是 Semantic Versioning 的规则:Major.Minor.Patch

为了不重复制造轮子,你会使用很多第三方的轮子,然后第三方的轮子又会使用其它的轮子,这是一种信任的传递。信任第三方的软件包,默认也将信任未来可能的补丁和升级。

package.json 文件,记录了项目安装的软件包的版本。版本号前添加 ^ (默认)表示接受 Minor 升级,版本号前添加 ~ 表示接受 Patch 升级。

package.json 文件并没有记录(间接的)依赖项的版本。假设你在项目中安装了软件包 A,运行正常并且记录了它的版本。但是软件包 A 可能另外引用了软件包 B 作为依赖项,如果软件包 B 的一次升级引入了问题,当你重新安装项目软件包时就可能引入问题,而且因为没有记录而难以排查。

针对这个问题,package-lock.json 文件记录项目所有的(直接和间接)依赖项的版本信息(Dependency Tree),当你重新安装项目软件包时,能够忠实地还原之前保存的状态,避免错误。