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.json
和 package-lock.json
要确保项目中所有依赖的版本一致,您可以采取以下几种方法:
1. 使用 package.json
和 package-lock.json
在您的项目根目录中,package.json
和 package-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
中的依赖版本。 - Renovate 或 Dependabot:可以自动检查和更新依赖版本。
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 install
或 yarn 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 # 尝试自动修复(非破坏性更新)
以下是该命令的一些要点:
- 安全审计:
npm audit
会检查项目中的依赖项,并报告已知的安全漏洞。 - 自动修复:
npm audit fix
会根据报告的漏洞自动更新依赖项。 - 强制更新:
--force
选项会强制更新依赖项,即使这可能导致不兼容的版本。
在使用这个命令之前,建议先备份项目,确保可以恢复到之前的状态,避免因强制更新导致的潜在问题。