1.npm 是Node的开放式模块登记和管理系统,是Node.js包的标准发布平台,用于Node.js包的发布、传播、依赖控制
2.今天主要说的是package-lock.json
在团队协作中的作用(yarn.lock
也是一样), 其实在npm@5之后和yarn的区别已经很小了
正常项目用哪个都行, 几乎可以在每个阶段无缝切换
3. package-lock.json
是否应该提交到版本库, 无论是yarn官方还是npm官方都认为应该提交到版本库, 用来保证团队每个开发者的依赖一致性,那么package-lock.json
是如何保证团队依赖一致性的, 下面会说明
4. 三个常见的npm语义化版本
2.1.0 必须是2.1.0
^2.1.0 限定大版本,后面更新不能超过主版本2
~2.1.0 限定前两个版本,后面更新不能超过主版本2和次版本1
5.我初始化项目中package.json
依赖信息如下
"devDependencies": {
"sass": "^1.68.4"
},
执行npm install
在我的仓库下生成了node_modules
和package-lock.json
对于项目初始化我需要用到sass, 我的本意是安装主版本号为1的sass依赖, 后两个版本尽可能新的给我安装, 此时npm源上的sass包最新的版本就是1.68.4, 那么我安转的sass肯定是1.68.4, 生成package-lock.json
信息如下
"sass": {
"version": "1.68.4",
"resolved": "https://registry.npmmirror.com/sass/-/sass-1.68.4.tgz",
"integrity": "sha512-X99+a2iGdXkdWn1akFPs0ZmelUzyAQfvqYc2P/MPTrJRuIRoTffGzT9W9nFqG00S+c8hXzVmgxhUuHFdrwxkhQ==",
"requires": {
"chokidar": ">=3.0.0 <4.0.0",
"immutable": "^4.0.0",
"source-map-js": ">=0.6.2 <2.0.0"
}
}
6.锁定后续团队成员安装的依赖版本
之后只要我把package-lock.json
提交到版本库, 下一位团队成员拉取代码后, 执行npm install
那么他安装的sass依赖版本就是已经被我锁定的1.68.4
哪怕他拉取的时候sass的作者已经把1.69.4发布到npm, 他下载的依赖依然和我初始化项目下载的依赖一样, 因为我锁定了依赖版本, 这有利于团队成员开发依赖一致性
反之, 如果我没有把package-lock.json
提交到版本库, 那么后续拉取代码安装依赖的团队成员就会根据package.json
的版本规则去尽可能新的安装依赖, 这可能导致一些意想不到的问题, 因为大家的依赖版本不一致了
7.有了package-lock.json
文件, 我们应该如何更新依赖
根据上面说的难道以后我们都不能更新依赖, 使用包的新特性了吗? 当然不是, 不过更新依赖应该规范起来
这里提供一个流程
1.某位团队成员 使用 npm update 更新依赖(或者直接修改
package.json
里面的依赖版本), 如果npm源有新的符合语义化版本的依赖可用, 那么这位成员的package-lock.json
肯定会变化,
++
tip: 如果使用npm update
命令更新依赖, 最后找到更新后的依赖的版本, 你可以手动修改到package.json
, 因为package.json只能手动操作, 这样做的目的是方便及时方便的查看依赖版本, 比如1.68.4
更新到了1.69.4
你应该把package.json
里面的^1.68.4
手动改为^1.69.4
(这一步看个人喜好, 不是那么重要还可能会手动出错~~~)
++
2.这位成员把package-lock.json
和package.json
提交到仓库
++
3.通知其它成员, 拉取package-lock.json
和package.json
进行npm install
更新各自的依赖, 保持团队依赖一致性.
8.本地隐藏锁文件 官方叫法: Hidden Lockfiles
原话翻译
为了避免node_modules重复处理文件夹,从npm v7 开始,npm 使用node_modules/.package-lock.json. node_modules它包含有关树的信息,并且在满足以下条件的情况下用于代替读取整个层次结构:
这个node_modules/.package-lock.json文件和版本的锁定关系测试如下
有一种情况:
你把本地的package-lock.json
删掉, 但是保存着node_modules
, 那么你在npm install
的时候node_modules/.package-lock.json
会起到和package-lock.json
一样的作用
这种情况直接不用去注意, 因为没人会把node_modules
提到代码仓库而不把package-lock.json
提上去, 这TM~
fun:-)