如何检查脚本是否在Node.js下运行?
2022-08-30 01:53:22
我有一个来自Node.js脚本的脚本,我想让它保持JavaScript引擎的独立性。
例如,我只想在 Node.js 下运行时执行操作。如何执行此测试?exports.x = y;
在发布这个问题时,我不知道Node.js模块功能是基于CommonJS的。
对于我给出的具体例子,一个更准确的问题是:
脚本如何判断它是否已被要求作为CommonJS模块?
我有一个来自Node.js脚本的脚本,我想让它保持JavaScript引擎的独立性。
例如,我只想在 Node.js 下运行时执行操作。如何执行此测试?exports.x = y;
在发布这个问题时,我不知道Node.js模块功能是基于CommonJS的。
对于我给出的具体例子,一个更准确的问题是:
脚本如何判断它是否已被要求作为CommonJS模块?
好吧,没有可靠的方法来检测Node中的运行.js因为每个网站都可以轻松声明相同的变量,但是,由于Node中没有对象.js默认情况下,您可以反其道而行之,检查您是否在浏览器中运行。window
这就是我用于应该在浏览器和Node下工作的libs.js:
if (typeof window === 'undefined') {
exports.foo = {};
} else {
window.foo = {};
}
在 Node 中定义的情况下,它仍然可能会爆炸.js但是没有充分的理由让某人这样做,因为您明确需要省略或设置对象的属性。window
var
global
编辑
要检测您的脚本是否需要作为CommonJS模块,这同样不容易。commonJS唯一指定的是A:模块将通过调用函数和B:模块通过对象上的属性导出内容。现在,如何实现它留给底层系统。Node.js将模块的内容包装在匿名函数中:require
exports
function (exports, require, module, __filename, __dirname) {
请参见: https://github.com/ry/node/blob/master/src/node.js#L325
但是不要试图通过一些疯狂的东西来检测它,而只是使用我上面的示例代码来检查浏览器。Node.js是一种更清洁的环境,因此不太可能在那里声明。arguments.callee.toString()
window
通过查找 CommonJS 支持,下划线.js库就是这样做的:
编辑:到您更新的问题:
(function () {
// Establish the root object, `window` in the browser, or `global` on the server.
var root = this;
// Create a reference to this
var _ = new Object();
var isNode = false;
// Export the Underscore object for **CommonJS**, with backwards-compatibility
// for the old `require()` API. If we're not in CommonJS, add `_` to the
// global object.
if (typeof module !== 'undefined' && module.exports) {
module.exports = _;
root._ = _;
isNode = true;
} else {
root._ = _;
}
})();
此处的示例保留了模块模式。