如何检查脚本是否在Node.js下运行?

2022-08-30 01:53:22

我有一个来自Node.js脚本的脚本,我想让它保持JavaScript引擎的独立性。

例如,我只想在 Node.js 下运行时执行操作。如何执行此测试?exports.x = y;


在发布这个问题时,我不知道Node.js模块功能是基于CommonJS的

对于我给出的具体例子,一个更准确的问题是:

脚本如何判断它是否已被要求作为CommonJS模块?


答案 1

好吧,没有可靠的方法来检测Node中的运行.js因为每个网站都可以轻松声明相同的变量,但是,由于Node中没有对象.js默认情况下,您可以反其道而行之,检查您是否在浏览器中运行。window

这就是我用于应该在浏览器和Node下工作的libs.js:

if (typeof window === 'undefined') {
    exports.foo = {};

} else {
    window.foo = {};
}

在 Node 中定义的情况下,它仍然可能会爆炸.js但是没有充分的理由让某人这样做,因为您明确需要省略或设置对象的属性。windowvarglobal

编辑

要检测您的脚本是否需要作为CommonJS模块,这同样不容易。commonJS唯一指定的是A:模块将通过调用函数和B:模块通过对象上的属性导出内容。现在,如何实现它留给底层系统。Node.js将模块的内容包装在匿名函数中:requireexports

function (exports, require, module, __filename, __dirname) { 

请参见: https://github.com/ry/node/blob/master/src/node.js#L325

但是不要试图通过一些疯狂的东西来检测它,而只是使用我上面的示例代码来检查浏览器。Node.js是一种更清洁的环境,因此不太可能在那里声明。arguments.callee.toString()window


答案 2

通过查找 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._ = _;
    }
})();

此处的示例保留了模块模式。