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


87

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

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

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

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


1
Babel提供babel-polyfill了一种简单的ES6 + polyfill。
loganfsmyth

1
请注意,Array.prototype.includes()实际上是在ES7中,而不是ES6中
huyz 18'Nov

Answers:


122

更新:自此问题/答案以来,create-react-app polyfill方法和文档已更改。如果您想支持像ie11这样的旧版浏览器,现在应该包括react-app-polyfillhere)。但是,这仅包括“ ...最低要求和常用语言功能”,因此您仍然希望使用以下一种方法来处理不太常见的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 polyfills,以及任何特定的必需功能,例如:

/* 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服务

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

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

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


18
我可能会变得更细。除了复制粘贴外,您还可以从中安装core-js和导入单个全局polyfill polyfills.js。除此之外,两种方法听起来都不错。
丹·阿布拉莫夫

1
听起来更聪明,谢谢Dan。你的意思是github.com/zloirock/core-js,我假设(即npm install core-js)?
Daniel Loiterton '17

7
我遇到了一个问题,该问题是使用最新的create-react-app生成的应用未出现在IE 11及更低版本上。由于有了这个解决方案,我最终加入了<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=default,es6"></script>(请注意es6),现在它的工作就像一个魅力。我认为主要问题是需要为Symbol添加一个polyfill。
dougmacklin

1
@dougmacklin仅供参考:碰碰运气,因为就我而言,使用您的include并不能解决我的IE 11问题。不幸的是,IE 11中的开发者控制台对于弄清是哪种语言功能还是非常无益。我们最终使用了babel-polyfill。我知道,人手笨拙,但是我们需要使生产现场运转起来。
克林顿·洲

1
@ClintonChau,完全可以理解。自从我发表评论以来,我确实不得不在另一个项目上使用babel-
polyfill

12

使用具有polyfill的react-app-polyfill来实现React中使用的常见ES6功能。它是create-react-app的一部分。确保按照自述文件中的定义将其包括在index.js的开头。


1
我认为我的答案是最好的,但这只是因为它是最新的-react-app-polyfill才在几个月前创建,而在那之前其他答案显然更好:-)
icewhite

4
大家好,@ icewhite,我想您对React-app-polyfill有误解。该软件包仅包含以下内容的策略填充:Promise,window.fetch,Object.assign,Symbol,Array.from。它包括Array.prototype.includes()或其他。
昂阮

6

我使用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';
...

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


1
现在,这样的东西似乎是Create React App项目的建议最佳实践。请参阅:github.com/facebook/create-react-app/blob/master/packages/...
彼得·w ^

3

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

我在公共index.html页面上添加了以下内容。

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

0

从您的Create React App项目中弹出

然后,您可以将所有填充填充物放入/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';
网站管理员

您能用这种更好的方法来编辑您的答案吗?
MattSidor

0

我有同样的问题。Daniel Loiterton的解决方案对我不起作用。但!我从core-js添加了另一个导入import 'core-js/modules/es6.symbol';,这对我来说在IE11上有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.