launch.json 通过 env 字段或 envfile 注入环境变量,env 优先级高于 .env(除非 dotenv.config({override:true})),多环境建议抽离为独立 json 文件并用变量引用。

launch.json 里怎么传环境变量给 Node.js 进程
VSCode 的 launch.json 本身不执行 shell,所以不能直接写 NODE_ENV=production node app.js。它靠 env 字段注入环境变量,由调试器在启动进程时透传。
-
env是对象,键值对直接映射到子进程的process.env,比如"env": { "NODE_ENV": "staging", "API_BASE_URL": "https://api-stg.example.com" } - 变量值不会被 shell 解析,所以别指望
$HOME或$(pwd)自动展开;需要硬编码或用envFile配合预处理 - 如果同时用了
env和envFile,env里的键会覆盖envFile中同名项
多个环境共存时如何避免 launch.json 膨胀
一个项目常有 dev / staging / prod 三套配置,全堆在 configurations 数组里会导致维护困难。VSCode 支持用变量引用外部 JSON 文件,把环境变量抽离出来更可控。
- 新建
.vscode/env/dev.json、.vscode/env/prod.json等文件,内容只是纯{"NODE_ENV": "prod", "DEBUG": "app:*"} - 在
launch.json的某个 configuration 里写:"envFile": "${workspaceFolder}/.vscode/env/${command:AskForEnvironment}.json" - 配合插件(如
swydd: Command Variable)或自定义 task 实现交互式选择;否则就老实用多个 configuration + 手动切换
为什么改了 env 却没生效?常见失效场景
环境变量看似加进去了,但代码里读不到,大概率是启动路径或进程模型不对。
- 用
runtimeExecutable指向了全局node,但项目依赖本地node_modules/.bin/ts-node—— 此时实际执行的是包装脚本,原env可能被覆盖或忽略 - 启动命令设成了
program指向dist/index.js,但你忘了preLaunchTask编译,导致跑的还是旧代码,变量自然没体现 - Node.js 版本 ≥18.13 且启用了
--experimental-permission,部分环境变量会被权限系统拦截,需显式加--allow-env
和 .env 文件冲突时谁优先级高
如果你既在 launch.json 里配了 env,又在代码里用 dotenv 加载 .env,结果取决于加载时机。
-
dotenv.config()默认只加载不存在的 key,已有值不会被覆盖 —— 所以launch.json的env优先级更高 - 但若调用
dotenv.config({ override: true }),就会反过来把.env里的值刷掉launch.json注入的 - 注意:某些框架(如 Next.js)在构建期读取环境变量,调试时改
launch.json对已生成的.next目录无效,必须清缓存重编译
真正麻烦的不是怎么配,而是不同人本地运行时混用 dotenv、cross-env、shell export 和 launch.json,变量来源一多就理不清。建议团队统一约定:调试只认 launch.json + envFile,CI/CD 和部署走其他机制,别让本地配置污染线上语义。











