【问题标题】:Use Visual Studio Code to debug Node.js dependency which is "require"d使用 Visual Studio Code 调试 Node.js 依赖项,它是“require”d
【发布时间】:2018-06-08 19:56:17
【问题描述】:

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

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

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

这在调试/单步执行时有效。但是 VSC 已经无法解析 UglifyJS 导出的 minify 函数。
我也不能简单地在 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.js debugging visual-studio-code


    【解决方案1】:

    我找到原因了:

    第一个线索是代码在调试器中显示为<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 对我来说是新的(不是双关语)。它本质上归结为具有严格模式兼容性的优化evalhttps://whereswalden.com/2011/01/10/new-es5-strict-mode-support-new-vars-created-by-strict-mode-eval-code-are-local-to-that-code-only/

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-15
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-11
      • 2018-01-23
      • 1970-01-01
      相关资源
      最近更新 更多