Babel 6 regeneratorRuntime ist nicht definiert


631

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?


Haben Sie Regenerator aufgenommen?
ssube

3
babel-polyfill ist was du brauchst.
Ronnie Royston

babel-polyfill wurde ab 7.4 abgeschrieben; Dieser aktualisierte Beitrag beschreibt die Migration.
JWCS vor

Antworten:


681

babel-polyfillist erforderlich. Sie müssen es auch installieren, damit Async / Warten auf Arbeit funktioniert.

npm i -D babel-core babel-polyfill babel-preset-es2015 babel-preset-stage-0 babel-loader

package.json

"devDependencies": {
  "babel-core": "^6.0.20",
  "babel-polyfill": "^6.0.16",
  "babel-preset-es2015": "^6.0.15",
  "babel-preset-stage-0": "^6.0.15"
}

.babelrc

{
  "presets": [ "es2015", "stage-0" ]
}

.js mit async / await (Beispielcode)

"use strict";

export default async function foo() {
  var s = await bar();
  console.log(s);
}

function bar() {
  return "bar";
}

In der Startdatei

require("babel-core/register");
require("babel-polyfill");

Wenn Sie Webpack verwenden , müssen Sie es entry(normalerweise webpack.config.js) als ersten Wert Ihres Arrays in Ihre Webpack-Konfigurationsdatei einfügen , wie im Kommentar von @Cemen angegeben:

module.exports = {
  entry: ['babel-polyfill', './test.js'],

  output: {
    filename: 'bundle.js'       
  },

  module: {
    loaders: [
      { test: /\.jsx?$/, loader: 'babel', }
    ]
  }
};

Wenn Sie Tests mit babel ausführen möchten, verwenden Sie:

mocha --compilers js:babel-core/register --require babel-polyfill

77
Wichtig , wenn Sie babel mit webpack verwenden: anstatt require("babel-polyfill")die nicht funktioniert, fügen Sie "babel-polyfill"in Ihre entryin 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.
Cemen

6
Ich habe versucht, meine Mokka-Tests mit babel6 und async zum Laufen zu bringen, und ich musste - nabel babel-polyfill zur Konfiguration des npm-Testläufers
anfordern

13
Wofür ist Babel-Register?
Trusktr

6
@Lloyd, devDependencywenn Sie Webpack verwenden, da es dann die Dateien "kompiliert", bevor es ausgeführt wird. dependencyWenn Sie kein Webpack verwenden und Babel benötigen.
BrunoLM

4
Dies macht die Ausgabedateigröße riesig ... Verwenden Sie besser nur das, was Sie benötigen, anstatt babel-polyfill direkt zu benötigen.
Inanc Gumus

339

Neben Polyfill verwende ich Babel-Plugin-Transform-Runtime . Das Plugin wird beschrieben als:

Externalisieren Sie Verweise auf Helfer und integrierte Funktionen und füllen Sie Ihren Code automatisch aus, ohne die globalen Daten zu verschmutzen. Was bedeutet das eigentlich? Grundsätzlich können Sie integrierte Funktionen wie Promise, Set, Symbol usw. verwenden und alle Babel-Funktionen verwenden, für die eine Polyfüllung nahtlos und ohne globale Verschmutzung erforderlich ist, sodass sie sich hervorragend für Bibliotheken eignet.

Es enthält auch Unterstützung für Async / Warten zusammen mit anderen integrierten Funktionen von ES 6.

$ npm install --save-dev babel-plugin-transform-runtime

In .babelrc, fügen Sie die Laufzeit - Plugin

{
  "plugins": [
    ["transform-runtime", {
      "regenerator": true
    }]
  ]
}

Hinweis Wenn Sie babel 7 verwenden, wurde das Paket in @ babel / plugin-transform-runtime umbenannt .


11
Ich musste nicht babel-runtimeasynchron warten, um zu arbeiten. Ist das korrekt? Bearbeiten: Ich führe die Code-Server-Seite aus. :)
GijsjanB

8
Wenn Sie es ohne Babel-Laufzeit verwenden konnten, liegt es daran, dass es bereits in Ihrem Abhängigkeitsbaum enthalten ist. Beachten Sie also, dass Babel-Runtime möglicherweise nicht für Ihre Benutzer verfügbar ist, wenn Sie eine Bibliothek schreiben und Babel-Runtime als Entwicklungsabhängigkeit eingeht. Sie müssen es als normale Abhängigkeit für die Verteilung einschließen.
Neverfox

