根本原因是vscode默认使用powershell而非cmd,而powershell不识别cmd语法(如set)且环境变量注入机制与npm脚本冲突;应统一用cross-env并确保其为devdependencies、终端配置正确、调试时显式声明env字段。

VSCode 内置终端执行 npm run 脚本时,Windows 上常出现 cross-env 失效、set NODE_ENV=production 报错或环境变量被 PowerShell 自动转义——根本原因不是脚本写错了,而是 VSCode 默认终端 shell 和 npm 的环境变量注入机制打架。
为什么 npm run build 在 VSCode 里报 The term 'set' is not recognized
VSCode 默认在 Windows 上启用 PowerShell(而非 cmd),而 package.json 中的脚本若写成 "build": "set NODE_ENV=production && webpack",PowerShell 不识别 set 命令(它是 cmd 语法)。npm 本身不负责跨 shell 兼容,它只是原样把命令丢给当前 shell 执行。
- 检查当前终端类型:
echo $PSVersionTable.PSVersion(有输出就是 PowerShell) - 临时切回 cmd:右键终端标签 → “Select Default Profile” → 选
Command Prompt - 更稳妥的做法是避免 shell 内置命令,改用
cross-env:"build": "cross-env NODE_ENV=production webpack" - 注意:
cross-env必须已安装(npm install --save-dev cross-env),且不能只装在全局
cross-env 在 VSCode 中失效的三个常见原因
装了 cross-env 却仍读不到 NODE_ENV,大概率是执行上下文没对上——npm 脚本启动子进程时,环境变量传递可能被 VSCode 或 shell 拦截。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- 确认
cross-env是devDependencies,且npm install已成功执行(node_modules/.bin/cross-env存在) - VSCode 设置中禁用
terminal.integrated.env.windows的手动覆盖(如有配置,会覆盖脚本注入的环境变量) - 如果用了
npm-run-all或concurrently,确保它们调用的是cross-env而非直接拼接字符串(例如不要写concurrently "set NODE_ENV=dev && nodemon" "webpack")
VSCode 启动调试时 process.env 为空?检查 launch.json 的 env 字段
调试 Node.js 时,VSCode 不继承终端环境变量,必须显式声明。即使 npm run dev 能读到 NODE_ENV,F5 启动的调试器默认一个干净环境。
- 在
.vscode/launch.json的配置项里加"env": { "NODE_ENV": "development" } - 如需动态读取
.env文件,不能依赖dotenv自动加载(因为调试器不跑 npm 脚本),得在入口文件顶部手动require('dotenv').config() - 注意:
env字段值不会被 shell 解析,所以不能写"NODE_ENV": "$npm_package_config_env"这类变量引用
真正麻烦的不是怎么设变量,而是同一个 package.json 脚本在终端、CI、VSCode 调试器里走的是三套环境注入路径;跨平台团队协作时,cross-env 只解决一半问题,剩下一半得靠统一终端配置和明确区分“运行”与“调试”的环境来源。










