package-lock.json 如何让某些依赖库不锁版本

1,220 阅读3分钟

本文部分内容由大模型生成

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.jsonoverrides 字段中,指定需要保持更新的依赖库及其版本范围。例如,希望 @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"
  }
}