22
nur babel-plugin-transform-runtimeerforderlich. Klappt wunderbar.
Saike

9
Diese Lösung ist nicht in Ordnung, da ein zusätzlicher Browserify- oder Webpack-Job erforderlich ist, um die requirevom transform-runtimePlugin hinzugefügten Aufrufe zu erweitern .
Finesse

9
Beachten Sie, dass Sie für Babel 7 laufen müssennpm install --save-dev @babel/plugin-transform-runtime
Andrey Semakin

195

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:

npm install --save @babel/runtime 
npm install --save-dev @babel/plugin-transform-runtime

Und fügen Sie in .babelrc Folgendes hinzu:

{
    "presets": ["@babel/preset-env"],
    "plugins": [
        ["@babel/transform-runtime"]
    ]
}

Wie wir es ohne .babelrc machen können (nur mit Webpack-Konfigurationsdatei)
Pouya Jabbarisani

2
Das Dokument zeigt die Verwendung als "plugins": ["@babel/plugin-transform-runtime"]und nicht als "plugins": [ ["@babel/transform-runtime"] ]hier. Anderer Plugin-Name. Beides funktioniert. Aber welches ist das richtige? ..
kyw

5
Ich bekomme Anforderung ist nicht definiert, wenn ich dieser Methode
Batman

1
@kyw am besten immer den Dokumenten folgen - kein Unterschied außer Konvention.
Matt Shirley

4
Das Hinzufügen @babel/transform-runtimezu 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 } ]
Hari

105

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:

entry: {
    index: ['babel-polyfill', './index.js']
}

Ich glaube, ich habe die neuesten Best Practices gefunden.

Überprüfen Sie dieses Projekt: https://github.com/babel/babel-preset-env

yarn add --dev babel-preset-env

Verwenden Sie Folgendes als Babel-Konfiguration:

{
  "presets": [
    ["env", {
      "targets": {
        "browsers": ["last 2 Chrome versions"]
      }
    }]
  ]
}

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-envdie 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 awaitund 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. Dank babel-preset-envbefreit es mich von der Hölle der Babel-Konfiguration.


3
Das funktioniert wirklich. Der einzige Nachteil ist eine Reihe von Abhängigkeiten, babel-preset-envaber ich denke, es lohnt sich. Ich liebe auch den deklarativen Stil. Auch yarn installist jetztyarn add
Roman Usherenko

1
@gargantuan Ja, das tut es.
Tyler Long

3
Keine wirkliche Lösung, wenn Sie auf ältere Browser oder Knotenversionen abzielen möchten .
Rohan Orton

2
Nur für den Fall, dass es nicht offensichtlich ist ... diese empfohlene Lösung funktioniert NICHT, wenn Sie Ihren Code benötigen, um in IE11
Maurice

7
Warum hat das so viele Stimmen? Dies funktioniert nur, weil es nicht mehr async / await transformiert und daher die regeneratorRuntime nicht mehr benötigt und weil es nicht transformiert ist, funktioniert es nicht in Browsern, die es nicht unterstützen.
Shikyo

47

Wenn Sie nicht alle bereitgestellten Module benötigen babel-polyfill, können babel-regenerator-runtimeSie alternativ einfach in Ihrer Webpack-Konfiguration Folgendes angeben :

module.exports = {
  entry: ['babel-regenerator-runtime', './test.js'],

  // ...
};

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 installieren npm i -D babel-regenerator-runtime.


Dies scheint die bequemste Lösung zu sein. Die meisten Browser unterstützen jedoch Generatoren, sodass diese Lösung wahrscheinlich nicht die optimale ist. Siehe: blogs.candoerz.com/question/213492/…
Kitanotori

Was ist, wenn Sie kein Webpack verwenden?
Batman

38

Meine einfache Lösung:

npm install --save-dev babel-plugin-transform-runtime
npm install --save-dev babel-plugin-transform-async-to-generator

.babelrc

{
  "presets": [
    ["latest", {
      "es2015": {
        "loose": true
      }
    }],
    "react",
    "stage-0"
  ],
  "plugins": [
    "transform-runtime",
    "transform-async-to-generator"
  ]
}

1
In Plugins fehlt "Transform-Async-to-Generator". Ich musste das auch hinzufügen, damit es funktioniert
GabrielBB

@GabrielBB Ich habe den Beitrag so bearbeitet, dass er ein vollständiges Beispiel ist.
Webnoob

