VSCode调试时ts-node/register执行旧编译JS而非指定TS文件
在Visual Studio Code的TypeScript项目中,使用以下launch.json配置调试Azure DevOps流水线任务扩展:
{ "version": "0.2.0", "configurations": [ { "name": "Launch task", "type": "node", "request": "launch", "program": "${workspaceFolder}/src/index.ts", "cwd": "${workspaceFolder}/src", "runtimeArgs": [ "-r", "ts-node/register" ], "env": { "NODE_ENV": "development" }, "sourceMaps": true } ] }
项目通过NPM脚本打包,tsconfig.json配置将编译后的JS文件输出到./bin目录:
{ "compilerOptions": { "target": "es6", "module": "commonjs", "sourceMap": true, "outDir": "./bin", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true } }
打包后修改TS源码,运行调试配置时,实际执行的是bin目录下的旧index.js而非src/index.ts,调试控制台显示:
C:\Program Files\nodejs\node.exe -r ts-node/register ...\bin\index.js
删除bin目录后才会正常执行src/index.ts:
C:\Program Files\nodejs\node.exe -r ts-node/register .\index.ts
需要找到配置或CLI选项,强制ts-node重新编译源码,避免调试旧版本代码。
1. 让ts-node忽略编译输出目录
在项目根目录创建ts-node.json配置文件,指定忽略bin目录,让ts-node直接跳过该目录下的文件,优先加载TS源码:
{ "skipIgnore": false, "ignore": ["bin/**/*"] }
也可以直接在launch.json的runtimeArgs中添加忽略参数:
"runtimeArgs": [ "-r", "ts-node/register", "--ignore", "bin/**/*" ]
2. 禁用ts-node的文件缓存
ts-node默认会缓存编译后的JS文件,添加--no-cache参数可强制每次调试都重新编译:
修改launch.json的runtimeArgs:
"runtimeArgs": [ "-r", "ts-node/register", "--no-cache" ]
如果不需要类型检查以提升调试速度,可搭配transpile-only模式:
"runtimeArgs": [ "-r", "ts-node/register/transpile-only", "--no-cache" ]
3. 强制优先加载TS文件
在runtimeArgs中添加--prefer-ts-exts参数,让ts-node优先选择.ts文件,即使存在同名的.js文件:
{ "program": "./index.ts", "cwd": "${workspaceFolder}/src", "runtimeArgs": [ "-r", "ts-node/register", "--prefer-ts-exts" ] }
4. 调试前自动清理旧编译文件
在package.json中添加清理脚本,调试前自动删除bin目录:
{ "scripts": { "clean": "rimraf bin", "debug": "npm run clean && code --launch 'Launch task'" } }
之后通过npm run debug启动调试,确保每次调试都基于最新源码。
内容的提问来源于stack exchange,提问作者Xerillio

