首页 > 解决方案 > 使用 Visual Studio Code 调试 Node.js 依赖项,它是“require”d

问题描述

我想使用 VSC 为现有项目开发一些扩展。特别是 UglifyJS3。

所以我创建了一个测试脚本,在其中我调用模块来测试和调试我的更改。那里的代码很简单:

var UglifyJS = require("../tools/node");
var result = UglifyJS.minify(code, ...)

这在调试/单步执行时有效。但是 VSC 已经无法解析 UglifyJS 导出的缩小功能。
我也不能简单地在 UglifyJS 文件中设置断点并触发它们。VSC 在启动时显示关于无法解析断点的错误。

看着../tools/node.js我看到的代码如下:

var UglifyJS = exports;
require.resolve("../lib/utils.js")
...
require.resolve("../lib/minify.js")
require.resolve("./exports.js")

exports.js包含exports["minify"] = minify;.

有什么我错过的吗?如何使调试(以及可选的 IntelliSense)工作?

标签: node.jsdebuggingvisual-studio-code

解决方案


我找到了原因:

第一个线索是代码在调试器中显示为<eval>选项VM<some number>卡。所以不知何故,代码实际上并不是从文件中读取的,而是动态评估的。

会发生什么(对于一个简化的例子):

var fn = require.resolve("<file>"); // Resolve the filename
var code = fs.readFileSync(fn, "utf8");; // Read the file contents
new Function("exports", code)(exports); // Create a new function containing the files code and execute it

最后一点在代码中有点神秘,new Function对我来说是新的(不是双关语)。它本质上归结为eval具有严格模式兼容性的优化:https ://whereswalden.com/2011/01/10/new-es5-strict-mode-support-new-vars-created-by-strict-mode-eval -code-are-local-to-that-c​​ode-only/

因此:执行的代码实际上是经过评估的代码,而不是文件本身。

解决方案:要么使用它,要么在上游将其更改为“干净”模块。


推荐阅读