Beste Methode zum Polyfill von ES6-Funktionen in der React-App, die create-react-app verwendet

Lesezeit: 5 Minuten

Benutzer-Avatar
Daniel Loiterton

Ich habe meine React.js-Anwendung im Internet Explorer getestet und festgestellt, dass einige ES6 / 7-Codes wie Array.prototype.includes() bricht es.

Ich benutze Erstellen-Reagieren-Appund anscheinend haben sie sich entschieden, nicht viele Polyfills einzuschließen, da sie nicht jeder braucht und sie die Bauzeiten verlangsamen (siehe zum Beispiel hier und hier). Die Dokumentation (zum Zeitpunkt des Schreibens) schlägt vor:

Wenn Sie andere ES6+-Funktionen verwenden, die Laufzeitunterstützung benötigen (z. B. Array.from() oder Symbol), stellen Sie sicher, dass Sie die entsprechenden Polyfills manuell einschließen oder dass die Browser, auf die Sie abzielen, diese bereits unterstützen.

So… Was ist der beste Weg, sie “manuell” einzuschließen?

  • Babel bietet babel-polyfill als einfache ES6+ Füllwatte.

    – loganfsmyth

    3. Mai 2017 um 17:01 Uhr

  • Beachten Sie, dass Array.prototype.includes() ist eigentlich in ES7, nicht in ES6

    – huyz

    20. November 2018 um 15:46 Uhr

Benutzer-Avatar
Daniel Loiterton

Aktualisieren: Der Polyfill-Ansatz von Create-React-App und die Dokumentation haben sich seit dieser Frage/Antwort geändert. Sie sollten jetzt einschließen react-app-polyfill (hier), wenn Sie ältere Browser wie ie11 unterstützen möchten. Dies beinhaltet jedoch nur die „…Mindestanforderungen und häufig verwendete Sprachmerkmale“, also sollten Sie immer noch einen der folgenden Ansätze für weniger gebräuchliche ES6/7-Funktionen verwenden (wie z Array.includes)


Diese beiden Ansätze funktionieren beide:


1. Manuelle Importe aus React-App-Polyfill und Core-Js

Installieren reagieren-app-polyfill und core-js (3.0+):

npm install react-app-polyfill core-js oder yarn add react-app-polyfill core-js

Erstellen Sie eine Datei mit dem Namen (so etwas wie) polyfills.js und importieren Sie sie in Ihre index.js-Stammdatei. Importieren Sie dann die grundlegenden React-App-Polyfills sowie alle erforderlichen spezifischen Funktionen wie folgt:

