我有一个用 TypeScript 编写的依赖项。 依赖项包括 NPM 包中的源映射和原始源。 如果我在代码中设置断点,然后单步执行依赖项,它会正确地单步执行 TypeScript 而不是编译的 JavaScript。 但是,如果我在TypeScript代码中设置断点,然后启动我的应用程序,VSCode说
断点被忽略,因为找不到生成的代码(源映射问题?
如果我在进入依赖项后设置断点,一切正常。
我相信这里的问题是源映射是单向的,所以当我在 TypeScript 源文件中有一个断点时,它不知道它在 JavaScript 中的位置(这是通过节点调试器实际设置断点所必需的)。 一旦 JavaScript 文件打开,VSCode 就能够将两者匹配起来,现在断点就可以工作了。
所以问题是,我怎样才能使我的 TS 断点从启动开始工作,而不必先进入文件? 依赖项是许多文件,每次运行都必须重置断点是有问题的,特别是因为我正在调试的特定问题如果我花费的时间过长(超过几秒钟),就会遇到套接字连接超时。
我想要的是一种告诉 TypeScript 的方法,"在启动调试器时解析这些 JavaScript 文件并同步源映射,以便断点正确匹配"。
我知道一般功能是可用的,因为我可以通过 TypeScript 文件中的断点成功调试依赖项本身(我是依赖项的维护者)。 只是当它作为 NPM 模块加载时,似乎会丢失一些信息。
这正是launch.json文件中outFiles
属性的用途 - 将其设置为包含节点模块中的javascript文件(以及您自己的代码)的glob模式。调试适配器将查看这些文件以获取源映射引用,以便它可以立即解析 TS 文件中的断点。
例子:
"outFiles": [ "${workspaceRoot}/myOutFiles/**/*.js", "${workspaceRoot}/node_modules/**/*.js" ]
如果您只知道一组包含源映射的选定节点模块,则可以像这样提高性能:
"outFiles": [ "${workspaceRoot}/node_modules/{module_a,module_b}/**/*.js" ]
从本期: https://github.com/Microsoft/vscode-node-debug/issues/82#issuecomment-290642560