在vscode中调试node_modules目录中的代码

36

我有一个node_js项目,其中包含一些我们自己的node_js软件包。它们在npm私有仓库中,并且在node_modules文件夹中显示为:

@company/package_name

我们试图在这段代码中设置断点,但发现断点从未被触发。

我们认为可能存在一个默认的skipFile,排除了node_modules,并将其添加到了我们的launch.json文件中:

"skipFiles": ["!${workspaceRoot}/node_modules/**/*.js"]

毫无效果。

有没有关于如何在node_modules目录中启用调试的提示?


1
你找到了一种方法来做它吗? - Stephane
如果您从代码中调用库函数会发生什么? - Nick
@Nick 我发现当我尝试这样做时,VSCode不会进入它,而是跳过它。 - Steve Bennett
2个回答

38

虽然这是一个老问题,但如果有人仍然遇到此问题,可以使用VS Code调试node_module文件,方法是首先将node_module软链接到主项目,然后告诉VS Code使用该软链接。

软链接node_module软件包

如果您要在node_module软件包中工作,建议将其链接到主项目,以便您所做的更改同时应用于模块代码,因此,在编辑软件包完成后,您可以直接查看差异并提交它而不是从node_module内部复制粘贴并手动应用差异。

  1. 要将node_module中的软件包与项目链接,请首先在系统上克隆repo。
  2. 在目录内运行npm link
  3. 然后进入主项目,运行npm link package_name进行链接。

例如,如果您想要将软件包sample-node-module与使用sample-node-module作为其依赖项的项目sample-project链接起来,可以按以下方式操作:

cd sample-node-module
npm link
cd sample-project
npm link sample-node-module

请注意,在第二个link命令中输入克隆存储库的文件夹名称(而不是包名称本身)。 您不必提供完整路径。 您可以在此处了解更多信息。

告诉VS Code在调试时使用符号链接

完成上述步骤后,您只需将以下小配置添加到VS Code的launch.json中即可使其检测node_modules内部的断点:

{
"runtimeArgs": [
    "--preserve-symlinks"
]
}

有关此事的文档可以在这里找到。


3
嗨,Chris,如果这个答案解决了你的问题,请点赞并将其标记为“接受的答案”。谢谢 :) - The Doctor
1
肯定有更好的方法吧?我正在阅读关于debug.javascript.autoAttachSmartPattern的内容..还没有弄清楚,但如果可能的话,我想使用可配置的方式而不是玩弄符号链接。 - Flion
3
嘿@Flion,感谢您的回复并指出了新方法!正如您所看到的,这个答案本身已经超过2年了,在那时,这是我使用的方法。我看了一下您建议的内容,似乎可能有效,但由于我现在无法尝试您提出的建议,如果您可以写另一个答案或甚至更新此答案以包括该信息,那就太好了 :) - The Doctor
它不起作用,请建议 - Kid
我尝试了一下,看看是否可以帮助我的链接库,但是它没有起作用。可能也是路径问题?尝试理解在sourceMapPathOverrides中为链接模块设置正确路径的内容。 - spankmaster79
如果您使用的是 yarn,那么就与 npm 一样,只需使用 yarn 即可。 - Reza Bayat

0
问题可能在于源映射。尝试将node_modules/example-package文件添加到launch.json中的resolveSourceMapLocations,其中example-package是您想设置断点的模块目录:
"resolveSourceMapLocations": [
    "${workspaceFolder}/**",
    "!**/node_modules/**",
    "node_modules/example-package/**/*.js",
]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接