如何在npm scripts中使用package.json的npm config变量简化重复node参数
解决方案汇总
方案1:通过NODE_OPTIONS环境变量统一注入参数(最推荐)
Node运行时会自动读取NODE_OPTIONS环境变量中的全局参数,所有调用Node的场景都会自动生效,无需每个脚本重复声明。
推荐配合cross-env包实现跨平台兼容(Windows/类Unix系统都支持):
- 先安装依赖:
npm i cross-env -D
- 配置package.json:
{ "scripts": { "node:base": "cross-env NODE_OPTIONS=\"--use_strict -r dotenv/config --experimental-vm-modules\"", "test": "npm run node:base -- jest", "testwatch": "npm run node:base -- jest --watchAll", "start": "npm run node:base -- node ./src/index" } }
脚本中--后面的内容会作为参数传递给前置的基础命令,参数会自动拼接生效。
方案2:通过npm内置变量复用公共参数
npm支持在package.json的config字段定义自定义变量,在scripts中可以直接引用:
{ "config": { "nodeCommonArgs": "--use_strict -r dotenv/config --experimental-vm-modules" }, "scripts": { "test": "node $npm_package_config_nodeCommonArgs node_modules/.bin/jest", "testwatch": "node $npm_package_config_nodeCommonArgs node_modules/.bin/jest --watchAll", "start": "node $npm_package_config_nodeCommonArgs ./src/index" } }
注意:该方案在Windows cmd环境下不支持$变量语法,需要在WSL、Git Bash或者配合cross-env使用。
方案3:封装公共执行脚本
可以把公共的Node启动逻辑封装为独立的shell脚本,进一步简化配置:
- 项目根目录新建
run.sh(类Unix系统)内容如下:
#!/bin/bash node --use_strict -r dotenv/config --experimental-vm-modules "$@"
- 给脚本添加执行权限:
chmod +x run.sh
- 配置package.json scripts:
{ "scripts": { "test": "./run.sh node_modules/.bin/jest", "testwatch": "./run.sh node_modules/.bin/jest --watchAll", "start": "./run.sh ./src/index" } }
Windows系统可以对应写run.cmd批处理脚本实现相同逻辑。
额外优化建议
部分参数可以下沉到对应工具的配置文件中,进一步减少Node启动参数:
- 针对jest的
--experimental-vm-modules参数,jest 28+版本支持在jest.config.js中配置experimentalVmModules: true实现相同效果 - dotenv的加载逻辑可以写到入口文件顶部第一行
require('dotenv').config(),无需通过-r参数加载
内容的提问来源于stack exchange,提问作者cj-2307
相关产品推荐
相关产品推荐

