Ich versuche, Async zu verwenden, warte auf Babel 6 von Grund auf, aber ich bekomme Regenerator. Laufzeit ist nicht definiert.
.babelrc Datei
{
"presets": [ "es2015", "stage-0" ]
}
package.json Datei
"devDependencies": {
"babel-core": "^6.0.20",
"babel-preset-es2015": "^6.0.15",
"babel-preset-stage-0": "^6.0.15"
}
.js Datei
"use strict";
async function foo() {
await bar();
}
function bar() { }
exports.default = foo;
Die normale Verwendung ohne async / await funktioniert einwandfrei. Irgendwelche Ideen, was ich falsch mache?
javascript
node.js
babeljs
BrunoLM
quelle
quelle
Antworten:
babel-polyfill
ist erforderlich. Sie müssen es auch installieren, damit Async / Warten auf Arbeit funktioniert.package.json
.babelrc
.js mit async / await (Beispielcode)
In der Startdatei
Wenn Sie Webpack verwenden , müssen Sie es
entry
(normalerweisewebpack.config.js
) als ersten Wert Ihres Arrays in Ihre Webpack-Konfigurationsdatei einfügen , wie im Kommentar von @Cemen angegeben:Wenn Sie Tests mit babel ausführen möchten, verwenden Sie:
quelle
require("babel-polyfill")
die nicht funktioniert, fügen Sie"babel-polyfill"
in Ihreentry
in config wie folgt aus :entry: ["babel-polyfill", "src/main.js"]
. Dies funktionierte für mich, einschließlich der Verwendung in einem Webpack-Dev-Server mit HMR.devDependency
wenn Sie Webpack verwenden, da es dann die Dateien "kompiliert", bevor es ausgeführt wird.dependency
Wenn Sie kein Webpack verwenden und Babel benötigen.Neben Polyfill verwende ich Babel-Plugin-Transform-Runtime . Das Plugin wird beschrieben als:
Es enthält auch Unterstützung für Async / Warten zusammen mit anderen integrierten Funktionen von ES 6.
In
.babelrc
, fügen Sie die Laufzeit - Pluginquelle
babel-runtime
asynchron warten, um zu arbeiten. Ist das korrekt? Bearbeiten: Ich führe die Code-Server-Seite aus. :)babel-plugin-transform-runtime
erforderlich. Klappt wunderbar.require
vomtransform-runtime
Plugin hinzugefügten Aufrufe zu erweitern .npm install --save-dev @babel/plugin-transform-runtime
Babel 7 Benutzer
Ich hatte einige Probleme, dies zu umgehen, da die meisten Informationen für frühere Babel-Versionen waren. Installieren Sie für Babel 7 diese beiden Abhängigkeiten:
Und fügen Sie in .babelrc Folgendes hinzu:
quelle
"plugins": ["@babel/plugin-transform-runtime"]
und nicht als"plugins": [ ["@babel/transform-runtime"] ]
hier. Anderer Plugin-Name. Beides funktioniert. Aber welches ist das richtige? ..@babel/transform-runtime
zu Plugins verursachte bei mir den Fehler "Exporte sind nicht definiert". Ich habe es dahingehend geändert, dass Async in Babel7 funktioniert:["@babel/plugin-transform-runtime", { "regenerator": true } ]
Aktualisieren
Es funktioniert, wenn Sie das Ziel auf Chrome setzen. Bei anderen Zielen funktioniert dies möglicherweise nicht. Weitere Informationen finden Sie unter: https://github.com/babel/babel-preset-env/issues/112
Diese Antwort ist also NICHT ganz richtig für die ursprüngliche Frage. Ich werde es hier als Referenz behalten
babel-preset-env
.Eine einfache Lösung besteht darin,
import 'babel-polyfill'
am Anfang Ihres Codes hinzuzufügen .Wenn Sie ein Webpack verwenden, können Sie es wie folgt hinzufügen
babel-polyfill
:Ich glaube, ich habe die neuesten Best Practices gefunden.
Überprüfen Sie dieses Projekt: https://github.com/babel/babel-preset-env
Verwenden Sie Folgendes als Babel-Konfiguration:
Dann sollte Ihre App in den letzten beiden Versionen des Chrome-Browsers einsatzbereit sein.
Sie können auch Node als Ziel festlegen oder die Browserliste gemäß https://github.com/ai/browserslist optimieren
Sag mir was, sag mir nicht wie.
Ich mag
babel-preset-env
die Philosophie sehr: Sag mir, welche Umgebung du unterstützen möchtest, sag mir NICHT, wie ich sie unterstützen soll. Das ist das Schöne an der deklarativen Programmierung.Ich habe getestet
async
await
und sie funktionieren. Ich weiß nicht, wie sie funktionieren und ich möchte es wirklich nicht wissen. Ich möchte meine Zeit stattdessen mit meinem eigenen Code und meiner Geschäftslogik verbringen. Dankbabel-preset-env
befreit es mich von der Hölle der Babel-Konfiguration.quelle
babel-preset-env
aber ich denke, es lohnt sich. Ich liebe auch den deklarativen Stil. Auchyarn install
ist jetztyarn add
Wenn Sie nicht alle bereitgestellten Module benötigen
babel-polyfill
, könnenbabel-regenerator-runtime
Sie alternativ einfach in Ihrer Webpack-Konfiguration Folgendes angeben :Bei Verwendung von webpack-dev-server mit HMR wurde dadurch die Anzahl der Dateien, die bei jedem Build kompiliert werden müssen, um ein Vielfaches reduziert. Dieses Modul wird als Teil von installiert
babel-polyfill
, wenn Sie bereits haben, dass es Ihnen gut geht, andernfalls können Sie es separat mit installierennpm i -D babel-regenerator-runtime
.quelle
Meine einfache Lösung:
.babelrc
quelle
loose: true
benötigt?Babel 7.4.0 oder höher (core-js 2/3)
Wie von Babel 7.4.0 ,
@babel/polyfill
ist veraltet .Im Allgemeinen gibt es zwei Möglichkeiten, Polyfills / Regenerator zu installieren: über den globalen Namespace (Option 1) oder als Ponyfill (Option 2, ohne globale Verschmutzung).
Option 1:
@babel/preset-env
wird automatisch
regenerator-runtime
undcore-js
entsprechend Ihrem Ziel verwendet . Sie müssen nichts manuell importieren. Vergessen Sie nicht, Laufzeitabhängigkeiten zu installieren:Alternativ können Sie
useBuiltIns: "entry"
es manuell einstellen und importieren:Option 2:
@babel/transform-runtime
mit@babel/runtime
(keine globale Verschmutzung)Es installieren:
Wenn Sie Kern-js polyfills zu verwenden, installieren Sie
@babel/runtime-corejs2
oder@babel/runtime-corejs3
stattdessen finden Sie hier .Prost
quelle
babel-regenerator-runtime
ist jetzt veraltet , stattdessen sollte man verwendenregenerator-runtime
.So verwenden Sie den Laufzeitgenerator mit
webpack
undbabel
v7:installieren
regenerator-runtime
:Und dann innerhalb der Webpack-Konfiguration hinzufügen:
quelle
@babel/preset-env
'suseBuiltIns
zunichte, Laufzeit basierend auf Ihren Zielbrowsern dynamisch einzufügen.Aktualisieren Sie Ihre
.babelrc
Datei gemäß den folgenden Beispielen, es wird funktionieren.Wenn Sie
@babel/preset-env
Paket verwendenquelle
targets
scheint zu beziehen dies :the environments you support/target for your project
, währendtargets.node
ist dies :if you want to compile against the current node version, you can specify "node": true or "node": "current", which would be the same as "node": process.versions.node
"stage-0"
) wurde, und der Regeneratorfehler ist verschwunden .Achten Sie auf hochgezogene Funktionen
Ich hatte sowohl meinen 'Polyfill-Import' als auch meine 'Async-Funktion' in derselben Datei, verwendete jedoch die Funktionssyntax, die sie über die Polyfill hebt, was mir den
ReferenceError: regeneratorRuntime is not defined
Fehler geben würde .Ändern Sie diesen Code
dazu
um zu verhindern, dass es über den Polyfill-Import gehoben wird.
quelle
Ab Oktober 2019 funktionierte dies für mich:
Fügen Sie dies der Voreinstellung hinzu.
Installieren Sie dann die Regenerator-Laufzeit mit npm.
Und dann in Ihrer Hauptdatei verwenden: (dieser Import wird nur einmal verwendet)
Auf diese Weise können Sie
async
awaits
in Ihrer Datei verwenden und die entfernenregenerator error
quelle
useBuiltIns
festlegen, wird dieser standardmäßig auf gesetztfalse
. Dadurch werden abhängig von der Zielumgebung keine Polyfills automatisch importiert, was den Zweck von irgendwie untergräbt"@babel/preset-env"
. Hier ist auch ein verwandter Kommentar von einem der Babel-Entwickler.Wenn Sie verwenden, müssen Sie
babel-preset-stage-2
nur das Skript mit starten--require babel-polyfill
.In meinem Fall wurde dieser Fehler durch
Mocha
Tests ausgelöst .Im Folgenden wurde das Problem behoben
mocha \"server/tests/**/*.test.js\" --compilers js:babel-register --require babel-polyfill
quelle
Ich bekam diesen Fehler, nachdem ich mein Projekt in ein Typoskript-Projekt konvertiert hatte. Soweit ich weiß, ist das Problem darauf zurückzuführen, dass Async / Warten nicht erkannt wird.
Für mich wurde der Fehler behoben, indem zwei Dinge zu meinem Setup hinzugefügt wurden:
Wie oben oft erwähnt, musste ich meinem Webpack-Eintragsarray babel-polyfill hinzufügen:
Ich musste meine .babelrc aktualisieren, um die Kompilierung von async / await in Generatoren zu ermöglichen:
DevDependencies:
Ich musste auch einige Dinge in meine devDependencies in meiner package.json-Datei installieren. Mir fehlten nämlich das babel-plugin-transform-async-to-generator, das babel-polyfill und das babel-preset-es2015:
Vollständiger Code:
Ich habe den Code von einem wirklich hilfreichen und prägnanten GitHub-Inhalt erhalten, den Sie hier finden .
quelle
env
anstelle von zu verwendenes2015
.env
beinhaltetes2015
bereits.Ich hatte dieses Problem in Chrome. Ähnlich wie bei RienNeVaPlus Antwort löste dies das Problem für mich:
Dann in meinem Code:
Gerne vermeiden wir die zusätzlichen 200 kB ab
babel-polyfill
.quelle
Sie erhalten eine Fehlermeldung, weil asynchrone / wartende Generatoren verwendet werden, bei denen es sich um eine ES2016-Funktion handelt, nicht um ES2015. Eine Möglichkeit, dies zu beheben, besteht darin, die Babel-Voreinstellung für ES2016 (
npm install --save babel-preset-es2016
) zu installieren und anstelle von ES2015 auf ES2016 zu kompilieren:Wie in den anderen Antworten erwähnt, können Sie auch Polyfills verwenden (stellen Sie jedoch sicher, dass Sie die Polyfill zuerst laden, bevor anderer Code ausgeführt wird). Wenn Sie nicht alle Polyfill-Abhängigkeiten einbeziehen möchten, können Sie alternativ die Laufzeit babel-regenerator-runtime oder die Laufzeit babel-plugin-transform-runtime verwenden .
quelle
Ich habe diesen Fehler durch die Installation von babel-polyfill behoben
dann habe ich es in meinen App-Einstiegspunkt importiert
Zum Testen habe ich --require babel-polyfill in mein Testskript aufgenommen
quelle
Dieser Fehler wird verursacht, wenn
async/await
Funktionen ohne die richtigen Babel-Plugins verwendet werden. Ab März 2020 sollten Sie nur noch Folgendes tun. (@babel/polyfill
und viele der akzeptierten Lösungen sind in Babel veraltet. Weitere Informationen finden Sie in den Babel-Dokumenten. )Geben Sie in die Befehlszeile Folgendes ein:
Fügen Sie in Ihrer
babel.config.js
Datei dieses Plugin hinzu@babel/plugin-transform-runtime
. Hinweis: Das folgende Beispiel enthält die anderen Voreinstellungen und Plugins, die ich für ein kleines React / Node / Express-Projekt habe, an dem ich kürzlich gearbeitet habe:quelle
.babelrc
sieht folgendermaßen aus: `` `{" presets ": [" @ babel / preset-env "]," plugins ": [" @ babel / plugin-transform-runtime "]}` `Neue Antwort Warum folgst du meiner Antwort?
Antwort : Weil ich Ihnen eine Antwort mit dem neuesten Update-Version npm-Projekt geben werde.
14.04.2017
Wenn Sie diese oder eine andere UP-Version von Npm und allen anderen verwenden, müssen Sie nur Folgendes ändern:
webpack.config.js
Nach dem Ändern von
webpack.config.js
Dateien Fügen Sie diese Zeile einfach oben in Ihren Code ein.Überprüfen Sie jetzt, ob alles in Ordnung ist. Referenz LINK
Danke auch @BrunoLM für seine nette Antwort.
quelle
Die Zielbrowser, die ich unterstützen muss, unterstützen bereits async / await, aber beim Schreiben von Mokka-Tests ohne die richtige Einstellung wird dieser Fehler immer noch angezeigt.
Die meisten Artikel I sind veraltet gegoogelt, einschließlich der akzeptierte Antwort und hohe Antworten stimmten hier, also Sie nicht brauchen
polyfill
,babel-regenerator-runtime
,babel-plugin-transform-runtime
. usw., wenn Ihre Zielbrowser bereits async / await unterstützen (natürlich, wenn Sie keine Polyfüllung benötigen)Ich möchte auch nicht verwenden
webpack
.Tyler Longs Antwort ist tatsächlich auf dem richtigen Weg, seit er vorgeschlagen hat
babel-preset-env
(aber ich habe sie zuerst weggelassen, als er Polifill am Anfang erwähnte). Ich habe dasReferenceError: regeneratorRuntime is not defined
zuerst immer noch bekommen, dann wurde mir klar, dass ich das Ziel nicht gesetzt habe. Nachdem ich das Ziel für den Knoten festgelegt habe, behebe ich den Fehler regeneratorRuntime:quelle
An babel7 Benutzer und ParcelJS> = 1.10.0 Benutzer
.babelrc
entnommen aus https://github.com/parcel-bundler/parcel/issues/1762
quelle
1 - Installieren Sie die babel-plugin-transform-async-to-module-Methode, babel-polyfil, bluebird, babel-preset-es2015, babel-core:
2 - Fügen Sie Ihrem js babel polyfill hinzu:
import 'babel-polyfill';
3 - Fügen Sie ein Plugin in Ihre .babelrc ein:
Quelle: http://babeljs.io/docs/plugins/transform-async-to-module-method/
quelle
Ich hatte ein Setup
mit Webpack unter Verwendung von
presets: ['es2015', 'stage-0']
und Mokka , das Tests ausführte, die von Webpack kompiliert wurden.
Damit meine
async/await
Tests funktionieren, musste ich nur diemocha --require babel-polyfill
Option hinzufügen .quelle
Ich erhalte diesen Fehler mit gulp with rollup, als ich versuchte, ES6-Generatoren zu verwenden:
Ich kann sagen, dass die Lösung darin bestand,
babel-polyfill
als Laubenkomponente Folgendes aufzunehmen:und fügen Sie es als Abhängigkeit in index.html hinzu:
quelle
Für Leute, die die
babel-polyfill
Version 7 ^ verwendenwebpack
möchten, tun Sie dies mit ver3 ^.Npm installieren Sie das Modul
npm i -D @babel/polyfill
Dann tun Sie dies in Ihrer
webpack
Datei in Ihrementry
Punktquelle
Mein funktionierendes Babel 7 Boilerplate für die Reaktion mit der Regenerator-Laufzeit:
.babelrc
package.json
main.js
quelle
Wenn Sie eine App erstellen, benötigen Sie nur das
@babel/preset-env
und@babel/polyfill
:(Hinweis: Sie müssen die Pakete
core-js
und nicht installieren,regenerator-runtime
da beide von @ babel / polyfill installiert wurden.)Dann in
.babelrc
:Legen Sie nun Ihre Zielumgebungen fest. Hier machen wir es in der
.browserslistrc
Datei:Wenn Sie mitgegangen sind
useBuiltIns: "entry"
, setzen Sie esimport @babel/polyfill
oben in Ihre Eingabedatei. Ansonsten sind Sie fertig.Mit dieser Methode werden diese Polyfills und die 'Regenerator-Laufzeit'-Datei (Behebung Ihres
regeneratorRuntime is not defined
Problems hier) NUR dann selektiv importiert, wenn sie von einer Ihrer Zielumgebungen / Browser benötigt werden.quelle
zum späteren Nachschlagen :
Ab Babel Version 7.0.0-beta.55 wurden Stage Presets entfernt
Siehe Blog https://babeljs.io/blog/2018/07/27/removing-babels-stage-presets
async await kann weiterhin von verwendet werden
https://babeljs.io/docs/en/babel-plugin-transform-async-to-generator#usage
Installation
Verwendung in .babelrc
und Verwenden von babel polyfill https://babeljs.io/docs/en/babel-polyfill
Installation
webpack.config.js
quelle
Im Jahr 2019 mit
Babel 7.4.0+
wurde dasbabel-polyfill
Paket zugunsten der direkten Einbeziehungcore-js/stable
(core-js@3+
um Polyfill-ECMAScript-Funktionen) undregenerator-runtime/runtime
(zur Verwendung transpilierter Generatorfunktionen erforderlich ) abgelehnt :Informationen aus der
babel-polyfill
Dokumentation .quelle
Der einfachste Weg, um dieses "RegeneratorRuntime nicht definierte Problem" in Ihrer Konsole zu beheben:
Sie müssen keine unnötigen Plugins installieren. Einfach hinzufügen:
<script src="https://unpkg.com/[email protected]/runtime.js"></script>
innerhalb des Körpers in Ihrer index.html. Jetzt sollte regeneratorRuntime definiert werden, sobald Sie babel ausführen, und jetzt sollten Ihre asynchronen / erwarteten Funktionen erfolgreich in ES2015 kompiliert werden
quelle
Wenn Sie Gulp + Babel für ein Frontend verwenden, müssen Sie babel-polyfill verwenden
npm install babel-polyfill
Fügen Sie dann index.html vor allen anderen Skript-Tags ein Skript-Tag hinzu und verweisen Sie auf babel-polyfill von node_modules
quelle