关于对package-lock.json的理解

1,329 阅读3分钟

关于对package-lock.json的理解

  1. 什么情况下会产生package-lock.json文件

    在npm 5+版本上,用npm install 项目会自动生成lock文件,用来记录每个依赖确切的版本,确保团队中每个下载该项目的依赖的版本都是统一的,以访后续因为依赖的版本号不同而导致的bug,之前就遇到过因为版本不同导致的bug。到此会有一个问题,我们都知道我们是通过package.json去下载依赖的,那上面不就有确切的版本号了吗?那么我们看下我们package.json文件

    image.png

    每个版本号都有三个数字分别是 主版本号.次版本号.修订号 如果没有符号说明,就是确切版本 这里有两种符号,^ ~(通过npm下载下来的都是默认^符号的,最低版本就是我们目前看到的) npm会默 认下载当前范围内最新版本

    ^:更新的依赖会保证主版本号是一样的,也是就1.xx.xx。
    ~:更新的版本保证主版本号,次版本号是一样的,也就是1.10.xx。
  2. package-lock.json和package.json的关系

    举个栗子:

    假设你之前安装这个依赖的版本刚好是1.10.7,然后过了一段时间这个包的作者更新版本添加了新的版本 1.11.0,这个时候来了一个新同事她用npm install下载依赖的时候,根据上面说的,那这时他下载的版本号就是1.11.0,虽然大部分是没有产生问题的,但是为了避免日后产生问题,我们还是应该规范所有的依赖版本都是一致的。

    那么有人说为什么不直接写死呢,我们看下图

image.png

image.png

有一种情况是就是我们的依赖包里可能也需要这个依赖,但是它里面的版本并不是写死的 所以我们又要保证我们的依赖版本是相同又不能写死的

这时我们的package-lock.json就发挥作用了!

image.png

我们可以看出每个依赖都有一个确切的版本,当我们npm install的时候就会找到对应的版本号下载,如果package-lock.json找不到的话,就能下载最新的版本号然后更新到这里,这样就能保证团队中每一个的依赖的版本号都是统一的。所以,

这个文件是要提交到git仓库并且不能更改!!

那么,如果我们想更新某一个插件的版本号,我们又要怎么做呢?

我们如果直接在package.json直接修改版本号,如果此时lock文件里的版本是兼容你目前这个版本,那么lock文件是不会更新的,(我的理解就是如果你更新的这个版本比lock低都不会更新)它还是会根据package-lock.json去下载。 而是要用npm install xx@版本号,这样对应的package-lock.json也会相应的更改。

如果是用yarn更新依赖,它的更新机制是对比yarn.lock和package.json,如果不一致,就重新下载符合范围内的最新版本!