/* 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-Service

Verwenden Sie die polyfill.io CDN zum Abrufen benutzerdefinierter, browserspezifischer Polyfills durch Hinzufügen dieser Zeile zu index.html:

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

Beachten Sie, dass ich das ausdrücklich anfordern musste Array.prototype.includes Feature, da es nicht im Standard-Feature-Set enthalten ist.

  • Ich würde wahrscheinlich granularer werden. Anstatt zu kopieren, können Sie installieren core-js und importieren Sie einzelne globale Polyfills aus Ihrer polyfills.js. Ansonsten klingen beide Ansätze gut.

    – Dan Abramow

    3. Mai 2017 um 20:29 Uhr

  • Das klingt klüger, danke Dan. Was meinen Sie github.com/zloirock/core-jsnehme ich an (dh npm install core-js)?

    – Daniel Loiterton

    4. Mai 2017 um 7:57 Uhr

  • Ich hatte ein Problem mit einer App, die mit der neuesten create-react-app generiert wurde und nicht auf IE 11 und darunter erschien. Dank dieser Lösung landete ich darunter <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=default,es6"></script> (man beachte die es6) und jetzt funktioniert es wie ein Zauber. Ich glaube, das Hauptproblem war die Notwendigkeit einer Polyfill für Symbol.

    – Dougmacklin

    6. Juni 2017 um 13:45 Uhr

  • @dougmacklin Nur zur Information: Es ist ein Hit oder Miss, denn in meinem Fall hat die Verwendung Ihres Include meine IE 11-Probleme nicht gelöst. Leider war die Entwicklerkonsole in IE 11 auch sehr wenig hilfreich, um herauszufinden, welche Sprachfunktion sie auslöste. Am Ende haben wir babel-polyfill verwendet. Schwerfällig, ich weiß, aber wir mussten die Produktionsstätte in Gang bringen.

    – Clinton Chau

    16. April 2018 um 14:43 Uhr

  • @ClintonChau, absolut verständlich. Seit ich diesen Kommentar gepostet habe, musste ich schließlich babel-polyfill in einem anderen Projekt verwenden, um ein anderes IE 11-Problem zu beheben

    – Dougmacklin

    16. April 2018 um 18:13 Uhr

Verwenden Sie die reagieren-app-polyfill die Polyfills für die gemeinsamen ES6-Funktionen enthält, die in React verwendet werden. Und es ist Teil von Erstellen-Reagieren-App. Stellen Sie sicher, dass Sie es am Anfang von index.js einfügen, wie in der README-Datei definiert.

  • Ich denke, meine Antwort ist die beste, aber das liegt nur daran, dass sie neuer ist – das React-App-Polyfill wurde erst vor ein paar Monaten erstellt und bis dahin waren die anderen Antworten offensichtlich besser 🙂

    – eisweiß

    26. November 2018 um 11:35 Uhr

  • Hallo @icewhite, ich glaube, du hast React-App-Polyfill ein wenig missverstanden. Das Paket enthält nur Polifill von: Promise, window.fetch, Object.assign, Symbol, Array.from. Es nicht enthalten Array.prototype.includes() oder andere.

    – Huong Nguyen

    24. Januar 2019 um 8:14 Uhr


Ich habe Garn verwendet, um das Polyfill herunterzuladen und es direkt in meine index.js zu importieren.

In der Eingabeaufforderung:

yarn add array.prototype.fill

Und dann, ganz oben index.js:

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

Ich mag diesen Ansatz, da ich genau das importiere, was ich in das Projekt benötige.

Für das, was es wert ist, hatte ich Probleme mit der neuen Google Search Console und meiner React-App (create-react-app). Nach dem Hinzufügen des es6shim war alles gelöst.

Ich habe das Folgende zu meiner öffentlichen index.html-Seite hinzugefügt.

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

Auswerfen aus Ihrem Create React App-Projekt

Danach können Sie alle Ihre Polyfills in Ihre einfügen /config/polyfills.js Datei

Fügen Sie Folgendes an das Ende der Datei ein

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

Webpack wird dies automatisch für Sie beheben 😉

  • tatsächlich einen besseren Weg gefunden, npm install –save core-js; importiere ‘core-js/fn/object/values’;

    – Webmaster

    10. Juli 2018 um 12:23 Uhr


  • Können Sie Ihre Antwort bitte auf diese bessere Weise bearbeiten?

    – MattSidor

    15. Juli 2019 um 20:09 Uhr

Benutzer-Avatar
Brian Tompsett – 汤莱恩

Ich hatte das gleiche Problem. Eine Lösung von Daniel Loiterton hat bei mir nicht funktioniert. Aber! Ich habe einen weiteren Import von core-js hinzugefügt import 'core-js/modules/es6.symbol'; und das funktioniert bei mir auf IE11.

  • tatsächlich einen besseren Weg gefunden, npm install –save core-js; importiere ‘core-js/fn/object/values’;

    – Webmaster

    10. Juli 2018 um 12:23 Uhr


  • Können Sie Ihre Antwort bitte auf diese bessere Weise bearbeiten?

    – MattSidor

    15. Juli 2019 um 20:09 Uhr

1195240cookie-checkBeste Methode zum Polyfill von ES6-Funktionen in der React-App, die create-react-app verwendet

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy