VSCode调试NestJS项目时代码修改后不生效如何解决
问题原因
从nodemon运行日志可直接定位核心问题:nodemon检测到文件变更重启后,实际执行的入口是./dist/main.js(提前编译好的JS产物),而非TS源码入口src/main.ts。
你虽然配置了ts-node/register做运行时TS转译,但该转译逻辑仅对运行时通过require引入的.ts文件生效。直接指定运行dist/main.js时,整个应用加载的都是dist目录下的旧编译产物,和src目录下修改后的TS源码完全无关。
断点能正常命中是因为编译产物生成了sourcemap,VSCode会把JS的执行位置映射回TS源码的对应行,造成“在调试TS源码”的错觉,实际执行的始终是旧的JS文件,自然看不到修改后的变量值。
常见触发这个问题的诱因有两个:
- launch.json里的
program字段配置的TS入口被nodemon覆盖,nodemon默认读取package.json里的main字段,而Nest项目默认main字段指向dist/main.js - 本地同时运行了
tsc --watch增量编译,dist目录的旧文件和ts-node的运行时转译逻辑冲突
解决方法
按顺序执行以下操作即可修复:
- 调整launch.json配置,将TS入口文件直接放到nodemon的启动参数中,避免被默认配置覆盖,同时开启sourcemap支持:
{ "version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "Debug Nest Framework", "runtimeExecutable": "nodemon", "runtimeArgs": [ "--nolazy", "-r", "ts-node/register", "--config", "nodemon-debug.json", "${workspaceFolder}/src/main.ts" ], "autoAttachChildProcesses": true, "restart": true, "sourceMaps": true } ] }
- 更新nodemon-debug.json配置,显式指定TS文件的执行命令,忽略dist目录避免误加载旧产物:
{ "watch": ["src"], "ext": "ts,js", "ignore": ["src/**/*.spec.ts", "dist"], "execMap": { "ts": "node --nolazy -r ts-node/register" } }
- 关闭本地正在运行的
tsc --watch进程(如有),删除项目下的dist目录清除旧编译缓存,重新启动VSCode调试。
修复后可通过nodemon控制台日志验证:启动命令中执行的入口文件应为src/main.ts而非dist/main.js,此时修改TS代码保存,nodemon重启后断点读取到的就是更新后的变量值。
内容的提问来源于stack exchange,提问作者M.Y.
相关产品推荐
相关产品推荐

