如何在 package.json 中指定 Node.js 版本要求
package.json 的 engines.node 声明支持的 Node 范围,npm 默认警告;engine-strict 可加强安装检查。说明版本文件、包管理器和 Corepack 的适用边界。
一句话回答:在 package.json 里加 engines 字段:{"engines": {"node": ">=22.0.0 <25"}},版本范围遵循 semver 规则(如 ^22 或 >=22 <25;仅声明 CI 验证过的范围)。但要注意:npm 默认只警告不拦截,想严格执行需加 .npmrc 里 engine-strict=true;再配一个 .nvmrc 文件让 nvm/fnm 用户自动切版本。
基本配置
{
"engines": {
"node": ">=22.0.0 <25",
"npm": ">=9.0.0"
}
}
版本写法与 dependencies 一致:>=22 <25、^22.0.0、22.x || 24.x。
让约束真正生效
npm 默认只是提醒。 强制执行要加项目级 .npmrc:
engine-strict=true
之后 Node 版本不符时 npm install 直接报错退出。
pnpm 对当前项目自身的 engines 不兼容会报错,依赖包的严格检查还受 engineStrict 等设置影响;配置位置随 pnpm 主版本变化。Yarn Classic 与新版 Yarn 行为也不同,不能一概而论。
配套:自动切换版本
engines 只负责"拦",开发者体验还要配"自动切":
# .nvmrc(nvm/fnm 使用;Volta 使用 package.json 的 volta 字段)
24
fnm 配 --use-on-cd、nvm 配 shell hook 后,进目录自动切到 24。
发布平台的行为
- 托管构建平台:支持的版本与 engines、版本文件、控制台配置的优先级不同,按对应平台文档核对
- Heroku:同样认 engines
- Docker:镜像标签(
FROM node:24)与 engines 保持一致,CI 里可加一步校验
常见问题(FAQ)
Q:写了 engines 同事照样用错的版本装依赖?
A:多半没开 engine-strict。npm 的默认行为是 warn;加了 .npmrc 的 engine-strict=true 才会 fail。pnpm 应按使用的主版本配置 engineStrict;不要假定它忽略所有 .npmrc,也不要把当前项目与依赖包的行为混淆。
Q:类库(library)项目要不要写 engines?
A:要,而且范围应该宽一些(以实际测试与维护的版本范围为准)——你的使用者环境各异。应用项目则可以精确些。CI 里用矩阵跑多个 Node 版本验证声明的范围真实可用。
Q:能限制包管理器本身吗?
A:可以。"packageManager": "pnpm@9.0.0" 可交给已安装并启用的 Corepack 管理。Corepack 曾随部分 Node 版本分发,但 Node 25 起不再捆绑;该字段本身不保证阻止所有直接运行的包管理器,CI 仍需验证。
参考资料
本文依据官方资料核对,未进行现场运行测试;代码与配置示例需结合实际版本、权限和环境验证。