Nodejs 调试器在 repl 模式下自动完成时会遗漏一些属性名称


var express    = require('express'); 
Debugger;
var router = express.Router();

在节点调试器中,当控件在第二行停止时,我这样做,

debug> repl
Press Ctrl + C to leave debug repl
> express
[Function]
> express.

在这里,在"express."之后,按 Tab 进行自动完成不会列出路由器选项,但存在节点内置属性(如hasOwnProperty, call, bind...)。

express.Router

定义于

`node_modules/express/lib/router/index.js`.

我明白了,没有理由此属性可能不是表达式对象的一部分。总之,节点调试器自动完成不会列出表达式对象的所有属性。

这是

快递导出function而不是标准object这一事实的副作用。

module.exports = function(){ ...}
module.exports.Router = Router;

这一切都归结为 Node 源代码中的这一行,最终基本上是说 "if autocompleting a function, treat it like a simple anonymous function" ,因此它没有任何额外的属性。

环形交叉路口代码的原因是,当您运行 node debug ... 时,您实际上是在启动两个节点进程,一个运行您的代码,另一个运行调试器。这意味着,当您自动完成时,调试器进程必须向正在调试的进程发送一条消息,询问信息,然后它必须将其转换回您可以呈现为自动完成的内容。

查看节点核心源,我有根据的猜测是,这简直是最简单的事情。调试器的当前体系结构试图尽可能隐藏调试器实现,但这意味着自动完成器不知道它正在处理伪造的对象副本,调试器也不知道我们正在自动完成。这样做的缺点是,它试图在处理自动完成之前递归复制整个对象,这意味着它会执行代价高昂的递归操作,然后简单地丢弃结果。不幸的是,添加函数属性递归使自动完成在我一分钟前的快速测试中非常慢。

最新更新