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

Nodejs Debugger misses out some property names on autocompletion in repl mode

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

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

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

> express.

此处,在 'express.' 之后,按 Tab 键自动完成不会列出 Router 选项,但会列出 hasOwnProperty, call, bind... 等节点内置属性。

express.Router

定义于

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

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

这是 express 导出 function 而不是标准 object 的副作用。例如

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

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

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

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