nodemon配合vscode调试器是最稳最轻量的热重载方案,但需解决路径监听、扩展名声明、子进程干扰和调试协议错位四问题:①用--watch和--ext显式指定目录与文件类型;②禁用autoattachchildprocesses;③type设为pwa-node且skipfiles路径正确;④--inspect-brk等参数必须放runtimeargs而非args。

直接用 nodemon 配合 VSCode 调试器是当前最稳、最轻量的热重载方案,但默认配置几乎必然失效——问题不在工具本身,而在路径监听范围、扩展名声明、子进程干扰和调试协议错位这四个点上。
nodemon 不重启?检查 --watch 和 --ext 是否覆盖真实变更路径
nodemon 默认只监听 .js、.mjs、.cjs 和被 require() 的 .json,其他配置文件(如 .env、config.yml)完全不感知。
- 监听
.env:必须加--ext js,json,env;Windows 下大小写敏感,.ENV≠.env - 监听
config/default.yaml:补上yml或yaml,即--ext js,json,env,yml -
--watch必须显式包含配置文件所在目录,比如配置在config/下,就得写--watch config,不能只写--watch src - 多个目录用多个
--watch:例如--watch src --watch config --watch .env,避免用--watch .导致日志轮转误触发重启
VSCode 断点失效或 CPU 狂飙?关掉 autoAttachChildProcesses
VSCode 默认开启 autoAttachChildProcesses,只要你的代码调用 child_process.spawn、execa 或某些日志库的异步写入,它就会为每个子进程附加一个调试代理——不是卡,是主动制造高负载。
- 在
launch.json的 configuration 中加"autoAttachChildProcesses": false - 若真需调试子进程,改用手动 attach:子进程启动时加
--inspect=9230,再新建一个attach类型配置,端口对齐即可 - 搭配
"console": "integratedTerminal"时,子进程输出可能被吞掉,临时排查可设"externalConsole": true
热重载后断点跳不到源码?确认 type 是 pwa-node 且 skipFiles 路径写对
旧版 "type": "node" 不支持现代 V8 调试协议,skipFiles 在它身上基本无效;而路径写错(比如带 ./ 或 ${workspaceFolder})会让规则完全不匹配。
- 确保
launch.json中"type": "pwa-node"(不是"node") -
skipFiles必须用相对路径模式:"node_modules/**"✅,"./node_modules/**"❌,"${workspaceFolder}/node_modules/**"❌ - 规则顺序敏感:
"**"放第一位会吃掉所有后续规则,"<node_internals>/**"</node_internals>应放在前面,"node_modules/**"紧随其后 - Windows 下统一用正斜杠:
"node_modules/**"✅,"node_modules\**"❌
--inspect-brk 没生效?runtimeArgs 和 args 别混用
VSCode 里 args 是传给你的 JS 脚本的参数(比如 ["--port", "3000"]),而 runtimeArgs 才是传给 node 进程本身的标志(如 --inspect-brk、--prof)。放错位置,Chrome 就连不上,profile 日志也根本不会生成。
- 正确写法:
"runtimeArgs": ["--inspect-brk", "${workspaceFolder}/server.js"] - 错误写法:把
--inspect-brk塞进args数组里 - 如果用
nodemon启动,runtimeExecutable应指向nodemon可执行文件,runtimeArgs则是nodemon的参数,例如:["--inspect-brk", "server.js"] - ESM 项目要额外加
--experimental-specifier-resolution=node,否则import语句会报错
最易被忽略的一点:nodemon 的热重载本质是冷重启,V8 JIT 优化在调试模式下默认被禁用,所以你看到的性能数据和生产环境差很远——这不是配置能绕过的限制,而是调试器本身的代价。











