'require'没有在node-inspector的repl的控制台选项卡中定义

我尝试过了

require('fs').writeFileSync('o.json', JSON.stringify(anObject)); 

进行debugging,我得到了RefrenceError: require is not defined.

这是奇怪的。 什么样的环境是没有require

在Node.js中, require函数没有全局定义。 当你需要一个模块时,它的源代码被一个带有几个参数的函数包装起来, require就是其中的一个:

 (function (exports, require, module, __filename, __dirname) {/* your code */ }); 

当您查看任何源文件的内容时,您可以在“节点检查器”中看到该包装器。

现在有两种不同的scheme来从Node Inspector的控制台评估代码:

  1. debugging过程正在运行。 expression式在全局上下文中进行评估,即只能访问全局定义的符号。 require不在其中。

  2. debugging过程在中断点暂停。 expression式在select堆栈框架的上下文中进行评估,并且也可以访问当前作用域中的所有variables(包括由外部函数通过闭包捕获的variables)。 但是:大多数函数不会调用require ,因此这个variables在任何闭包中都不会被捕获,并且您无法访问它。

我和一个Node核心开发人员聊了一下关于将require作为全局符号的简短聊天,因为它会简化Node Checker的注入代码,但是我的观点并不令人信服。

可以在节点检查器中使用require ,通过点击一个断点,其中'require'在范围内(使用NodeJS v0.10.25,node-inspector@0.7.0-2进行testing):

一个例子(Node的一个超级简单的2字节'REPL'):创build一个包含以下内容的文件(例如r.js ):

 0; 

然后使用

 $ node --debug-brk r.js 

并以通常的方式启动节点检查器和浏览器,

– 或者 – (使用NPM中的节点debugging模块)使用:

 $ node-debug r.js 

现在切换到浏览器中的节点检查器控制台,并validation是否确实定义了require ,然后执行以下操作:

 > typeof require; "function" > fs = require('fs'); undefined > fs.writeFileSync('bla.txt', 'blup'); undefined 

并validation该文件是否已写入您启动节点的目录中。

注意:node-inspector的浏览器部分可能会非常糟糕:当依次debugging不同的脚本时,我经常需要刷新(导致debugging器断开连接),然后重新启动Node,直到脚本在浏览器中正确显示。

PS这种方法与创build一个Perl'REPL'具有不可思议的相似性,即通过将其作为perl -de '0;'来运行它perl -de '0;' 巧合?

FWIW,只需从node-debug _mocha ,在断点处停下来,然后在右侧面板的调用堆栈中select最低帧,我就可以使用require()方法: require('fs')工作好的,但require('q')和其他已安装的模块没有,即使我指定了一个绝对path。 如果我遇到解决scheme,会回来。

require()在包含Node.js的所有CommonJS环境中实现,但不在浏览器的控制台中,这是node-inspector所基于的(具体而言是Blink开发人员工具):

 > require ReferenceError: require is not defined