package-lock.json 有什么用
2023-07-28 23:11:06
package/pnpm-lock.json 或者 yarn.lock 是用以锁定版本号,保证开发环境与生产环境的一致性,避免出现不兼容 API 导致生产环境报错。
在这个问题之前我们先说一下 semver 规范
semver
semver 是一个语义化的版本规范,我们常见的一个包的版本大概这样 1.2.3,他是按照一个规范来更改包的版本。
版本格式:主版本号.次版本号.修订号
版本号更新规则:
- 主版本号(major):当你做了不兼容的 API 修改(breaking change)
- 次版本号(minor):当你做了向下兼容的功能性新增
- 修订号(patch):当你做了向下兼容的问题修正
比如 Vue2 升级到了 Vue3,是一次大版本更新,在 Vue3 中一些老的 API 就不再兼容
对于 ~1.2.3,那么它的意思是指 1.2.3 <= 可下载的版本号 < 1.3.0
对于 ^1.2.3,那么它的意思是指 1.2.3 <= 可下载的版本号 < 2.0.0
问题
当我们在执行 npm install
去下载依赖时,有些依赖的版本是以 ^ 开头的,为了最大限度的使用新特性。
比如一个依赖的版本号为 ^1.2.3,那么它的意思是指 1.2.3 <= 可下载的版本号 < 2.0.0。
那么当我们首次安装一个依赖时,依赖的最新版本为 1.2.3,在我们的 package.json 中显示的是 ^1.2.3,下载的依赖的版本也是 1.2.3,那此时这样是没有问题的
但是当我们不断的开发一段时间后,依赖的最新版本已经迭代到了 1.8.9,但是在的 package.json 中显示的仍然是 ^1.2.3,那么我们现在再去下载依赖,而我们下载依赖的实际版本是 1.8.9,但是如果在这个过程中,依赖的开发者没有遵循 semver 规范,在没有改动主版本号的情况下就引入了一些 breaking change,那么到了生产环境产生的 bug 将很难调试。
lock 的作用
当有了 lock 文件时,每一个依赖的版本号都被锁死在了 lock 文件,每次依赖安装的版本号都从 lock 文件中进行获取,避免了不可测的依赖风险。
首次在开发环境安装依赖,此时最新版本 1.2.3,package.json 中显示 ^1.2.3,实际安装版本为 1.2.3,此时在 lock 中被锁定版本号
在生产环境中上线项目,安装依赖,此时依赖的最新版本已经迭代到了 1.8.9,此时 lock 文件中版本号为 1.2.3,符合 package.json 中 ^1.2.3 的范围,将在生产环境安装 1.2.3 版本的依赖,完美解决