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

我有一个Node.js脚本所需的脚本,我想保持JavaScript引擎独立。

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


发布此问题时,我不知道Node.js模块功能是否基于CommonJS

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

脚本如何判断是否需要CommonJS模块?

2020/04/03 10:31:58

获取node.js的源代码并对其进行更改,以定义类似的变量runningOnNodeJS在代码中检查该变量。

如果您没有自己的私有版本的node.js,请在项目中打开功能请求。要求他们定义一个变量,该变量为您提供正在运行的node.js的版本。然后检查该变量。

Mandy2020/04/03 10:31:58

编辑:关于您更新的问题:“脚本如何告诉它是否已作为commonjs模块需要?” 我不认为可以。您可以检查是否exports是一个对象(if (typeof exports === "object")),因为规范要求将其提供给模块,但是所有告诉您的是... exports是一个对象。:-)


原始答案:

我确定可以检查一些特定于NodeJS的符号(EventEmitter,也许 不,您必须使用它require来获取事件模块;请参见下文),但是正如David所说,最好是最好检测一下该功能(相反而不是环境)。

更新:也许类似:

if (typeof require === "function"
    && typeof Buffer === "function"
    && typeof Buffer.byteLength === "function"
    && typeof Buffer.prototype !== "undefined"
    && typeof Buffer.prototype.write === "function") {

但这只是告诉您,您所处的环境require非常类似于NodeJS Buffer:-)

神奇Mandy2020/04/03 10:31:58

Node.js有process对象,因此只要您没有其他可创建的脚本,process就可以使用它来确定代码是否在Node上运行。

var isOnNodeJs = false;
if(typeof process != "undefined") {
  isOnNodeJs = true;
}

if(isOnNodeJs){
  console.log("you are running under node.js");
}
else {
  console.log("you are NOT running under node.js");
}
DavaidTony宝儿2020/04/03 10:31:58

脚本如何判断是否已将其作为commonjs模块使用?

相关:要检查它是否需要作为模块还是直接在节点中运行,可以检查require.main !== modulehttp://nodejs.org/docs/latest/api/modules.html#accessing_the_main_module

Tony凯2020/04/03 10:31:58

怎么样使用过程中的对象和检查execPathnode

process.execPath

这是启动进程的可执行文件的绝对路径名。

例:

/ usr / local / bin / node

伽罗2020/04/03 10:31:58

这也是一种很酷的方法:

const isBrowser = this.window === this;

之所以可行,是因为在浏览器中,全局“ this”变量具有一个称为“ window”的自引用。该自引用在Node中不存在。

  • 在浏览器中,“ this”是对称为“ window”的全局对象的引用。
  • 在节点中,“ this”是对module.exports对象的引用。
    • “ this” 不是对称为“ global”的Node全局对象的引用。
    • “ this” 不是对模块变量声明空间的引用。

要打破上面建议的浏览器,您必须执行以下操作

this.window = this;

在执行检查之前。