npm包基础知识


1.包的版本号

版本号格式:主版本号.次版本号.修订号
版本号递增规则如下:
1.主版本号:当你做了不兼容的 API 修改,
2.次版本号:当你做了向下兼容的功能性新增,
3.修订号:当你做了向下兼容的问题修正。

^(插入符) 和 ~(波浪符) 、*(星号符)的区别:

~ 会匹配最近的小版本依赖包,比如~1.2.3会匹配所有1.2.x版本,但是不包括1.3.0
^ 会匹配最新的大版本依赖包,比如^1.2.3会匹配所有1.x.x的包,包括1.3.0,但是不包括2.0.0
* 这意味着安装最新版本的依赖包
例子 范围 说明
^17.11.2 17.11.2 <= version < 18.0.0(17.x.x 且 >=17.11.2) 主版本号不变
~17.11.2 17.11.2 <= version < 17.12.0(17.11.x 且 >=17.11.2) 主版本号和次版本号都不变
17.11.2(=17.11.2) =17.11.2 安装指定的当前这个版本号
>17.11.2 >17.11.2 安装大于 17.11.2 的最新版本
<17.11.2 <17.11.2 安装小于 17.11.2 的最新版本

--save -dev 的区别

--save:将保存配置信息到package.json。默认为dependencies节点中。
--dev:将保存配置信息devDependencies节点中。
--save-dev:将保存配置信息到package.json的devDependencies节点中。

dependencies 和 devDependencies 的区别:

dependencies:运行时的依赖,发布后,即生产环境下还需要用的模块(生产依赖);
devDependencies:开发时的依赖。里面的模块是开发时用的,发布时用不到它(开发依赖)。

更多查看你真的理解 devDependencies 和 dependencies 的区别吗?

2.关于 package.jsonpackage-lock.json

要确保项目中所有依赖的版本一致,您可以采取以下几种方法:

1. 使用 package.jsonpackage-lock.json

在您的项目根目录中,package.jsonpackage-lock.json 文件用于管理依赖版本。确保在 package.json 中明确指定您希望使用的版本范围。例如:

{
    "dependencies": {
        "passport": "^0.6.0",
        "@nestjs/passport": "^10.0.0"
    }
}

在指定版本时,使用 ^ 表示允许小版本更新,但不允许大版本更新。您可以根据需要调整版本号。

2. 使用 npm install 来更新依赖

在修改了 package.json 后,运行以下命令来安装和更新依赖:

npm install

这将根据 package.json 中的版本范围安装所有依赖,并更新 package-lock.json 文件。

3. 利用 npm outdated 检查过时的依赖

您可以使用以下命令检查是否有过时的依赖:

npm outdated

此命令将列出所有过时的依赖及其当前版本、期望版本和最新版本。您可以根据输出结果决定是否需要更新某些依赖。

4. 使用 npm dedupe 优化依赖

如果您有多个依赖可能依赖于不同版本的同一包,您可以使用 npm dedupe 来优化依赖树,尽量减少重复的依赖:

npm dedupe

5. 使用 npm ci 安装依赖

如果您在持续集成(CI)环境中,您可以使用 npm ci 命令来确保安装的依赖版本与 package-lock.json 中锁定的版本完全一致:

npm ci

6. 使用工具来管理依赖

您还可以使用一些工具来帮助管理和锁定依赖版本,例如:

  • npm-check-updates:可以帮助您更新 package.json 中的依赖版本。
  • RenovateDependabot:可以自动检查和更新依赖版本。
npm-check-updates 自动升级依赖:
npx npm-check-updates -u
npm install

使用 npm 的 overrides 或 yarn 的 resolutions 强制锁定版本 ​​
如果你使用的是 npm(>=8.3.0),可以在 package.json 中增加 overrides 字段:

"overrides": {
  "brace-expansion": "1.1.11"
}

如果你使用 yarn,可以在 package.json 中增加 resolutions 字段:

"resolutions": {
  "brace-expansion": "1.1.11"
}

然后重新运行 npm installyarn install

7. 解决没有 package-lock.json 文件,npm i 更新的包,总是会下载最新的包,但又要求按照 package.json 版本号去下载

要确保 npm 按照package.json中的版本号精确安装依赖,并且生成/更新package-lock.json文件,可以按照以下步骤操作:

1. 强制生成 package-lock.json

如果你当前没有package-lock.json文件,可以通过以下命令强制生成:

npm install --package-lock-only

这会根据package.json中的版本范围生成精确的package-lock.json,但不会修改你的node_modules

2. 配置 npm 始终生成 package-lock.json

确保你的 npm 配置允许生成package-lock.json

npm config set package-lock true

或者在项目根目录创建.npmrc文件并添加:

package-lock=true

3. 锁定依赖版本

确保package.json中的依赖版本使用精确版本号(不带^~前缀):

// package.json(示例)
"dependencies": {
  "react": "18.2.0",       // 精确版本
  "vue": "3.3.4",          // 精确版本
  "axios": "1.4.0"         // 精确版本
}

如果你已经有带^~的版本号,可以使用npm install --save-exact重新安装:

npm install --save-exact  # 重新安装所有依赖并锁定版本

8.查看完整依赖树

npm ls inflight

结果如下 (示例):

your-project@1.0.0
└─┬ some-direct-dependency@2.0.0
  └─┬ another-dependency@3.0.0
    └── inflight@1.0.6 👈 问题依赖

9.检查已安装的依赖包是否存在已知的安全漏洞的命令

npm audit 是一个用于检查你的 Node.js 项目中已安装的依赖包是否存在已知的安全漏洞的命令。

注意: npm audit 需要连接到官方 npm 注册表的安全审计 API,但镜像源通常只同步包文件,不提供安全审计功能。

# 临时使用官方注册表执行审计
npm audit --registry=https://registry.npmjs.org

# 审计完成后,恢复原镜像(如果需要)
npm config set registry https://registry.npmmirror.com

永久配置镜像源选择规则:

# 创建或编辑 .npmrc 文件
echo "registry=https://registry.npmmirror.com" >> .npmrc
echo "audit-registry=https://registry.npmjs.org" >> .npmrc

当间接依赖(依赖的依赖)或更深层级的依赖引用有问题的包时,可以使用 overrides 强制指定版本,但可能会出现引用版本不兼容的问题。

{
    "name": "your-project",
    "version": "1.0.0",
    "overrides": {
        "inflight": "0.0.6" // 使用无问题的版本
    }
}

Yarn 用户需使用 resolutions 字段:

{
    "resolutions": {
        "inflight": "0.0.6"
    }
}

或是使用 npm audit fix --force 强制更新,但可能引入其他问题。

npm audit fix --force 是一个命令,用于在 Node.js 项目中自动修复依赖项中的安全漏洞。这个命令会强制更新相关的依赖包到可能不兼容的版本,因此在使用时需要小心。推荐优先使用 npm audit fix 来尝试自动修复,如果无法解决问题,再考虑使用 --force 选项。

npm audit fix  # 尝试自动修复(非破坏性更新)

以下是该命令的一些要点:

  1. 安全审计npm audit 会检查项目中的依赖项,并报告已知的安全漏洞。
  2. 自动修复npm audit fix 会根据报告的漏洞自动更新依赖项。
  3. 强制更新--force 选项会强制更新依赖项,即使这可能导致不兼容的版本。

在使用这个命令之前,建议先备份项目,确保可以恢复到之前的状态,避免因强制更新导致的潜在问题。


文章作者: 弈心
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 弈心 !
评论
  目录