2
Wird loose: truebenötigt?
Tom Söderlund

Wenn Sie dies verwenden, wird meiner Datei "require" hinzugefügt und "require" ist im Browser undefiniert.
Batman

lose: wahr wird NICHT benötigt. Was Sie in Ihrer .babelrc wirklich brauchen, ist: {"presets": ["es2015", "react", "stage-2"], "plugins": ["transform-runtime", "transform-async-to-generator" "]}
Efe Ariaroo

29

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

presets: [
  ["@babel/preset-env", {
    useBuiltIns: "usage",
    corejs: 3, // or 2,
    targets: {
        firefox: "64", // or whatever target to choose .    
    },
  }]
]

wird automatisch regenerator-runtimeund core-jsentsprechend Ihrem Ziel verwendet . Sie müssen nichts manuell importieren. Vergessen Sie nicht, Laufzeitabhängigkeiten zu installieren:

npm i --save regenerator-runtime core-js

Alternativ können Sie useBuiltIns: "entry"es manuell einstellen und importieren:

import "regenerator-runtime/runtime";
import "core-js/stable"; // if polyfills are also needed

Option 2: @babel/transform-runtime mit @babel/runtime(keine globale Verschmutzung)

{
  "plugins": [
    [
      "@babel/plugin-transform-runtime",
      {
        "regenerator": true,
        corejs: 3 // or 2; if polyfills needed
        ...
      }
    ]
  ]
}

Es installieren:

npm i -D @babel/plugin-transform-runtime
npm i @babel/runtime

Wenn Sie Kern-js polyfills zu verwenden, installieren Sie @babel/runtime-corejs2oder @babel/runtime-corejs3stattdessen finden Sie hier .

Prost


2
Dies ist die richtige, aktuellste Antwort und hat mir bei einem Problem mit meinem aktuellen Projekt geholfen. Vielen Dank!
CDPautsch

2
{"presets": [["@ babel / preset-env", {"Ziele": {"esmodules": true}}]]} Dies hat mir bei einem node.js Build geholfen
Smolin Pavel

3
Ich meine, ich wusste das schon, aber um anderen zu helfen, sollte dies die richtige Antwort sein. Freundliche Grüße!
Niewiadomski Paweł

Hinweis: Ich denke, es ist sinnvoll, den Babel 7-Thread zu verwenden , damit versionbezogene Fehler besser unterschieden werden können. Eine spezifischere Version dieser Antwort finden Sie hier (aber die obigen Aussagen gelten immer noch)
ford04

16

babel-regenerator-runtimeist jetzt veraltet , stattdessen sollte man verwenden regenerator-runtime.

So verwenden Sie den Laufzeitgenerator mit webpackund babelv7:

installieren regenerator-runtime:

npm i -D regenerator-runtime

Und dann innerhalb der Webpack-Konfiguration hinzufügen:

entry: [
  'regenerator-runtime/runtime',
  YOUR_APP_ENTRY
]

Dies sollte die akzeptierte Antwort sein, Babel-Polyfill fügt viel zu viel anderes hinzu
Shikyo

Arbeite perfekt für mich ... Vielen Dank
Leandro William

1
Diese Methode enthält jedoch immer die Laufzeit. Ich glaube, es macht den Zweck von @babel/preset-env's useBuiltInszunichte, Laufzeit basierend auf Ihren Zielbrowsern dynamisch einzufügen.
Kyw

13

Aktualisieren Sie Ihre .babelrcDatei gemäß den folgenden Beispielen, es wird funktionieren.

Wenn Sie @babel/preset-envPaket verwenden

{
  "presets": [
    [
      "@babel/preset-env", {
        "targets": {
          "node": "current"
        }
      }
    ]
  ]
}
or if you are using babel-preset-env package

{
  "presets": [
    [
      "env", {
        "targets": {
          "node": "current"
        }
      }
    ]
  ]
}

2
Würden Sie bitte Ihre Antwort erklären? was "node": "current" macht
Vishal Solanki

Ich würde auch gerne wissen, was dies bewirkt und ob es eine empfohlene Lösung ist - dh es gefährdet nichts und ist "zukunftssicher" (so viel wie alles im Moment sein kann). targetsscheint zu beziehen dies : the environments you support/target for your project, während targets.nodeist 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
user1063287

FWIW, ich habe den zweiten Block verwendet, der in der Antwort definiert (und dabei entfernt "stage-0") wurde, und der Regeneratorfehler ist verschwunden .
user1063287

1
@BunkerBoy Der Einfachheit halber können Sie "node": "current" verwenden, um nur die erforderlichen Polyfills und Transformationen für die Node.js-Version einzuschließen, mit der Sie Babel
Zero

Also muss ich dafür keine Polyfills installieren?
Vishal Solanki

12

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 definedFehler geben würde .

Ändern Sie diesen Code

import "babel-polyfill"
async function myFunc(){ }

dazu

import "babel-polyfill"
var myFunc = async function(){}

um zu verhindern, dass es über den Polyfill-Import gehoben wird.


5
a; kgjablrsdkjfjasnkljfbajklfdablkhjnfl; traurig, dass ich den Verstand verlor und du mich gerettet hast Ich liebe dich
John R Perry

11

Ab Oktober 2019 funktionierte dies für mich:

Fügen Sie dies der Voreinstellung hinzu.

 "presets": [
      "@babel/preset-env"
    ]

Installieren Sie dann die Regenerator-Laufzeit mit npm.

npm i regenerator-runtime

Und dann in Ihrer Hauptdatei verwenden: (dieser Import wird nur einmal verwendet)

import "regenerator-runtime/runtime";

Auf diese Weise können Sie async awaitsin Ihrer Datei verwenden und die entfernenregenerator error


Wenn Sie keinen Wert für useBuiltInsfestlegen, wird dieser standardmäßig auf gesetzt false. 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.
bela53

10

Wenn Sie verwenden, müssen Sie babel-preset-stage-2nur das Skript mit starten --require babel-polyfill.

In meinem Fall wurde dieser Fehler durch MochaTests ausgelöst .

Im Folgenden wurde das Problem behoben

mocha \"server/tests/**/*.test.js\" --compilers js:babel-register --require babel-polyfill


9

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:

  1. Wie oben oft erwähnt, musste ich meinem Webpack-Eintragsarray babel-polyfill hinzufügen:

    ...
    
    Eintrag: ['babel-polyfill', './index.js'],
    
    ...
  2. Ich musste meine .babelrc aktualisieren, um die Kompilierung von async / await in Generatoren zu ermöglichen:

    {
      "Voreinstellungen": ["es2015"],
      "Plugins": ["Async-Generator transformieren"]
    }}

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:

 "devDependencies": {
    "babel-loader": "^6.2.2",
    "babel-plugin-transform-async-to-generator": "^6.5.0",
    "babel-polyfill": "^6.5.0",
    "babel-preset-es2015": "^6.5.0",
    "webpack": "^1.12.13"
 }

Vollständiger Code:

Ich habe den Code von einem wirklich hilfreichen und prägnanten GitHub-Inhalt erhalten, den Sie hier finden .


3
Es ist besser, Preset envanstelle von zu verwenden es2015. envbeinhaltet es2015bereits.
Neurotransmitter

9

Ich hatte dieses Problem in Chrome. Ähnlich wie bei RienNeVaPlus Antwort löste dies das Problem für mich:

npm install --save-dev regenerator-runtime

Dann in meinem Code:

import 'regenerator-runtime/runtime';

Gerne vermeiden wir die zusätzlichen 200 kB ab babel-polyfill.


8

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:

"presets": [
  "es2016",
  // etc...
]

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 .


7

Ich habe diesen Fehler durch die Installation von babel-polyfill behoben

npm install babel-polyfill --save

dann habe ich es in meinen App-Einstiegspunkt importiert

import http from 'http';
import config from 'dotenv';
import 'babel-polyfill';
import { register } from 'babel-core';
import app from '../app';

Zum Testen habe ich --require babel-polyfill in mein Testskript aufgenommen

"test": "export NODE_ENV=test|| SET NODE_ENV=test&& mocha --compilers 
  js:babel-core/register --require babel-polyfill server/test/**.js --exit"

7

Dieser Fehler wird verursacht, wenn async/awaitFunktionen ohne die richtigen Babel-Plugins verwendet werden. Ab März 2020 sollten Sie nur noch Folgendes tun. ( @babel/polyfillund viele der akzeptierten Lösungen sind in Babel veraltet. Weitere Informationen finden Sie in den Babel-Dokumenten. )

Geben Sie in die Befehlszeile Folgendes ein:

npm install --save-dev @babel/plugin-transform-runtime

Fügen Sie in Ihrer babel.config.jsDatei 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:

module.exports = {
  presets: ['@babel/preset-react', '@babel/preset-env'],
  plugins: ['@babel/plugin-proposal-class-properties', 
  '@babel/plugin-transform-runtime'],
};

Was mich immer wieder überrascht ist, wie faul Entwickler sind. Babel-Entwickler haben beschlossen, die Funktionalität zu verwerfen. Sie können davon ausgehen, dass dies zu einem Problem wird. Warum nicht die Leute wissen lassen, was die wahrscheinlichste Absicht war und was sie tun sollten, um das Problem zu beheben? Aber nein, lassen Sie uns nur eine Nachricht zeigen, die für Neulinge absolut nutzlos ist.
Pavel Voronin

Dies funktioniert nicht imgur.com/a/2Ea8WDk
unwahrscheinlich

Hat super für mich funktioniert. Mein nicht reagierendes Projekt .babelrcsieht folgendermaßen aus: `` `{" presets ": [" @ babel / preset-env "]," plugins ": [" @ babel / plugin-transform-runtime "]}` `
Anthony

6

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

"name": "es6",
 "version": "1.0.0",
   "babel-core": "^6.24.1",
    "babel-loader": "^6.4.1",
    "babel-polyfill": "^6.23.0",
    "babel-preset-es2015": "^6.24.1",
    "webpack": "^2.3.3",
    "webpack-dev-server": "^2.4.2"

Wenn Sie diese oder eine andere UP-Version von Npm und allen anderen verwenden, müssen Sie nur Folgendes ändern:

webpack.config.js

module.exports = {
  entry: ["babel-polyfill", "./app/js"]
};

Nach dem Ändern von webpack.config.jsDateien Fügen Sie diese Zeile einfach oben in Ihren Code ein.

import "babel-polyfill";

Überprüfen Sie jetzt, ob alles in Ordnung ist. Referenz LINK

Danke auch @BrunoLM für seine nette Antwort.


1
Warum sollte er Webpack verwenden, wenn es sich um einen Backend-Service handelt? Ihre Antwort impliziert, dass er Webpack verwenden muss?
Spock

1
@Spock, ich habe darüber nachgedacht. Ich hatte das gleiche Problem und habe mein Problem auf einfache Weise gelöst. Ich denke, es ist eine positive Antwort für Webpack-Benutzer und Hasen, die mehr richtige Antworten haben, damit Sie jedem anderen folgen können.
MD Ashik

Warum du das Ding drückst, musst du abstimmen !!!! Kannst du einen Grund sagen, wenn du mir helfen willst?
MD Ashik

6

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 das ReferenceError: regeneratorRuntime is not definedzuerst 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:

  "scripts": {
    //"test": "mocha --compilers js:babel-core/register"
    //https://github.com/mochajs/mocha/wiki/compilers-deprecation
    "test": "mocha --require babel-core/register"
  },
  "devDependencies": {
    "babel-core": "^6.26.3",
    "babel-preset-env": "^1.7.0",
    "mocha": "^5.2.0"
  },
  //better to set it .bablerc, I list it here for brevity and it works too.
  "babel": {
    "presets": [
      ["env",{
        "targets": {
          "node": "current"
           "chrome": 66,
           "firefox": 60,
        },
        "debug":true
      }]
    ]
  }


4

1 - Installieren Sie die babel-plugin-transform-async-to-module-Methode, babel-polyfil, bluebird, babel-preset-es2015, babel-core:

npm install babel-plugin-transform-async-to-module-method babel-polyfill 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:

{
    "presets": ["es2015"],
    "plugins": [
      ["transform-async-to-module-method", {
        "module": "bluebird",
        "method": "coroutine"
      }]
    ]
}

Quelle: http://babeljs.io/docs/plugins/transform-async-to-module-method/


3

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/awaitTests funktionieren, musste ich nur die mocha --require babel-polyfillOption hinzufügen .


3

Ich erhalte diesen Fehler mit gulp with rollup, als ich versuchte, ES6-Generatoren zu verwenden:

gulp.task('scripts', () => {
  return rollup({
    entry: './app/scripts/main.js',
    format: "iife",
    sourceMap: true,
    plugins: [babel({
      exclude: 'node_modules/**',
      "presets": [
        [
          "es2015-rollup"
        ]
      ],
      "plugins": [
        "external-helpers"
      ]
    }),
    includePaths({
      include: {},
      paths: ['./app/scripts'],
      external: [],
      extensions: ['.js']
    })]
  })

  .pipe(source('app.js'))
  .pipe(buffer())
  .pipe(sourcemaps.init({
    loadMaps: true
  }))
  .pipe(sourcemaps.write('.'))
  .pipe(gulp.dest('.tmp/scripts'))
  .pipe(reload({ stream: true }));
});

Ich kann sagen, dass die Lösung darin bestand, babel-polyfillals Laubenkomponente Folgendes aufzunehmen:

bower install babel-polyfill --save

und fügen Sie es als Abhängigkeit in index.html hinzu:

<script src="/bower_components/babel-polyfill/browser-polyfill.js"></script>

Vielen Dank. Das hat bei mir funktioniert. Ich wusste nicht, dass ich das Skript-Tag hinzufügen muss, damit es auf der Clientseite funktioniert.
Raza

3

Für Leute, die die babel-polyfillVersion 7 ^ verwenden webpackmöchten, tun Sie dies mit ver3 ^.

Npm installieren Sie das Modul npm i -D @babel/polyfill

Dann tun Sie dies in Ihrer webpackDatei in Ihrem entryPunkt

entry: ['@babel/polyfill', path.resolve(APP_DIR, 'App.js')],

3

Mein funktionierendes Babel 7 Boilerplate für die Reaktion mit der Regenerator-Laufzeit:

.babelrc

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "node": true,
        },
      },
    ],
    "@babel/preset-react",
  ],
  "plugins": [
    "@babel/plugin-syntax-class-properties",
    "@babel/plugin-proposal-class-properties"
  ]
}

package.json

...

"devDependencies": {
  "@babel/core": "^7.0.0-0",
  "@babel/plugin-proposal-class-properties": "^7.4.4",
  "@babel/plugin-syntax-class-properties": "^7.2.0",
  "@babel/polyfill": "^7.4.4",
  "@babel/preset-env": "^7.4.5",
  "@babel/preset-react": "^7.0.0",
  "babel-eslint": "^10.0.1",
...

main.js

import "@babel/polyfill";

....

2

Wenn Sie eine App erstellen, benötigen Sie nur das @babel/preset-envund @babel/polyfill:

npm i -D @babel/preset-env
npm i @babel/polyfill

(Hinweis: Sie müssen die Pakete core-jsund nicht installieren, regenerator-runtimeda beide von @ babel / polyfill installiert wurden.)

Dann in .babelrc:

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "useBuiltIns": "entry"  // this is the key. use 'usage' for further codesize reduction, but it's still 'experimental'
      }
    ]
  ]
}

Legen Sie nun Ihre Zielumgebungen fest. Hier machen wir es in der .browserslistrcDatei:

# Browsers that we support

>0.2%
not dead
not ie <= 11
not op_mini all

Wenn Sie mitgegangen sind useBuiltIns: "entry", setzen Sie es import @babel/polyfilloben in Ihre Eingabedatei. Ansonsten sind Sie fertig.

Mit dieser Methode werden diese Polyfills und die 'Regenerator-Laufzeit'-Datei (Behebung Ihres regeneratorRuntime is not definedProblems hier) NUR dann selektiv importiert, wenn sie von einer Ihrer Zielumgebungen / Browser benötigt werden.


2

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

npm install --save-dev @babel/plugin-transform-async-to-generator

Verwendung in .babelrc

 { 
     "presets": ["@babel/preset-env"],
     "plugins": ["@babel/plugin-transform-async-to-generator"]
 }

und Verwenden von babel polyfill https://babeljs.io/docs/en/babel-polyfill

Installation

npm install --save @babel/polyfill

webpack.config.js

module.exports = {
  entry: ["@babel/polyfill", "./app/js"],
};

2

Im Jahr 2019 mit Babel 7.4.0+wurde das babel-polyfillPaket zugunsten der direkten Einbeziehung core-js/stable( core-js@3+um Polyfill-ECMAScript-Funktionen) und regenerator-runtime/runtime(zur Verwendung transpilierter Generatorfunktionen erforderlich ) abgelehnt :

import "core-js/stable";
import "regenerator-runtime/runtime";

Informationen aus der babel-polyfill Dokumentation .


2

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/regenerator-runtime@0.13.1/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


1

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


Ich verstehe nicht, warum die Abstimmung und der Kommentar. Ich wollte es für Firefox-Browser. Außerdem habe ich die Informationen direkt von der Babel-Website selbst übernommen. Der Kommentar hat mir nicht geholfen, das Problem zu lösen, als ich es ausprobiert habe.
Petros Kyriakou
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.