最可靠判断浏览器环境的方式是检查 typeof window !== 'undefined' && window.document && window.navigator;Node.js 环境则通过 typeof process !== 'undefined' && process.versions?.node !== undefined 判断;特殊环境需结合全局对象特征与上下文属性交叉验证。

JavaScript 获取当前运行环境信息,主要分浏览器环境和 Node.js 环境两类。判断环境不能只看单一特征,需结合多个指标交叉验证,避免误判(比如 Electron、WebView、SSR 渲染等特殊场景)。
判断是否在浏览器中运行
最可靠的方式是检查全局对象是否存在且具备典型浏览器属性:
- 检查
window是否存在且不是 undefined,同时window.document可访问 —— 这是 DOM 环境的核心标志 -
补充验证
typeof window !== 'undefined' && window.navigator,防止某些测试环境伪造 window - 避免仅用
typeof document !== 'undefined',因为 JSDOM 等模拟环境也提供 document - 简单写法:
const isBrowser = typeof window !== 'undefined' && window.document && window.navigator;
区分浏览器类型与版本
通过 navigator.userAgent 解析识别,但注意其可被篡改,仅适用于非关键场景(如统计、体验优化):
-
Chrome / Edge(Chromium 内核):匹配
/Chrome\/(\d+)/i,同时排除/Edg\//i(旧版 Edge)或检查navigator.brands(新版标准) -
Safari:匹配
/Safari\/(\d+)/i,且不包含'Chrome'和'Edg'(因 Safari 的 UA 中有 Safari 但无 Chrome) -
Firefox:匹配
/Firefox\/(\d+)/i - 更健壮做法:优先使用
navigator.userAgentData(需 HTTPS 或 localhost),调用navigator.userAgentData.getHighEntropyValues(['platform', 'browserName', 'fullVersionList'])
检测 Node.js 环境
Node.js 环境下,全局对象是 globalThis(或 global),且具备 Node 特有模块和属性:
立即学习“Java免费学习笔记(深入)”;
-
核心判断:
typeof process !== 'undefined' && process.versions && process.versions.node -
辅助验证:
typeof require === 'function' && typeof global === 'object' - 注意:
process.browser === false在 Webpack/Vite 等打包工具中可能被注入,不可单独依赖 - 安全写法:
const isNode = typeof process !== 'undefined' && process.versions?.node !== undefined;
识别特殊运行上下文
一些混合或嵌入式环境需要额外探测:
-
Electron:检查
typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type(值为 'renderer' 或 'browser') -
Service Worker:
typeof self === 'object' && self.constructor.name === 'ServiceWorkerGlobalScope' -
Web Worker:
typeof importScripts === 'function'或self.constructor.name === 'DedicatedWorkerGlobalScope' -
微信/支付宝小程序:检查全局对象如
typeof wx === 'object'或typeof my === 'object',但需配合 UA 中的关键词(如 'MiniProgram')提高置信度
实际项目中建议封装一个轻量环境检测模块,按需导出 isBrowser、isNode、isMobile、isIOS 等布尔常量,避免重复解析 UA 或多次判断。










