package-lock.json缓存了每个包的具体版本和下载链接,这样就不需要再去远程仓库进行查询,节约了安装时间,提升了部署效率。package-lock.json文件作用就是锁定依赖安装结构,目的就是保证在任意机器和环境上执行npm install都会得到完全相同的node_modules安装结果。
我们知道单一的package.json不能确定唯一的依赖树,这是因为:
- 不同版本的npm安装依赖策略和算法不同
- npm install将根据package.json中的semver-range version更新依赖,某些依赖项自上次安装以来,可能已经发布了新版本。
并不是所有的子依赖都有dependencies属性,只有子依赖的依赖和当前已安装在根目录的node_modules中的依赖冲突后,才会有这个属性。
至于要不要将lockfiles文件提交到代码仓库中,要看项目定位进行决定。
- 如果开发一个应用,建议将package-lock.json文件提交到代码版本仓库
- 如果开发目标是开发一个给外部使用的库,可以复用主项目已经加载过的包,减少依赖重复和体积
- 如果开发的库依赖精确的版本号的模块,那么提交lockfiles到仓库可能会造成同一个依赖不同版本都被下载的情况
- 如果作为库开发者,真的有使用某个特定版本依赖的需要,一个更好的方式就是定义peerDependencies
因此,推荐做法是将packjson-lock.json一起提交到代码库中,不需要ignore。但是在执行npm publish命令,发布一个库的时候,应该被忽略而不是直接发布出去。
早期npm锁定版本的方式使用npm-shrinkwrap.json,与package-lock.json不同点在于:npm包发布的时候默认将npm-shrinkwrap.json发布,因此类库或组件需要慎重使用。使用package-lock.json是npm v5.x版本新增特性,而npm v5.6以上才逐步稳定在5.0-5.6中间,对于package-lock.json的处理逻辑进行了几次更新。
在npm v5.x版本中,npm install时都会根据package-lock.json文件下载,不管package.json内容究竟是什么
npm v5.1.0版本到npm v5.4.2,npm install会无视package-lock.json文件,下载最新的npm包并进行更新package-lock.json文件
npm 5.4.2版本后
- 如果项目只有package.json文件,npm install后生成一个package-lock.json文件;
- 如果项目中存在package.json和package-lock.json文件,同时package.json文件的semver-range版本和package-lock.json中版本兼容,即使此时有新的适用版本,npm install还是会根据package-lock.json进行更新
- 如果项目存在package.json和package-lock.json文件,同时package.json文件的semver-range版本和package-lock.json中版本不兼容,npm install时package-lock.json会将更新到兼容package.json的版本
- 如果package-lock.json和npm-shrinkwrap.json同时存在项目根目录下,package-lock.json将会被忽略
npm设计的依赖类型声明有以下几种:
- dependencies项目依赖----------------------------全部被下载,会部署在生成环境中
- devDependencies开发依赖-------------------------不会被自动下载,只在开发环境中使用
- peerDependencies同版本依赖-----------------------
- bundledDependencies捆绑依赖----------------------
- optionalDependencies可选依赖----------------------
并不是只有在dependencies中的模块才会被一起打包,也不是devDependencies中的依赖一定不会被打包,这取决于项目开发过程代码是否进行了相关的依赖引用。其实dependencies、devDependencies更多是个规范作用。
注意:在bundledDependencies中指定的依赖包必须在dependencies、devDependencies中声明过,否则在npm pack阶段会进行报错
peerDependencies主要用于:
- 插件不能单独运行
- 插件正确运行的前提是核心依赖库必须先下载安装
- 不希望核心依赖库被重复安装
- 插件API的设计必须要符合核心依赖库的插件编写规范
- 在项目中同一插进体系下,核心依赖库版本最好相同
最后,可以得到开发建议:
优先使用npm v5.4.2以上的npm版本,以保证npm的最基本先进性和稳定性
项目的第一次搭建使用npm install安装依赖包,并提交package.json、package-lock.json文件,而不提交node_moduels目录
其它项目成员首次checkout/clone项目代码后,执行一次npm install安装依赖包
对于升级依赖包的需求:
- 依靠npm update命令升级到新的小版本
- 依靠npm install@升级大版本
- 也可以手动修改package.json中的版本号,并执行npm install来升级版本
- 本地验证升级后新版本无问题,提交新的package.json、package-lock.json文件
对于降级依赖包的需求:执行npm install@命令,验证没有问题后,提交新的package.json、package-lock.json文件
删除某些依赖:
- 执行npm uninstall,验证没有问题后,提交新的package.json、package-lock.json文件
- 手动操作package.json删除依赖,执行npm install验证没有问题后,提交新的package.json、package-lock.json文件
任何团队提交package.json、package-lock.json文件,其他成员需要拉取更新代码,执行npm isntall更新依赖
任何时候都不要修改package-lock.json
如果package-lock.json出现冲突或问题,建议将本地package-lock.json文件删除,拉取远程的package-lock.json文件和package.json,再执行npm install命令
参考:《前端基础建设和架构设计30讲》