直接改launch.json的env字段可注入环境变量,但需确保node进程按预期启动:env字段将键值对直接注入process.env,不支持shell展开,同名变量env优先级高于envfile,修改后须重启调试会话才生效。

直接改 launch.json 的 env 字段就能注入环境变量,但多数失效不是配置写错了,而是 Node 进程根本没按你设想的方式启动。
launch.json 里怎么传环境变量给 Node.js 进程
launch.json 不执行 shell 命令,所以不能写 NODE_ENV=production node app.js 这种形式。它靠 env 字段把键值对直接塞进子进程的 process.env。
-
"env": { "NODE_ENV": "staging", "API_BASE_URL": "https://api-stg.example.com" }是标准写法 - 变量值不支持 shell 展开,
$HOME、$(pwd)都不会被解析,必须硬编码或用envFile - 如果同时用了
env和envFile,env中同名 key 会覆盖envFile里的值
多环境共存时如何避免 launch.json 膨胀
把 dev/staging/prod 全堆在 configurations 数组里,很快就会变成维护噩梦。推荐抽离环境变量到独立 JSON 文件。
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- 新建
.vscode/env/dev.json、.vscode/env/prod.json,内容只是纯对象:{"NODE_ENV": "prod", "DEBUG": "app:*"} - 在某个 configuration 里写:
"envFile": "${workspaceFolder}/.vscode/env/${command:AskForEnvironment}.json" - 需要交互式选择就得装插件(如
swydd: Command Variable),否则老实用多个 configuration 手动切换
为什么改了 env 却没生效?常见失效场景
环境变量看似加进去了,代码里却读不到,问题往往不在配置本身。
- 用
runtimeExecutable指向全局node,但实际执行的是node_modules/.bin/ts-node包装脚本——原env可能被忽略 -
program指向dist/index.js,但没配preLaunchTask编译,跑的还是旧代码 - Node.js ≥18.13 启用了
--experimental-permission,部分环境变量会被拦截,得显式加--allow-env - 框架如 Next.js 在构建期读环境变量,调试时改
launch.json对已生成的.next目录无效,必须清缓存
.env 文件和 launch.json 的 env 冲突时谁优先级高
取决于 dotenv.config() 的调用时机和参数。
- 默认行为:
dotenv.config()只加载process.env中不存在的 key,所以launch.json的env优先级更高 - 若调用
dotenv.config({ override: true }),就会反过来用.env覆盖launch.json注入的值 - 注意:某些 CLI 工具(如
ts-node)会在启动时自动加载.env,可能绕过你的env配置
真正容易被忽略的是运行模型——你认为自己在调试一个 Express 应用,其实 program 指向的是 index.js,而 package.json 的 start 脚本实际执行的是 bin/www,中间差了一个入口层。










