npm安装依赖的时候会生成package-lock.json文件,几乎不会有人去关注这个文件是干嘛的,今天同事突然跟我说以后安装依赖都用yarn,不然会出现两个lock文件。
yarn是Facebook、Google、Exponent 和 Tilde 联合推出了一个新的 JS 包管理工具,说是为了弥补npm的一些缺陷。最大的体现是速度上,npm确实是慢,国内更是很容易失败报错,我基本使用淘宝cnpm。npm必须等到上一个依赖安装成功之后才能安装下一个,yarn是并行安装,速度上提高的不是一点半点,其实安装依赖的时候也大概看得出来,yarn一排的在安装。
yarn不是想取代npm,只是一个新的工具,类似cnpm一样,拉取的还是npm的仓库。只是命令和输出都做了一些调整,而cnpm跟npm保持一致。
在npm5.x发布之前,yarn就有了yarn.lock,当时除了速度之外,这是yarn对npm一个很大的改进。package.json里面版本号的格式有很多,常见的~、^、>、<等,定一个版本范围,对于安装依赖的时候有很大的影响,很容易造成不同版本环境安装的依赖不一样。我刚入行前端的时候水群经常看见小白问为什么相同项目初始化之后同事的可以我不行,就是因为这个引起的。而yarn为了防止同一个项目拉取到不同的版本,生成了yarn.lock文件,这个文件记录了第一次安装模块时候的版本号。所以不同环境拉取同一个项目的依赖保证了版本的一致性。
最开始,npm提供了一个命令npm shrinkwrap(我是从来没用过),也会生成一个锁定文件,跟yarn.lock一个道理。在5.0版本之后,npm也会自动生成了,只是这个过程有点波折。第一次发布生成之后,npm都会根据package-lock去进行下载,就算改了package.json都没用,这当然是不允许的,issue自然满天飞。然后改进,改完之后lock又没用了,会去下载最新的依赖,那不是更扯了吗。最后,会对比package.json和package-lock,如果不同会根据package.json去安装,然后更新package-lock。如果都一样就会根据package-lock去下载。
为了验证lock的作用,我做了几个实验,用vue-awesome-swiper这个去实验的。
npm:
package.json是^4.1.1 package-lock.json是4.1.1 实际安装是4.1.1
修改package.json:
package.json是^4.0.0 package-lock.json是4.1.1 实际安装是4.1.1
修改package.json:
package.json是^3.0.0 package-lock.json是3.1.3 实际安装是3.1.3
修改package.json:
package.json是^2.6.6 package-lock.json是2.6.7 实际安装是2.6.7
yarn:
package.json是^4.1.1 yarn.lock是4.1.1 实际安装是4.1.1
修改package.json:
package.json是^4.0.0 yarn.lock是4.0.0 实际安装是4.1.1
修改package.json:
package.json是^3.0.0 yarn.lock是3.0.0 实际安装是3.1.3
修改package.json:
package.json是^2.6.6 yarn.lock是2.6.6 实际安装是2.6.7
对比下来就很清楚了,npm的package-lock会根据package.json大版本来锁死,实际安装的会根据package-lock版本。yarn锁死的版本跟package.json一致,但是实际安装的是根据package.json里面的版本范围安装允许的最新版本。不管npm和yarn的lock机制是什么,最终实际安装的npm和yarn都是一样的。
今天使用npm和yarn分别安装的时候,并没有体验到yarn非一般的速度,感觉跟npm差不多,删除node_modules之后install反而觉得npm快很多,我也不知道什么情况。还有,进行实验要用npm,用cnpm是不会改变package-lock的。
最后多嘴一下,安装yarn我是去官网那边下载之后安装的,并不知道用npm安装有什么问题,因为看见有人说别用npm安装yarn:
https://classic.yarnpkg.com/zh-Hans/docs/install#windows-stable