React18、19如何兼容 IE9、IE10

首先我们需要为项目处理好babel和polyfill,这个我就不介绍了。

处理完babel和polyfill后,我们可以发现IE11就能运行了,IE10不能运行。这是怎么回事呢?调试一下,我们就能发现关键代码:

typescript 复制代码
function resolveUpdatePriority(): EventPriority {
  // ...
  const currentEvent = window.event;
  // IE11 is undefined, IE10 is null
  if (currentEvent === undefined) {
    return DefaultEventPriority;
  }
  return getEventPriority(currentEvent.type);
}

其中的window.event,由于IE10为null,IE11为undefined就导致IE10在后面的currentEvent.type报错了。

undefined和null有什么区别?

作为前端界的八股题,相信大家都学过:null的语义是"有意的空值 ",undefined的语义是"变量尚未被定义 "。在大多数情况下,如果一个特性还不支持,应当是undefined;如果支持这个特性,但是此时没有值,应当是null,document.currentScript就是一个很好的示例。

但是window.event是一个特例 ,因为window.event是IE先出的,后有的规范。如果把空值定为null,就会导致有现存的网站可能把新浏览器判定为IE,所以window.event的规范空值是undefined。

因此我们在window.event判断时,使用window.event == null判断即可。但是React中window.event用===undefined来判断也不能说它是错的。所以我们不改react源代码,而是通过polyfill来解决。

解决方案:注入 Polyfill

首先安装插件rollup-plugin-polyfill-inject。rollup-plugin-polyfill-inject是一个专业的polyfill注入插件。

bash 复制代码
npm i -D rollup-plugin-polyfill-inject

然后配置插件,以下配置仅供参考,如果你的构建工具支持"按条件加载",可以配置只有低版本浏览器使用插件。

javascript 复制代码
polyfill({
    getter: {
        'window.event': "@/utils/getEvent"
    },
    include: [
        "**/node_modules/react-dom/**/*"
    ]
})

然后去编写src/utils/getEvent。

javascript 复制代码
export default function getEvent() {
	return window.event || undefined;
};

最后我们构建后看看效果

果然成功了。

相关推荐
JudithHuang4 天前
React 嵌套路由与布局
前端·react.js·arcgis·react·react router
2601_967987376 天前
Next.js 全栈开发入门指南(2026 最新版)
react·next.js·全栈开发·企业级开发·渲染模式
2601_967987377 天前
完整教程:Next.js项目演示(从零创建Next.js项目)Next.js入门实战
react·教程·前端开发·next.js·项目创建
goehou8 天前
ReAct 循环跑偏的三种样子,以及怎么在工程上兜住
llm·agent·react·工具调用·工程实践
liuchangng8 天前
React 19 + Vite 6 实战:从教材 PDF 到 866 词间隔重复单词 App
前端·react.js·pdf·vite·开源项目
大连好光景9 天前
ClaudeCode有关Agent Loop知识点大全
react·max_turns·agentloop·checkpoint快照·流式输入
汤米粥9 天前
2026年主流前端技术框架
vue·react·elementplus·tailwind css·angular‌·svelte‌·bootstrap‌
2601_9679873710 天前
Next.js 文档
react·开发·全栈·文档·next.js
前进的李工10 天前
Agent 学习笔记 01:从工具调用到 ReAct 循环
笔记·学习·llm·agent·react·工具调用