'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的控制台评估代码:
-
debugging过程正在运行。 expression式在全局上下文中进行评估,即只能访问全局定义的符号。
require
不在其中。 -
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