假设咱们安装 eslint:html
npm install --save-dev eslint
安装完后,在 package.json 里面生成以下模块版本:npm
{ "devDependencies": { "eslint": "^5.13.0" } }
而后你把 package.json 提交到代码库。过了一段时间,有新人加入到项目里面。他克隆出了代码,而后本地安装依赖包 npm install
。在他安装的时候 eslint 已经发布了新的版本5.16.0。那么新人本地安装的 eslint 版本就会变成5.16.0。这个机制意味着同一份 package.json 在不一样时间安装出来的依赖包有可能不同。可能形成的后果就是依赖不一致程序不 work(一种环境不一致致使的问题)。json
那么你说我把 package.json 里面的版本写死不就能够了吗?虽然这样,你项目的直接依赖版本固定了,可是你不能保证你安装的包本身也写死它的依赖,也就是说 eslint 模块依赖的包可能会随着时间升级。为了解决这个问题出现了 package-lock.json。当你 npm install 的时候,同时会生成一个 package-lock.json,这个文件记录了你运行 npm install 命令那一个时刻的模块依赖树(就是你安装的全部包的版本等信息)。当你把这个文件提交到代码库以后,其余人在其余时间克隆出代码再 npm install 的时候,npm 会看到有 package-lock.json 文件,那么就会按照其描述的依赖树安装包。也就是说经过这一个机制保证同一份 package.json 在不一样时间安装出的包依赖树是一致的。eslint
可是我要更新我依赖的包呢?当你使用 npm update 更新现有包,或者 npm install 安装新包后,若是改变了 package.json 那么 npm 同时会更新 package-lock.json。使 package.json 和 package-lock.json 保持某一时刻的一致。code
以上是现有 npm-v6.10.2 的机制,可是这个机制也是通过演化,一开始出来 package-lock.json 的时候,其行为并不彻底按上面的机制运行,具体历史能够看这个贴子:https://www.zhihu.com/questio...htm