掘金文章归档 · 第 81 篇 工程化 · 依赖治理

解决三方包引入 global is not defined 报错问题

浏览器环境没有 global 对象,index.html 入口一行补全局兼容

原文作者:随意_(掘金) | juejin.cn/post/7404778275018833972 | 发布于 2024-08-19 | 阅读 1,726 · 约 3 分钟

0背景

最近在开发关系图谱,使用 react-graph-vis 插件,按照文档引入,关系图谱报错:global is not defined。查找引用是因为 var crypto = global.crypto || global.msCrypto; // for IE 11

截图占位:react-graph-vis 报错 global is not defined 的控制台截图

1原因

在 JavaScript 或其他类似环境中,如果你遇到了 "global is not defined" 的错误,这通常意味着在你的代码上下文中,global 这个对象或变量没有被定义或识别。这个错误的原因可能有几个:

环境差异

在 Node.js 环境中,global 是一个内置的全局对象,你可以通过它访问全局变量。但是,如果你在浏览器环境中运行相同的代码,global 就不会被定义,因为浏览器全局对象是 window。如果你在尝试在浏览器中使用 global,你应该将其替换为 window。

代码错误

如果你的代码是在 Node.js 环境中运行,但 global 仍然报错,可能是因为某些代码或模块错误地覆盖了 global 对象或将其删除。检查是否有任何代码行(如 var global = ... 或 let global = ...)错误地声明了 global 变量,这可能会覆盖 Node.js 中的全局 global 对象。

使用第三方库或框架

如果你在使用某些第三方库或框架,并且它们内部使用了 global,而这些库或框架并不兼容你当前的环境(比如它们在浏览器环境中被错误地引入),那么也可能会出现这个错误。检查这些库或框架的文档,确认它们是否支持你的运行环境。

Webpack 或其他模块打包器

如果你在使用 Webpack、Rollup 或其他 JavaScript 模块打包器,并且你的配置可能影响了全局对象的处理,这也可能是问题所在。检查你的打包器配置,看看是否有任何与全局对象相关的设置。

Node.js 版本

在非常旧的 Node.js 版本中,可能存在对全局对象的处理与当前实践不一致的情况。尝试更新你的 Node.js 到最新版本,看看问题是否仍然存在。

代码隔离

如果你的代码被封装在严格模式下(strict mode),并且你试图在没有明确声明的情况下访问全局对象,这也可能导致问题。在严格模式下,未声明的变量访问会抛出错误。确保在访问全局对象之前,你了解当前的环境和上下文。

场景说明
环境差异Node 有 global,浏览器只有 window
代码错误代码里 var global = ... 覆盖了全局对象
三方库不兼容库内部使用 global 但不兼容浏览器环境
打包器配置Webpack/Rollup 对全局对象的处理影响
Node 版本过旧旧版本全局对象处理不一致
严格模式未声明变量访问抛错

解决这个问题的方法通常取决于你的具体环境和代码。如果你正在 Node.js 环境中工作,确保你没有错误地声明或覆盖 global 对象。如果你在浏览器环境中工作,请考虑使用 window 代替 global。如果问题仍然存在,请检查你的代码和所使用的库或框架的文档。

2解决方式

按照 vite 搭建项目为例,我们采用最简单的解决方式:改变 global 对象即可。在打包入口文件 index.html 增加代码:

<script>
  if (window.global === undefined) {
    window.global = window;
  }
</script>
📌 原理:把 window 赋给 global,让三方包里对 global.crypto 等引用在浏览器里也能取到值。
💡 更通用的现代写法是使用 globalThis(所有环境都有),但入口打补丁对存量第三方包最省事、不动依赖源码。