在使用 create-react-app 的 React 应用程序中填充 ES6 功能的最佳方法

IT技术 javascript reactjs ecmascript-6 create-react-app ecmascript-2016
2021-03-02 12:20:01

我一直在 Internet Explorer 上测试我的 React.js 应用程序,发现一些 ES6/7 代码像Array.prototype.includes()破坏了它。

我正在使用create-react-app,显然他们选择不包含很多 polyfill,因为不是每个人都需要它们,并且它们会减慢构建时间(例如参见此处此处)。文档(在撰写本文时)建议:

如果您使用任何其他需要运行时支持的 ES6+ 功能(例如 Array.from() 或 Symbol),请确保您手动包含适当的 polyfill,或者您的目标浏览器已经支持它们。

那么...... “手动”包含它们的最佳方法是什么?

6个回答

更新:自此问题/答案以来,create-react-app polyfill 方法和文档已更改。如果您想支持像 ie11 这样的旧浏览器,您现在应该包括react-app-polyfill( here )。但是,这仅包括“ ...最低要求和常用语言功能”,因此对于不太常见的 ES6/7 功能(例如Array.includes,您仍然希望使用以下方法之一


这两种方法都有效:


1. 从 react-app-polyfill 和 core-js 手动导入

安装react-app-polyfillcore-js (3.0+):

npm install react-app-polyfill core-js 或者 yarn add react-app-polyfill core-js

创建一个名为(类似于)polyfills.js 的文件并将其导入到您的根 index.js 文件中。然后导入基本的 react-app polyfill,以及任何特定的必需功能,如下所示:

/* polyfills.js */

import 'react-app-polyfill/ie11';
import 'core-js/features/array/find';
import 'core-js/features/array/includes';
import 'core-js/features/number/is-nan';

/* index.js */

import './polyfills'
...

2.Polyfill服务

使用polyfill.io CDN 通过将此行添加到 index.html 来检索自定义的、特定于浏览器的 polyfill:

<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=default,Array.prototype.includes"></script>

请注意,我必须明确请求该Array.prototype.includes功能,因为它不包含在默认功能集中。

@dougmacklin 仅供参考:它是命中还是未命中,因为就我而言,使用您的包含并没有解决我的 IE 11 问题。不幸的是,IE 11 中的开发者控制台也无法确定是哪种语言功能导致它出错。我们最终使用了 babel-polyfill。我知道这很严厉,但我们需要让生产现场运转起来。
2021-04-25 12:20:01
我可能会变得更细粒度。您可以core-js从您的polyfills.js. 除此之外,这两种方法听起来都不错。
2021-04-26 12:20:01
我遇到了一个使用最新 create-react-app 生成的应用程序没有出现在 IE 11 及更低版本上的问题。多亏了这个解决方案,我最终包含了<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=default,es6"></script>(注意es6),现在它的工作就像一个魅力。我认为主要问题是需要为 Symbol 使用 polyfill。
2021-04-30 12:20:01
@ClintonChau,完全可以理解。自从我发布了该评论后,我最终不得不在另一个项目中使用 babel-polyfill 来修复不同的 IE 11 问题
2021-05-18 12:20:01
这听起来更聪明,谢谢丹。你的意思是github.com/zloirock/core-js,我假设(即 npm install core-js)?
2021-05-20 12:20:01

使用react-app-polyfill,它为 React 中使用的常见 ES6 功能提供了 polyfill。它是create-react-app的一部分确保将它包含在自述文件中定义的 index.js 的开头。

我认为我的答案是最好的,但这只是因为它是最近的——react-app-polyfill 是几个月前才创建的,在那之前,其他答案显然更好:-)
2021-04-29 12:20:01
嗨@icewhite,我想你对 react-app-polyfill 有点误解。该包仅包含以下 polifill:Promise、window.fetch、Object.assign、Symbol、Array.from。包括Array.prototype.includes()或其他。
2021-05-14 12:20:01

我使用 yarn 下载了 polyfill 并将其直接导入到我的 index.js 中。

在命令提示符中:

yarn add array.prototype.fill

然后,在顶部index.js

import 'array.prototype.fill' // <-- newly added import
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
...

我喜欢这种方法,因为我专门将我需要的东西导入到项目中。

像这样的事情现在似乎是 Create React App 项目的建议最佳实践。参见:github.com/facebook/create-react-app/blob/master/packages/...
2021-05-17 12:20:01

值得一提的是,我在使用新的 Google Search Console 和我的 React 应用程序 (create-react-app) 时遇到了问题。添加es6shim后,一切都解决了。

我将以下内容添加到我的公共 index.html 页面中。

<script src="https://cdn.polyfill.io/v2/polyfill.min.js"></script>

从你的 Create React App 项目中弹出

之后你可以把你所有的 polyfills 放在你的/config/polyfills.js文件中

将以下内容放在文件末尾

Object.values = Object.values ? Object.values : o=>Object.keys(o).map(k=>o[k]);

Webpack 会自动为你解决这个问题;)

居然找到了更好的方法,npm install --save core-js;导入 'core-js/fn/object/values';
2021-04-27 12:20:01
你能用这种更好的方式编辑你的答案吗?
2021-04-27 12:20:01