Próbuję użyć asynchronizacji, czekam od zera na Babel 6, ale dostaję generator.Runtime nie jest zdefiniowany.
plik .babelrc
{
"presets": [ "es2015", "stage-0" ]
}
plik package.json
"devDependencies": {
"babel-core": "^6.0.20",
"babel-preset-es2015": "^6.0.15",
"babel-preset-stage-0": "^6.0.15"
}
plik .js
"use strict";
async function foo() {
await bar();
}
function bar() { }
exports.default = foo;
Używanie go normalnie bez asynchronicznego / oczekującego działa dobrze. Jakieś pomysły, co robię źle?
javascript
node.js
babeljs
BrunoLM
źródło
źródło
Odpowiedzi:
babel-polyfill
( nieaktualne od Babel 7.4) jest wymagane. Musisz go również zainstalować, aby async / oczekiwał na działanie.pakiet.json
.babelrc
.js z async / await (przykładowy kod)
W pliku startowym
Jeśli używasz webpacka , musisz umieścić go jako pierwszą wartość
entry
tablicy w pliku konfiguracyjnymwebpack.config.js
webpacka (zwykle ), zgodnie z komentarzem @Cemen:Jeśli chcesz uruchomić testy z Babel, użyj:
źródło
require("babel-polyfill")
który nie działa, należy dodać"babel-polyfill"
do swojegoentry
w konfiguracji, na przykład:entry: ["babel-polyfill", "src/main.js"]
. Działa to dla mnie, w tym zastosowanie w webpack-dev-server z HMR.devDependency
jeśli używasz webpacka , ponieważ wtedy „skompiluje” pliki przed uruchomieniem.dependency
jeśli nie używasz webpacka i potrzebujesz babel.Oprócz polyfill używam środowiska uruchomieniowego babel-plugin-transform-transform . Wtyczka jest opisana jako:
Obejmuje także obsługę asynchronizacji / oczekiwania na działanie oraz innych wbudowanych wersji ES 6.
W
.babelrc
dodaj wtyczkę środowiska wykonawczegoźródło
babel-runtime
czekać, aż asynchronizacja zacznie działać. Czy to jest poprawne? Edycja: korzystam z serwera kodu. :)babel-plugin-transform-runtime
wymagane. Działa jak marzenie.require
połączeń dodawanych przeztransform-runtime
wtyczkę.npm install --save-dev @babel/plugin-transform-runtime
Użytkownicy Babel 7
Miałem problem z obejściem tego, ponieważ większość informacji dotyczyła wcześniejszych wersji babel. W przypadku Babel 7 zainstaluj te dwie zależności:
I w .babelrc dodaj:
źródło
"plugins": ["@babel/plugin-transform-runtime"]
, a nie"plugins": [ ["@babel/transform-runtime"] ]
tutaj. Inna nazwa wtyczki. Obie prace. Ale który z nich jest właściwy? ..@babel/transform-runtime
do wtyczek spowodowało błąd „eksport nie jest zdefiniowany”. Zmieniłem to na to, aby uzyskać asynchronię do pracy w Babel7:["@babel/plugin-transform-runtime", { "regenerator": true } ]
Aktualizacja
Działa, jeśli ustawisz cel na Chrome. Ale to może nie działać w przypadku innych celów, patrz: https://github.com/babel/babel-preset-env/issues/112
Ta odpowiedź NIE jest całkiem odpowiednia dla pierwotnego pytania. Zatrzymam to tutaj jako odniesienie
babel-preset-env
.Prostym rozwiązaniem jest dodanie
import 'babel-polyfill'
na początku kodu.Jeśli używasz webpacka, możesz szybko dodać,
babel-polyfill
jak pokazano poniżej:Myślę, że znalazłem najnowszą najlepszą praktykę.
Sprawdź ten projekt: https://github.com/babel/babel-preset-env
Użyj następujących ustawień jako konfiguracji babel:
W takim razie Twoja aplikacja powinna być dostępna w dwóch ostatnich wersjach przeglądarki Chrome.
Możesz także ustawić Węzeł jako cele lub dostosować listę przeglądarek zgodnie z https://github.com/ai/browserslist
Powiedz mi co, nie mów jak.
naprawdę lubię
babel-preset-env
filozofia: powiedz mi, które środowisko chcesz wspierać, NIE mów mi, jak je wspierać. To piękno deklaratywnego programowania.Przetestowałem
async
await
i działają. Nie wiem, jak one działają i naprawdę nie chcę wiedzieć. Zamiast tego chcę spędzić czas na własnym kodzie i logice biznesowej. Dziękibabel-preset-env
temu uwalnia mnie od piekła konfiguracji Babel.źródło
babel-preset-env
ale myślę, że warto. Uwielbiam też deklaratywny styl. Równieżyarn install
jest terazyarn add
Alternatywnie, jeśli nie potrzebujesz wszystkich modułów
babel-polyfill
, możesz po prostu określićbabel-regenerator-runtime
w konfiguracji webpacka:Gdy używasz serwera webpack-dev-server z HMR, to znacznie zmniejszyło liczbę plików, które musi on skompilować na każdej kompilacji. Ten moduł jest instalowany jako część,
babel-polyfill
więc jeśli masz już wszystko w porządku, w przeciwnym razie możesz zainstalować go osobnonpm i -D babel-regenerator-runtime
.źródło
Moje proste rozwiązanie:
.babelrc
źródło
loose: true
potrzebny?Babel 7.4.0 lub nowszy (core-js 2/3)
Począwszy od Babel 7.4.0 ,
@babel/polyfill
jest przestarzała .Zasadniczo istnieją dwa sposoby instalowania wypełniaczy / regeneratora: poprzez globalną przestrzeń nazw (Opcja 1) lub jako kucyk (Opcja 2, bez globalnego zanieczyszczenia).
Opcja 1:
@babel/preset-env
automatycznie użyje
regenerator-runtime
icore-js
zgodnie z twoim celem . Nie musisz importować niczego ręcznie. Nie zapomnij zainstalować zależności środowiska wykonawczego:Możesz też ustawić
useBuiltIns: "entry"
i zaimportować go ręcznie:Opcja 2:
@babel/transform-runtime
bez@babel/runtime
(brak zanieczyszczenia o zasięgu globalnym)Zainstaluj to:
Jeśli używasz wieloskładników core-js, zainstaluj
@babel/runtime-corejs2
lub@babel/runtime-corejs3
zamiast tego, zobacz tutaj .Twoje zdrowie
źródło
babel-regenerator-runtime
jest teraz przestarzałe , zamiast tego należy użyćregenerator-runtime
.Aby użyć generatora środowiska wykonawczego za pomocą
webpack
ibabel
v7:zainstaluj
regenerator-runtime
:A następnie dodaj w konfiguracji pakietu internetowego:
źródło
@babel/preset-env
„suseBuiltIns
od dynamicznie wstawianie czasu pracy na podstawie swoich przeglądarek docelowych.Zaktualizuj swój
.babelrc
plik zgodnie z następującymi przykładami, zadziała.Jeśli korzystasz z
@babel/preset-env
pakietuźródło
targets
wydaje się odnosić do tego :the environments you support/target for your project
, podczas gdytargets.node
jest to :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"
w procesie) i błąd regeneratora zniknął.Uważaj na podnoszone funkcje
W tym samym pliku miałem zarówno „import wielopełniacza”, jak i „funkcję asynchroniczną”, jednak korzystałem ze składni funkcji, która unosi go powyżej wielokrotnego wypełnienia, co dawałoby mi
ReferenceError: regeneratorRuntime is not defined
błąd.Zmień ten kod
do tego
aby zapobiec jego podniesieniu powyżej importu wielopełniacza.
źródło
Od października 2019 r. Działało to dla mnie:
Dodaj to do ustawienia wstępnego.
Następnie zainstaluj środowisko uruchomieniowe regeneratora przy użyciu npm.
A potem w głównym pliku użyj: (ten import jest używany tylko raz)
Umożliwi to użycie
async
awaits
w pliku i usunięcieregenerator error
źródło
useBuiltIns
domyślnej spowoduje, że będzie tofalse
. To nie będzie automatycznie importować żadnych wypełnień w zależności od docelowego środowiska, co nieco podważa cel"@babel/preset-env"
. Oto także powiązany komentarz jednego z twórców Babel.Jeśli używasz,
babel-preset-stage-2
wystarczy uruchomić skrypt--require babel-polyfill
.W moim przypadku ten błąd został zgłoszony przez
Mocha
testy.Po naprawiono problem
mocha \"server/tests/**/*.test.js\" --compilers js:babel-register --require babel-polyfill
źródło
Ten błąd zacząłem otrzymywać po przekonwertowaniu mojego projektu na projekt maszynopisu. Z tego, co rozumiem, problem wynika z asynchronizacji / oczekiwania na nie rozpoznanie.
Dla mnie błąd został naprawiony przez dodanie dwóch rzeczy do mojej konfiguracji:
Jak wspomniano powyżej wiele razy, musiałem dodać babel-polyfill do mojej tablicy wpisów:
Musiałem zaktualizować plik .babelrc, aby umożliwić kompilację async / czekaj na generatory:
DevDependencies:
Musiałem również zainstalować kilka rzeczy w moich devDependencies w moim pliku package.json. Mianowicie brakowało mi babel-plugin-transform-async-generator, babel-polyfill i babel-preset-es2015:
Pełny kod:
Mam kod z bardzo pomocnej i zwięzłej listy GitHub, którą można znaleźć tutaj .
źródło
env
zamiastes2015
.env
zawieraes2015
już.Miałem ten problem w Chrome. Podobnie do odpowiedzi RienNeVaPlu͢s, to dla mnie rozwiązało:
Następnie w moim kodzie:
Chętnie unikamy dodatkowych 200 kB z
babel-polyfill
.źródło
Wystąpił błąd, ponieważ asynchroniczne / oczekujące na użycie generatorów, które są funkcją ES2016, a nie ES2015. Jednym ze sposobów rozwiązania tego problemu jest zainstalowanie presetu babel dla ES2016 (
npm install --save babel-preset-es2016
) i kompilacja do ES2016 zamiast ES2015:Jak wspomniano w innych odpowiedziach, można również używać wypełniania wielorakiego (należy jednak upewnić się, że załadowano go wielokrotnie przed uruchomieniem innego kodu). Alternatywnie, jeśli nie chcesz uwzględniać wszystkich zależności wypełniania, możesz użyć środowiska uruchomieniowego babel-regenerator lub środowiska uruchomieniowego babel-plugin-transform-transform .
źródło
Naprawiłem ten błąd, instalując babel-polyfill
następnie zaimportowałem go do punktu wejścia aplikacji
do testów załączyłem - wymagaj babel-polyfill w moim skrypcie testowym
źródło
Ten błąd występuje, gdy
async/await
funkcje są używane bez odpowiednich wtyczek Babel. Od marca 2020 r. Następujące czynności powinny być wszystkim, co musisz zrobić. (@babel/polyfill
a wiele przyjętych rozwiązań zostało wycofanych w Babel. Przeczytaj więcej w dokumentach Babel. )W wierszu polecenia wpisz:
W swoim
babel.config.js
pliku dodaj tę wtyczkę@babel/plugin-transform-runtime
. Uwaga: poniższy przykład zawiera inne ustawienia wstępne i wtyczki, które mam dla małego projektu React / Node / Express, nad którym ostatnio pracowałem:źródło
.babelrc
wygląda następująco: `` {"presets": ["@ babel / preset-env"], "plugins": ["@ babel / plugin-transform-runtime"]} ``Nowa odpowiedź Dlaczego podążasz za moją odpowiedzią?
Odp .: Ponieważ dam ci odpowiedź w najnowszym projekcie aktualizacji wersji npm.
14.04.2017
Jeśli używasz tej wersji lub nowszej wersji UP Npm i wszystkich innych ... SO wystarczy zmienić:
webpack.config.js
Po zmianie
webpack.config.js
plików Po prostu dodaj ten wiersz na początku kodu.Teraz sprawdź, czy wszystko jest w porządku. Odnośnik LINK
Również dziękuję @BrunoLM za jego miłą odpowiedź.
źródło
Przeglądarki docelowe, które muszę obsługiwać, już obsługują asynchronizację / czekają, ale podczas pisania testów mokki, bez odpowiedniego ustawienia, nadal pojawia się ten błąd.
Większość artykułów google są nieaktualne, w tym odpowiedź akceptowana i wysokiej głosowało odpowiedź tutaj, czyli nie trzeba
polyfill
,babel-regenerator-runtime
,babel-plugin-transform-runtime
. itp., jeśli docelowa przeglądarka (przeglądarki) obsługuje już asynchronizację / oczekiwanie (oczywiście, jeśli nie, potrzebujesz wypełnienia)Nie chcę też używać
webpack
.Odpowiedź Tylera Longa jest właściwie właściwa, ponieważ zasugerował
babel-preset-env
(ale najpierw ją pominąłem, gdy wspomniał na początku o polifillie). Nadal dostałemReferenceError: regeneratorRuntime is not defined
pierwszy, ale zdałem sobie sprawę, że to dlatego, że nie wyznaczyłem celu. Po ustawieniu celu dla węzła naprawiam błąd czasu regeneratora :źródło
Do użytkowników babel7 i ParcelJS> = 1.10.0 użytkowników
.babelrc
zaczerpnięte z https://github.com/parcel-bundler/parcel/issues/1762
źródło
1 - Zainstaluj metodę babel-plugin-transform-async-to-module, babel-polyfil, bluebird, babel-preset-es2015, babel-core:
2 - Dodaj do swojej polifillu js babel:
import 'babel-polyfill';
3 - Dodaj wtyczkę do swojego .babelrc:
Źródło: http://babeljs.io/docs/plugins/transform-async-to-module-method/
źródło
Miałem konfigurację
z użyciem webpacka
presets: ['es2015', 'stage-0']
i mokki, która uruchamiała testy skompilowane przez webpack.
Aby moje
async/await
testy działały, wystarczyło dodaćmocha --require babel-polyfill
opcję.źródło
Ten błąd pojawia się przy użyciu gulp z pakietem zbiorczym, gdy próbuję użyć generatorów ES6:
Być może rozwiązanie miało zawierać
babel-polyfill
jako element altanki:i dodaj to jako zależność w index.html:
źródło
Dla osób, które chcą korzystać z
babel-polyfill
wersji 7 ^, zrób to zwebpack
ver3 ^.Npm zainstaluj moduł
npm i -D @babel/polyfill
Następnie zrób to w swoim
webpack
plikuentry
źródło
Mój działający kocioł Babel 7 do reagowania na środowisko uruchomieniowe regeneratora:
.babelrc
pakiet.json
main.js
źródło
Jeśli tworzysz aplikację, potrzebujesz tylko
@babel/preset-env
i@babel/polyfill
:(Uwaga: nie musisz instalować pakietów
core-js
iregenerator-runtime
, ponieważ oba zostaną zainstalowane przez @ babel / polyfill)Następnie w
.babelrc
:Teraz ustaw środowiska docelowe. Tutaj robimy to w
.browserslistrc
pliku:Wreszcie, jeśli poszedłeś z
useBuiltIns: "entry"
, włóżimport @babel/polyfill
na górze pliku wejściowego. W przeciwnym razie skończysz.Użycie tej metody spowoduje selektywne zaimportowanie tych wielopełniaczy i pliku „środowiska uruchomieniowego regeneratora” (tutaj naprawiając
regeneratorRuntime is not defined
problem) WYŁĄCZNIE, jeśli są one potrzebne przez dowolne z docelowych środowisk / przeglądarek.źródło
do wykorzystania w przyszłości :
Począwszy od wersji Babel 7.0.0-beta.55 ustawienia wstępne etapów zostały usunięte
Poleć blog https://babeljs.io/blog/2018/07/27/removing-babels-stage-presets
async Oczekiwanie może być nadal używany przez
https://babeljs.io/docs/en/babel-plugin-transform-async-to-generator#usage
instalacja
użycie w .babelrc
i korzystanie z babel polyfill https://babeljs.io/docs/en/babel-polyfill
instalacja
webpack.config.js
źródło
W 2019
Babel 7.4.0+
r.babel-polyfill
Pakiet został wycofany na korzyść bezpośredniego włączeniacore-js/stable
(core-js@3+
do funkcji ECMAScript dla polyfill) iregenerator-runtime/runtime
(potrzebne do korzystania z funkcji generatora transpilowanego):Informacje z
babel-polyfill
dokumentacji .źródło
Najłatwiejszy sposób, aby rozwiązać ten problem dotyczący „regeneratora środowiska uruchomieniowego” w konsoli:
Nie musisz instalować żadnych niepotrzebnych wtyczek. Poprostu dodaj:
<script src="https://unpkg.com/[email protected]/runtime.js"></script>
wewnątrz ciała w pliku index.html. Teraz regeneratorRuntime powinien zostać zdefiniowany po uruchomieniu babel, a teraz funkcje asynchroniczne / oczekujące powinny zostać pomyślnie skompilowane do ES2015
źródło
Jeśli używasz Gulp + Babel jako nakładki, musisz użyć babel-polyfill
npm install babel-polyfill
a następnie dodaj tag script do index.html ponad wszystkimi innymi tagami script i odwołaj się do babel-polyfill z node_modules
źródło