版本5中,npm引入了 package-lock.json 文件。
该文件旨在跟踪被安装的每个软件包的确切版本,以便产品可以以相同的方式被100%复制。(即使软件包的维护者更新了软件包)

package.json 问题

在 package.json 中通常做了锁定大版本的操作,这样在每次 npm instll 的时候都会拉取依赖包大版本下的最新的版本。这种机制最大的一个缺点就是当有依赖包有小版本更新时,可能会出现协同开发者的依赖包不一致的问题。

package-lock.json

这解决了 package.json 一直尚未解决的特殊问题。在 package.json 中,可以使用 semver 表示法设置要升级到的版本(补丁版本或次版本),例如:

  • 如果写入的是~0.13.0 ,则只更新补丁版本:即 0.13.1可以,但 0.14.0 不可以
  • 如果写入的是 ^0.13.0 ,则要更新补丁版本和次版本:即 0.13.10.14.0、依次类推
  • 如果写入的是 0.13.0,则始终使用确切版本

补充说明:semver 是一种版本规范法,举例说明
在开发初期我们使用的vue版本声明定义 ‘vue: ^2.5.1’ ,某个阶段有新的开发加入我们团队,并且此时vue版本
已经升级到’2.6.1’,那么当他执行 npm install 时会根据 semver 版本规则安装版本,将会是
vue ^2.5.1 >= 2.5.1 <3.0.0。npm会选择安装 2.6.1 ,因为它在匹配版本范围内,且是最新的vue2版本,

  1. "devDependencies": {
  2. "fibers": ">= 3.1.1 <5.0.0",
  3. "sass": "^1.26.5",
  4. "sass-loader": "^8.0.2",
  5. "vue": "^2.6.11",
  6. "vue-router": "^3.2.0",
  7. "vue-template-compiler": "^2.6.11",
  8. "vuex": "^3.4.0"
  9. }

package-lock.json 会固化当前安装的每个软件包的版本,当运行 npm install 时,npm 会使用这些确切的版本。相当于精确描述了 node_modules 目录下所有的包的树状依赖结构。 package-lock.json 文件需要被提交到Git仓库。
当运行 npm update 时,package-lock.json 文件中的依赖的版本会被更新。

相关文章
https://static.kancloud.cn/cyyspring/webpack/2304899
https://stackoverflow.com/questions/44297803/what-is-the-role-of-the-package-lock-json
http://nodejs.cn/learn/the-package-lock-json-file