【发布时间】: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