【问题标题】:VSCode: How to debug node.js dependency packages in TypeScriptVSCode:如何在 TypeScript 中调试 node.js 依赖包
【发布时间】:2023-02-18 09:56:16
【问题描述】:

假设我们有两个具有以下结构的 node.js 项目:

Foo 项目通过在其 package.json 中声明以下内容将 Bar 作为依赖项

{
    "scripts": {
        "start": "ts-node src/index.ts --transpile-only --no-lazy"
    },
    "dependencies": {
        "bar": "file:../Bar"
    }
}

我使用以下 launch.json 配置 VSCode 的调试器

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "start",
            "request": "launch",
            "runtimeArgs": [
                "start"
            ],
            "runtimeExecutable": "npm",
            "smartStep": true,
            "type": "node"
        }
    ]
}

问题是当我在调试过程中进入从 Bar 导入的函数时,它会进入临时编译的js源代替原始的 TypeScript 源代码,不管我定义Bar的包main入口为src/index.ts还是lib/index.js。此外,如果我在 Bar 的打字稿源中添加断点,它们甚至不会被加载。
如何让调试器加载 Bar 的断点,并在调试 Foo 时直接进入 TypeScript 源代码?我应该修改launch.json中的一些属性,还是在启动脚本中将更多选项传递给ts-node?
为了更好地说明这个问题,我将两个演示项目上传到 GitHub:StackOverflow-Demo

【问题讨论】:

  • 我很确定你不能为你的项目作为依赖加载的模块设置断点,但是,我不明白你为什么要这么做。模块被命名为模块,因为它们旨在被模块化。每个模块的状态、状态、质量、结构和设计应该与其他模块完全分开。换句话说,模块工作,或者不工作, 如果它不起作用那么问题应该只通过调试非工作模块来解决。如果两个模块不起作用,则应分别修复和调试它们。
  • 在另一个模块的上下文中调试模块有一个很好的理由,那就是测试模块,在这种情况下,您测试的模块应该与任何其他代码(可能包含另一个模块)一起添加到本地文件夹),需要对其进行测试,但这并不意味着要添加第二个 package.json 文件。
  • @jD3V 好吧,实际情况是我有一个数据库管理系统,它同时提供命令行界面和 HTTP 服务。它们共享大部分共同的逻辑,因此我将它们提取到一个单独的核心模块中作为它们的依赖项。而且我在生产中遇到了一些问题,所以我尝试就地调试,因为它更方便重现。

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


【解决方案1】:

您应该能够通过配置源地图来做到这一点。

参见 tsconfig 的 the sourceMap fieldthe inlineSourceMap field。另见VS Code's guide on Debugging TypeScript

来自the VS Code docs' section on "Mapping the output location"

如果生成(转译)的 JavaScript 文件不在其源旁边,您可以通过在启动配置中设置 outFiles 属性来帮助 VS Code 调试器找到它们。每当您在原始源中设置断点时,VS Code 都会尝试通过搜索 outFiles 中的 glob 模式指定的文件来查找生成的源。

【讨论】:

    猜你喜欢
    • 2017-05-29
    • 1970-01-01
    • 2016-02-05
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 2021-08-08
    • 1970-01-01
    相关资源
    最近更新 更多