create-react-appを使用するReactアプリでES6機能をポリフィルするための最良の方法


87

私はInternetExplorerでReact.jsアプリケーションをテストしてきましたが、ES6 / 7コードのようにArray.prototype.includes()壊れていることがわかりました。

私はcreate-react-appを使用ていますが、誰もが必要としているわけではないため、多くのポリフィルを含めないことを選択したようです。また、ビルド時間が遅くなります(たとえば、ここここを参照)。ドキュメント(執筆時点)は次のことを示唆しています。

ランタイムサポートが必要な他のES6 +機能(Array.from()やSymbolなど)を使用する場合は、適切なポリフィルを手動で含めるか、対象のブラウザーがすでにそれらをサポートしていることを確認してください。

だから... 「手動で」それらを含めるための最良の方法は何ですか?


1
Babelはbabel-polyfill簡単なES6 +ポリフィルとして提供します。
loganfsmyth 2017年

1
これArray.prototype.includes()は実際にはES6ではなくES7にあることに注意してください
huyz 2018年

回答:


122

更新:この質問/回答以降、create-react-appポリフィルのアプローチとドキュメントが変更されました。ie11のような古いブラウザをサポートしたい場合は、ここreact-app-polyfillここに)含める必要があります。ただし、これには「...最小要件と一般的に使用される言語機能」のみが含まれるため、あまり一般的でないES6 / 7機能(などArray.includes)には、以下のいずれかのアプローチを使用することをお勧めします。


これらの2つのアプローチは両方とも機能します。


1.react-app-polyfillおよびcore-jsからの手動インポート

react-app-polyfillcore-js3.0+)をインストールします。

npm install react-app-polyfill core-js または yarn add react-app-polyfill core-js

polyfills.jsという(のような)ファイルを作成し、ルートindex.jsファイルにインポートします。次に、基本的なreact-appポリフィルに加えて、次のような特定の必要な機能をインポートします。

/* 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.io CDNを使用して、次の行をindex.htmlに追加することにより、カスタムのブラウザー固有のポリフィルを取得します。

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

Array.prototype.includesデフォルトの機能セットに含まれていないため、この機能を明示的にリクエストする必要がありました。


18
私はおそらくもっときめ細かくなります。コピーして貼り付ける代わりに、core-jsから個々のグローバルポリフィルをインストールしてインポートできますpolyfills.js。それ以外は、どちらのアプローチも問題ありません。
ダン・アブラモフ2017年

1
それは賢く聞こえます、ダンに感謝します。github.com/zloirock/core-jsを意味します、私は推測します(つまり、npm install core-js)?
Daniel Loiterton 2017年

7
最新のcreate-react-appで生成されたアプリがIE11以下に表示されないという問題が発生していました。このソリューションのおかげで、私は<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=default,es6"></script>(に注意してくださいes6)を含めることになり、今では魅力のように機能しています。主な問題は、Symbolのポリフィルが必要だったと思います。
ダグマックリン2017

1
@dougmacklin参考までに:私の場合、インクルードを使用してもIE 11の問題が解決されなかったため、ヒットまたはミスです。残念ながら、IE 11の開発者コンソールも、どの言語機能がそれを作動させているのかを理解するのに非常に役に立ちませんでした。最終的にbabel-polyfillを使用しました。ヘビーハンド、私は知っていますが、私たちは生産現場を動かす必要がありました。
クリントンチャウ

1
@ClintonChau、完全に理解できます。私はそのコメントを掲載するので、私は別のIE 11の問題を解決するために別のプロジェクトにバベル-ポリフィルを使用する必要が終わるんでした
dougmacklin

12

使用反応するアプリ-ポリフィルES6が反応に使用される機能の共通のためpolyfillsを持っています。そして、それはcreate-react-appの一部です。READMEで定義されているように、index.jsの先頭に必ず含めてください。


1
私の答えは最高だと思いますが、それは最近のものだからです-react-app-polyfillは数か月前に作成されただけで、それまでは他の答えの方が明らかに優れていました:-)
icewhite 2018年

4
こんにちは@ icewhite、react-app-polyfillについて少し誤解されていると思います。パッケージには、Promise、window.fetch、Object.assign、Symbol、Array.fromのポリフィルが含まれています。その他含まれませんArray.prototype.includes()
フォングエン

6

糸を使用してポリフィルをダウンロードし、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 ReactAppプロジェクトの推奨されるベストプラクティスであるように思われます。参照:github.com/facebook/create-react-app/blob/master/packages/…–
Peter W

3

新しいGoogleSearch ConsoleとReactアプリ(create-react-app)で問題が発生したことは価値があります。es6shimを追加した後、すべてが解決されました。

以下を公開index.htmlページに追加しました。

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

0

Create ReactAppプロジェクトからのイジェクト

その後、すべてのポリフィルを/config/polyfills.jsファイルに入れることができます

ファイルの最後に以下を入れてください

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

Webpackはこれを自動的に修正します;)


実際にもっと良い方法を見つけました、npm install --save core-js; import'core-js / fn / object / values ';
ウェブマスター2018

このより良い方法であなたの答えを編集していただけますか?
MattSidor

0

私も同じ問題を抱えていました。DanielLoitertonの解決策は私にはうまくいきませんでした。だが!core-jsからインポートをもう1つ追加しましたがimport 'core-js/modules/es6.symbol';、これはIE11で機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.