怎样判断js运行环境deno还是node还是bun还是浏览器?

怎样判断js运行环境deno还是node还是bun还是浏览器?
最新回答
曾言河山

2020-09-04 11:06:23

判断 JS 运行环境的关键在于检查全局注入的对象或属性。在浏览器环境下,通常会存在 BOM(浏览器对象模型)和 DOM(文档对象模型)相关的 API,而在 Node.js 环境下,则不会出现这些浏览器特有的功能。

要判断是否为浏览器环境,只需检测是否存在 `window` 对象或相关的 DOM API 即可。对于 Node.js 环境,则应检查是否存在 `process` 对象以及其成员属性的值。然而,有时在浏览器中工程化打包产物可能会引入一个模拟的 `process` 对象,因此可能需要额外的逻辑排除非浏览器的情况。

判断是否为 Deno 环境,只需检测是否存在 `Deno` 对象即可。类似的,通过检测 `Bun` 相关对象,可以判断是否为 Bun 环境。

值得注意的是,全局对象并非不可被注入或修改,例如在 Node.js 环境中注入 `Window`、`Document` 等对象,以实现完整 API。在这种情况下,上文提到的判断方法可能不够准确。为了更精确地区分环境,可能需要检查更多的属性值。

并非所有环境都遵循规则,如在 Node.js、Deno 之外,直接调用 JS 引擎(如 V8 或 QuickJS)解析运行代码,此时全局对象完全由开发者自定义,判断方法失去意义。因此,这些判断方法仅适用于受信或可控的环境,或没有与环境强绑定需求的情况。

在实际应用中,这类判断主要用于兼容性需求或进行差异化的逻辑处理,如服务端 SSR(服务器端渲染)与浏览器 CSR(客户端渲染)。在这些场景下,上文提到的判断方法是一种可行的解决方案。