最可靠判断javascript运行环境的方式是组合检查全局对象特征与关键api可用性:浏览器需同时满足typeof window !== 'undefined'且window.document可访问;node.js需满足typeof process !== 'undefined'且process.versions?.node存在;deno需存在deno全局对象;web worker则依赖self.constructor.name判别。
要判断 javascript 当前运行环境,核心是通过检查全局对象、api 可用性及特定属性来区分浏览器、node.js、web worker 或 deno 等环境。没有单一 api 能 100% 准确识别所有场景,但组合多个特征可高概率可靠判断。
检查全局对象特征
不同环境暴露的全局对象不同,这是最基础的判断依据:
-
浏览器环境:存在
window(且window === this),同时有document和navigator;self指向window(主页面)或WorkerGlobalScope(Worker 中)。 -
Node.js:存在
globalThis.process且process.versions.node为字符串;globalThis.global存在,但window和document为undefined。 -
Web Worker:
self存在且self.constructor.name === 'DedicatedWorkerGlobalScope'(或SharedWorkerGlobalScope),但window为undefined,document不存在。 -
Deno:存在
Deno全局对象(如typeof Deno !== 'undefined'),且globalThis.window为undefined,process不存在。
验证关键 API 是否可用
仅靠全局对象可能不够(例如某些测试环境会模拟 window),需结合典型 API:
- 浏览器:能调用
fetch()、localStorage、location.href、addEventListener;XMLHttpRequest通常存在。 - Node.js:
require、__dirname、Buffer、fs模块可访问(需动态require('fs')判断);fetch在较新版本中存在,但非原生(由 Node 提供)。 - Web Worker:
fetch和self.postMessage可用,但无document、localStorage(除非使用sharedStorage等新 API)。
注意陷阱与兼容写法
避免常见误判:
- 不要只依赖
typeof window !== 'undefined'—— Web Worker 和某些 SSR 渲染上下文(如 Next.js 服务端)中window也可能是undefined,但意图是浏览器环境。 - 避免用
process直接判断 Node.js —— Electron 渲染进程也有process,但它运行在浏览器环境中。 - 推荐优先使用
globalThis统一访问全局对象,再结合子属性判断,例如:if (typeof globalThis.window !== 'undefined' && typeof globalThis.document !== 'undefined') { /* 浏览器 */ }
一个轻量实用的判断函数
可封装成小工具函数,按优先级逐项检测:
- 先查
globalThis.self和globalThis.window区分浏览器/Worker - 再查
globalThis.process?.versions?.node确认 Node.js - 然后查
globalThis.Deno判断 Deno - 最后 fallback 到
globalThis.navigator?.userAgent辅助确认(仅浏览器有)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











