本文部分内容由大模型生成
package-lock.json 是用来锁版本的,确保每次 npm install 的时候安装的依赖版本相同,避免安装更新的版本导致bug,这非常有用,可以防止生产构建发布时因为依赖版本不一致带来意外的bug和不怀好意的依赖库“投毒”。
但有时候针对一些依赖又想保持更新,比如省市区行政区划数据(个人比较喜欢使用 @vant/area-data ),这种数据需要经常更新,每次打包发布都更新到最新版本,保持最新的行政区划数据。那么这个库就不能锁版本。
1. 不使用 package-lock.json,通过 package.json 版本符号锁版本
先来简单认识一下 package.json 中安装的依赖版本符号对于锁版本的作用
-
锁版本:指定一个固定的版本号,不使用任何符号。例如:
"axios": "1.0.0"这表示完全锁定1.0.0版本,无论如何不会更新到更高版本。 -
不锁定 patch 版本(使用
~):使用~可以锁定主版本和次版本,但允许自动更新patch版本。例如:"axios": "~1.0.0",这将允许axios版本从1.0.0升级到1.0.x。 -
不锁定 minor 和 patch 版本(使用
^):使用^可以锁定主版本,但允许自动更新次版本和补丁版本。例如:"axios": "^1.0.0",这表示会自动升级1.x.x的版本,但不会升级到2.0.0。 -
不指定版本(完全动态):
"@vant/area-data": "latest",安装时会默认使用最新的版本。或者干脆不写版本号,这样也会默认安装最新版本:"@vant/area-data": ""
在不使用 package-lock.json 的情况下,如果想锁版本,就不使用任何符号,对于需要保持更新的依赖就使用符号或者完全动态。不使用 package-lock.json 还有一个好处, package-lock.json 不止会锁版本,还会锁镜像源地址,如果使用的是私服,私服地址换了就得删掉 package-lock.json 重新安装一遍,这时也可能触发依赖版本升级,与旧的 package-lock.json 版本就不一致了。
2. 使用 package-lock.json,在 package.json 配置 overrides/resolutions
这是最推荐的方法,因为它直接在 package.json 中配置,易于维护且自动化程度高。
- 使用
npm overrides(npm 8.3+ 版本可用)
overrides 字段允许指定特定依赖项的版本范围或标签,覆盖 package-lock.json 中的锁定版本。在安装依赖时,npm 会优先考虑 overrides 中的配置。
在 package.json 的 overrides 字段中,指定需要保持更新的依赖库及其版本范围。例如,希望 @vant/area-data 始终安装最新版本:
{
"name": "my-project",
"dependencies": {
"@vant/area-data": "^2.0.0" // 初始版本,可以随意填写
},
"overrides": {
"@vant/area-data": "latest" // 或指定版本范围,例如 "^2.0.0"
}
}
- 使用
yarn resolutions(Yarn 1.x 版本)
Yarn 1.x 提供了 resolutions 字段,功能类似于 npm 的 overrides。
resolutions 允许你覆盖特定依赖项的版本,包括嵌套依赖。
{
"name": "my-project",
"dependencies": {
"@vant/area-data": "^2.0.0"
},
"resolutions": {
"@vant/area-data": "latest" // 或指定版本范围
}
}
- 使用
pnpm.overrides
使用 pnpm 的话,通过配置 pnpm.overrides 可以覆盖特定依赖的版本。
{
"name": "my-project",
"dependencies": {
"@vant/area-data": "^2.0.0"
},
"pnpm": {
"overrides": {
"@vant/area-data": "latest"
}
}
}
3. 构建脚本中动态安装
可以在构建脚本中使用 npm install <package>@latest 动态安装最新版本的依赖。
{
"scripts": {
"build": "npm install @vant/area-data@latest && npm run build:vite"
}
}