VSCode 热重载依赖 nodemon 实现,需用 attach 模式连接 --inspect-brk 启动的进程,并正确配置 watch 和 ignore 规则;进程级重启导致状态丢失是正常行为,非 bug。
VSCode 本身不实现热重载,真正起作用的是 nodemon —— 你得让它监听文件、重启进程,并让 VSCode 调试器稳定重连,否则改完代码只是白屏刷新或根本没反应。
很多人卡在 launch 模式下反复失败,本质是 VSCode 尝试直接“启动” nodemon,结果在 Windows 找不到 .bin/nodemon.cmd,macOS/Linux 又因 PATH 不一致报 spawn nodemon ENOENT。
npm run debug(对应 "debug": "nodemon --inspect-brk ./index.js")Debugger listening on ws://127.0.0.1:9229/
launch.json 中配 "request": "attach"、"port": 9229、"restart": true
processId 或 runtimeExecutable —— attach 模式不走启动流程,只管连上并自动重连没加 -brk,Node 进程一启动就跑过初始化逻辑(比如数据库连接、中间件注册),你设的断点根本来不及生效。VSCode 附加时进程早已执行完毕。
--inspect-brk 会让进程在第一行暂停,等 VSCode 附加完成再继续--inspect,且断点设在 require 后、app.listen() 前,大概率停不住默认情况下 nodemon 只监听 .js 和 .json,但你项目里可能有 .cjs、.mjs、.ts,甚至配置文件如 .env 改了也要重启。
--watch src(别依赖默认的当前目录)--ext js,json,cjs,mjs,ts
--ignore 'dist/**' --ignore 'node_modules/**'
--ignore "dist**" 可能失效,统一用正斜杠 --ignore "dist/**"
后端用 nodemon 是“进程级重启”,不是前端那种保留组件状态的 HMR。每次重启都会重新执行 require、重连数据库、重建内存缓存 —— 这不是 bug,是预期行为。
index.js 顶层写 db.connect(),应封装进函数并在 app.listen() 后调用const cache = new Map())每次重启都会新建,别指望跨重启复用