node.js - Visual Studio Code - 通过 TypeScript 调试 Node JS

标签 node.js debugging typescript visual-studio-code

我目前正在尝试从 Visual Studio Code 调试用 TypeScript 编写的 Node JS 应用程序,但我遇到了一些问题。 我的情况类似于此 question 中描述的情况

|-- .settings
|----- launch.json
|-- bin
|----- app.js
|----- app.js.map
|--src
|----- app.ts
|-- tsconfig.json

然后我有了 tsconfig.json 文件:

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "outDir": "bin",
        "rootDir": "src",
        "sourceMap": true
    }
}

app.ts:

console.log("Hello World!");

launch.json:

{
    "version": "0.1.0",
    "configurations": [
        {
            "name": "Launch type",
            "type": "node",
            "program": "src/app.ts",
            "stopOnEntry": false,
            "sourceMaps": true,
            "outDir": "bin"
        }
    ]
}

然后我从命令行手动编译项目

tsc

所以我在 bin 目录中得到了两个文件。我在 app.ts 上设置了一个断点,最后用 F5 运行解决方案,应用程序在正确的行开始和停止,但在 JS文件而不是 TS 一个:为什么???

我是在做错什么还是试图实现不可能的目标?

非常感谢您的帮助! :)

编辑

我刚刚在 GitHub 上分享了我的项目为了使事情变得更容易!可以的话就看看吧! :)

最佳答案

这是绝对有可能的。

最可能的原因是node.js无法使用生成的map.js文件定位到对应的ts文件。 您可以尝试在 tsconfig.json 中指定“sourceRoot”以指向您的项目的根目录:

sourceRoot: "/Users/SomeUser/projects/test"

就我个人而言,我更喜欢为此目的使用 gulp,在我的例子中它看起来像这样(注意 - 我在这里不通过使用 node.js 全局变量'__dirname'来硬核 sourceRoot 路径):

var ts = require('gulp-typescript');

gulp.task('build.js.dev', function() 
{
    var tsProject = ts.createProject('tsconfig.json');

    var tsResult = tsProject.src()
        .pipe(sourcemaps.init())   
        .pipe(ts(tsProject));  

    return merge([
        //Write definitions 
        //tsResult.dts.pipe(gulp.dest("bin")),
        //Write compiled js
        tsResult.js.pipe(sourcemaps.write("./", { sourceRoot: __dirname })).pipe(gulp.dest("bin"))]);
});

然后检查生成的 map.js 文件。它应该在开头包含类似以下行的内容:

"sources":["src/app.ts"]

最后:

"sourceRoot":"/Users/SomeUser/projects/test"

组合在一起时,它们必须指向您的 app.ts 文件的有效位置。如果不是 - 相应地调整 sourceRoot。

[编辑]

以下是项目中与您相同的部分(没有 gulp)——我可以在我的机器上进行调试。

启动.json:

{
    // Name of configuration; appears in the launch configuration drop down menu.
    "name": "Launch Server",
    // Type of configuration.
    "type": "node",
    // Workspace relative or absolute path to the program.
    "program": "${workspaceRoot}/src/app.ts",
    // Automatically stop program after launch.
    "stopOnEntry": false,
    // Command line arguments passed to the program.
    "args": [],
    // Workspace relative or absolute path to the working directory of the program being debugged. Default is the current workspace.
    "cwd": "${workspaceRoot}",
    // Workspace relative or absolute path to the runtime executable to be used. Default is the runtime executable on the PATH.
    "runtimeExecutable": null,
    // Optional arguments passed to the runtime executable.
    "runtimeArgs": ["--nolazy"],
    // Environment variables passed to the program.
    "env": {
        "NODE_ENV": "development"
    },
    // Use JavaScript source maps (if they exist).
    "sourceMaps": true,
    // If JavaScript source maps are enabled, the generated code is expected in this directory.
    "outDir": "${workspaceRoot}/bin",
    "request": "launch"
}

tsconfig.json:

{ 
    "compilerOptions": { 
        "emitDecoratorMetadata": true, 
        "experimentalDecorators": true,
        "moduleResolution": "node",
        "module": "commonjs", 
        "target": "es6",
        "sourceMap": true,
        "outDir": "bin",
        "declaration": true,
        "noImplicitAny": true
    },
    "exclude": [
        "node_modules",
        "bin",
        ".vscode",
        "typings/browser.d.ts",
        "typings/browser/**"
    ]
} 

并在 tasks.json 中构建任务:

{
    "version": "0.1.0",

    // The command is tsc. Assumes that tsc has been installed locally using npm install typescript
    "command": "${workspaceRoot}/node_modules/typescript/bin/tsc",

    // The command is a shell script
    "isShellCommand": true,

    // Show the output window only if unrecognized errors occur.
    "showOutput": "silent",

    // args is the HelloWorld program to compile.
    "args": [],

    // use the standard tsc problem matcher to find compile problems
    // in the output.
    "problemMatcher": "$tsc"
}

[编辑]

我对您的 git 存储库进行了以下小更新,以便能够在本地对其进行调试。

在根文件夹中添加 package.json,并指定 tsc 作为依赖项(我更喜欢本地安装):

{
  "name": "123",
  "namelower": "123",
  "version": "0.0.1",
  "private": true,
  "dependencies": {
  },
  "devDependencies": {
    "typescript": "latest"
  }
}

然后转到您的 git“stackoverflow”根文件夹并在命令提示符下运行:

npm install

将 tasks.json 中的“命令行”更改为:

"command": "${workspaceRoot}/node_modules/typescript/bin/tsc",

完成这些步骤并构建项目后,我能够在 app.ts 中放置一个断点,并且 VSCode 在运行时停止在其上 (F5)

[更新]

兼容windows的tasks.json版本:

{
    "version": "0.1.0",
    "command": "tsc",

    "showOutput": "always",

    "windows": {
        "command": "node.exe"
    },

    "args": ["${workspaceRoot}\\node_modules\\typescript\\bin\\tsc.js"],

    "problemMatcher": "$tsc"    
}

希望这对您有所帮助。

关于node.js - Visual Studio Code - 通过 TypeScript 调试 Node JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35606423/

相关文章:

angular - 无法在 Angular 构造函数或 OnInit 中放置断点

node.js - nodeJS,将文件移动到新文件夹

c - 矩阵计算器错误 - 无法正常工作

c# - .NET 4 : Can the managed code alone cause a heap corruption?

python - 什么决定了调试器的运行时性能

javascript - knockout 绑定(bind)仅适用于单向

mysql - 如何使用 Express 显示来自 mysql 的图像

javascript - 使用 node.js 将 JSON 从 AWS Lambda 保存到 AWS S3

javascript - 从 Meteor 运行 bash 脚本服务器端时出现问题

node.js - Typescript:入门问题(找不到模块 fs 并且找不到名称输入)