globalThis 是 ES2020 标准的全局对象统一入口,兼容浏览器、Node.js、Web Worker 等环境,避免使用 window/global/self 的条件判断,简化跨平台代码。
globalthis 是 javascript 的全局对象统一入口,能让你用同一套代码在浏览器、node.js 和 web worker(甚至 service worker)中安全访问全局作用域,无需条件判断或环境检测。
为什么不用 window / global / self?
不同环境的全局对象名称不一致:
- 浏览器主线程:用
window - Web Worker:没有
window,但有self - Node.js(v12+):支持
globalThis;旧版需 fallback 到global - 某些嵌入式环境(如 Deno、Cloudflare Workers)也统一暴露
globalThis
手动判断不仅冗长,还容易漏掉边界情况(比如 iframe 中的 window 与当前上下文不一致)。globalThis 是语言级标准(ES2020),由引擎保障其指向当前执行上下文的全局对象。
直接使用 globalThis 编写跨环境工具函数
例如实现一个轻量级事件总线,不依赖任何外部库:
const EventBus = {
events: new Map(),
on(type, handler) {
if (!this.events.has(type)) this.events.set(type, new Set());
this.events.get(type).add(handler);
},
emit(type, data) {
const handlers = this.events.get(type);
if (handlers) handlers.forEach(h => h(data));
}
};
// 挂载到全局,所有环境都可通过 globalThis.EventBus 访问
globalThis.EventBus = EventBus;
这样在浏览器控制台、Node.js REPL、Worker 的 onmessage 回调里,都能直接写 globalThis.EventBus.on(...),无需分支逻辑。
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
兼容旧版 Node.js(
如果必须支持 Node.js 10 或更早版本,可加一层极简 fallback:
const safeGlobal = typeof globalThis !== 'undefined'
? globalThis
: typeof global !== 'undefined'
? global
: typeof self !== 'undefined'
? self
: typeof window !== 'undefined'
? window
: {}; // 最终兜底(极少场景,如某些测试沙箱)
// 后续一律用 safeGlobal
safeGlobal.myLib = { version: '1.0' };
注意:这个 fallback 仅需写一次,在库入口处定义即可,后续所有模块都复用 safeGlobal。现代项目(Node.js ≥14、主流浏览器)可完全省略。
避免踩坑的关键细节
-
不要在模块顶层给 globalThis 赋值原始类型(如
globalThis.DEBUG = true),因为 ESM 模块是只读绑定,某些打包器(如 webpack)可能报错;应赋值对象或函数 -
Web Worker 中不能访问 window,但 globalThis 就是 self,所以
globalThis.postMessage在 Worker 里有效,在浏览器主线程则无效(需用window.postMessage)——这是正常行为,说明你没误用环境特有 API - SSR 环境(如 Next.js、Nuxt)中,globalThis 在服务端渲染时指向 Node.js 全局,客户端 hydration 后自动切换为浏览器全局,天然适配,无需额外处理
只要坚持用 globalThis 替代硬编码的 window/global/self,你的库就能零配置跑在各种 JavaScript 环境中。










