AndreGeng/AndreGeng.github.io

package-lock.json vs shrinkwrap vs package.json

AndreGeng opened this issue · 1 comments

之前在项目中选用yarn时, 它最明显的两个特征就是

  • 并行下载
  • yarn.lock

随着npm@5的发布, npm也加入了package-lock.json, 这里简单来介绍下它与之前的npm shrinkwrap有什么不同.

为什么要lock依赖版本

虽然我们的npm包的依赖大都采用了semver, 理想情况下, 依赖在可控范围下的升级并不会break我们的库/应用, 但我们仍然不能保证它是100%可用的. 所以最有保证的手段还是要锁定依赖的版本.

为什么不直接在package.json里指定依赖的固定版本

这对于锁定版本来说意义不大, 因为一般我们直接依赖的包, 也可能会有基于semver的依赖包, 只锁定我们库/应用的直接依赖版本是不够的.

package-lock和shrinkwrap有什么不同

  • package-lock是在对node_modules/package.json有改动时, 自动生成的. 它的明显意义在于向用户证明, npm也是像yarn那样支持依赖版本锁定的.
  • 当发布到npm时, package-lock.json是不会被发布上去的(why? 因为通过不去强制 NPM 来安装特定的版本,您可以让 NPM 更好的复用包,并使结果更小更快地组合), 而npm-shrinkwrap.json是可以发布到npm上的.
  • 当package-lock和npm-shrinkwrap同时存在时, 会发生什么? npm-shrinkwrap优先级高于package-lock, 如果在项目中已经存在package-lock.json时, 运行npm shrinkwrap时, npm会把package-lock文件重命名为npm-shrinkwrap.json.

package-lock.json不被push到npm仓库, 不还是会存在依赖版本不一致的问题么?

额..是的. 这个算一种权衡的情况吧. 如果要100%避免这种问题, 请使用shrinkwrap.

reference:
([译] 理解 NPM 5 中的 lock 文件)[https://juejin.im/post/5943849aac502e006b84ce07]