J'essaie d'utiliser async, j'attends de zéro sur Babel 6, mais je reçois regeneratorRuntime n'est pas défini.
Fichier .babelrc
{
"presets": [ "es2015", "stage-0" ]
}
fichier package.json
"devDependencies": {
"babel-core": "^6.0.20",
"babel-preset-es2015": "^6.0.15",
"babel-preset-stage-0": "^6.0.15"
}
fichier .js
"use strict";
async function foo() {
await bar();
}
function bar() { }
exports.default = foo;
L'utiliser normalement sans async / wait fonctionne très bien. Des idées sur ce que je fais mal?
javascript
node.js
babeljs
BrunoLM
la source
la source
Réponses:
babel-polyfill
( obsolète depuis Babel 7.4) est requis. Vous devez également l'installer pour que l'async / attende de fonctionner.package.json
.babelrc
.js avec async / wait (exemple de code)
Dans le fichier de démarrage
Si vous utilisez webpack, vous devez le mettre comme première valeur de votre
entry
tableau dans votre fichier de configuration webpack (généralementwebpack.config.js
), selon le commentaire @Cemen:Si vous souhaitez exécuter des tests avec babel, utilisez:
la source
require("babel-polyfill")
qui ne fonctionne pas, vous ajoutez"babel-polyfill"
dans votreentry
dans config, comme ceci:entry: ["babel-polyfill", "src/main.js"]
. Cela a fonctionné pour moi, y compris l'utilisation dans webpack-dev-server avec HMR.devDependency
si vous utilisez webpack car il "compilera" ensuite les fichiers avant de s'exécuter.dependency
si vous n'utilisez pas webpack et que vous avez besoin de babel.Outre polyfill, j'utilise babel-plugin-transform-runtime . Le plugin est décrit comme:
Il inclut également la prise en charge d'Async / Wait ainsi que d'autres modules intégrés d'ES 6.
Dans
.babelrc
, ajoutez le plugin d'exécutionla source
babel-runtime
d'obtenir asynchrone pour travailler. Est-ce exact? Edit: j'exécute le côté serveur de code. :)babel-plugin-transform-runtime
requis. Fonctionne comme un charme.require
appels ajoutés par letransform-runtime
plug - in.npm install --save-dev @babel/plugin-transform-runtime
Utilisateurs Babel 7
J'ai eu du mal à contourner ce problème car la plupart des informations concernaient les versions antérieures de Babel. Pour Babel 7, installez ces deux dépendances:
Et, dans .babelrc, ajoutez:
la source
"plugins": ["@babel/plugin-transform-runtime"]
, plutôt que"plugins": [ ["@babel/transform-runtime"] ]
ici. Nom de plugin différent. Les deux œuvres. Mais lequel est le bon? ..@babel/transform-runtime
de plugins a provoqué une erreur «les exportations ne sont pas définies» pour moi. Je l'ai changé pour obtenir async pour travailler dans Babel7:["@babel/plugin-transform-runtime", { "regenerator": true } ]
Mise à jour
Cela fonctionne si vous définissez la cible sur Chrome. Mais cela pourrait ne pas fonctionner pour d'autres cibles, veuillez vous référer à: https://github.com/babel/babel-preset-env/issues/112
Cette réponse n'est donc PAS tout à fait appropriée à la question d'origine. Je vais le garder ici comme référence
babel-preset-env
.Une solution simple consiste à ajouter
import 'babel-polyfill'
au début de votre code.Si vous utilisez webpack, une solution rapide consiste à ajouter
babel-polyfill
comme indiqué ci-dessous:Je pense avoir trouvé la dernière meilleure pratique.
Consultez ce projet: https://github.com/babel/babel-preset-env
Utilisez ce qui suit comme configuration babel:
Ensuite, votre application devrait être prête à utiliser les 2 dernières versions du navigateur Chrome.
Vous pouvez également définir Node comme cibles ou affiner la liste des navigateurs selon https://github.com/ai/browserslist
Dis-moi quoi, ne me dis pas comment.
J'aime vraiment
babel-preset-env
la philosophie de: dites-moi quel environnement vous voulez soutenir, ne me dites PAS comment les soutenir. C'est la beauté de la programmation déclarative.J'ai testé
async
await
et ils fonctionnent. Je ne sais pas comment ils fonctionnent et je ne veux vraiment pas savoir. Je veux plutôt passer mon temps sur mon propre code et ma logique métier. Merci àbabel-preset-env
, cela me libère de l'enfer de la configuration Babel.la source
babel-preset-env
mais je pense que ça vaut le coup. J'adore aussi le style déclaratif. Est égalementyarn install
maintenantyarn add
Alternativement, si vous n'avez pas besoin de tous les modules
babel-polyfill
fournis, vous pouvez simplement spécifierbabel-regenerator-runtime
dans votre configuration webpack:Lorsque vous utilisez webpack-dev-server avec HMR, cela réduit considérablement le nombre de fichiers qu'il doit compiler sur chaque build. Ce module est installé dans le cadre de
babel-polyfill
si vous avez déjà que vous êtes bien, sinon vous pouvez l'installer séparément avecnpm i -D babel-regenerator-runtime
.la source
Ma solution simple:
.babelrc
la source
loose: true
nécessaire?Babel 7.4.0 ou version ultérieure (core-js 2/3)
Depuis Babel 7.4.0 , il
@babel/polyfill
est obsolète .En général, il existe deux façons d'installer des polyfills / régénérateur: via l'espace de noms global (Option 1) ou comme ponyfill (Option 2, sans pollution globale).
Option 1:
@babel/preset-env
utilisera automatiquement
regenerator-runtime
etcore-js
selon votre cible . Pas besoin d'importer quoi que ce soit manuellement. N'oubliez pas d'installer les dépendances d'exécution:Vous pouvez également le définir
useBuiltIns: "entry"
et l'importer manuellement:Option 2:
@babel/transform-runtime
avec@babel/runtime
(pas de pollution de portée mondiale)Installez-le:
Si vous utilisez des polyfills core-js, vous installez
@babel/runtime-corejs2
ou à la@babel/runtime-corejs3
place, voir ici .À votre santé
la source
babel-regenerator-runtime
est désormais obsolète , il faut plutôt utiliserregenerator-runtime
.Pour utiliser le générateur d'exécution avec
webpack
etbabel
v7:installer
regenerator-runtime
:Et puis ajoutez dans la configuration du webpack:
la source
@babel/preset-env
'suseBuiltIns
d'insérer dynamiquement le runtime en fonction de vos navigateurs cibles.Mettez à jour votre
.babelrc
fichier selon les exemples suivants, cela fonctionnera.Si vous utilisez un
@babel/preset-env
packagela source
targets
semble se référer à ce :the environments you support/target for your project
tout entargets.node
est ce :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"
dans le processus) et l'erreur du régénérateur a disparu.Faites attention aux fonctions hissées
J'avais à la fois mon «importation polyfill» et ma «fonction asynchrone» dans le même fichier, mais j'utilisais la syntaxe de la fonction qui la hisse au-dessus du polyfill, ce qui me donnerait l'
ReferenceError: regeneratorRuntime is not defined
erreur.Changer ce code
pour ça
pour éviter qu'il ne soit hissé au-dessus de l'importation de polyfill.
la source
En octobre 2019, cela fonctionnait pour moi:
Ajoutez ceci au préréglage.
Installez ensuite le régénérateur-runtime à l'aide de npm.
Et puis dans votre fichier principal, utilisez: (cette importation n'est utilisée qu'une seule fois)
Cela vous permettra d'utiliser
async
awaits
dans votre fichier et de supprimer leregenerator error
la source
useBuiltIns
défaut serafalse
. Cela n'importera pas automatiquement les polyfills en fonction de l'environnement cible, ce qui sape un peu l'objectif"@babel/preset-env"
. Voici également un commentaire connexe de l'un des développeurs de babel.Si vous utilisez,
babel-preset-stage-2
il suffit de démarrer le script avec--require babel-polyfill
.Dans mon cas, cette erreur a été générée par des
Mocha
tests.Suite à la résolution du problème
mocha \"server/tests/**/*.test.js\" --compilers js:babel-register --require babel-polyfill
la source
J'ai commencé à obtenir cette erreur après avoir converti mon projet en projet dactylographié. D'après ce que je comprends, le problème provient de l'async / attente qui n'est pas reconnu.
Pour moi, l'erreur a été corrigée en ajoutant deux choses à ma configuration:
Comme mentionné ci-dessus à plusieurs reprises, j'ai dû ajouter babel-polyfill dans mon tableau d'entrée webpack:
J'avais besoin de mettre à jour mon .babelrc pour permettre la compilation de async / wait dans les générateurs:
Dépendances de développement:
J'ai également dû installer quelques éléments dans mes devDependencies dans mon fichier package.json. À savoir, il me manquait le babel-plugin-transform-async-to-generator, babel-polyfill et le babel-preset-es2015:
Gist Code complet:
J'ai obtenu le code d'un gist GitHub vraiment utile et concis que vous pouvez trouver ici .
la source
env
plutôt quees2015
.env
comprendes2015
déjà.J'ai eu ce problème dans Chrome. Semblable à la réponse de RienNeVaPlu͢s, cela l'a résolu pour moi:
Puis dans mon code:
Heureux d'éviter les 200 Ko supplémentaires de
babel-polyfill
.la source
Cette erreur se produit lorsque les
async/await
fonctions sont utilisées sans les plug-ins Babel appropriés. À partir de mars 2020, ce qui suit devrait être tout ce que vous devez faire. (@babel/polyfill
et beaucoup de solutions acceptées ont été dépréciées dans Babel. En savoir plus dans les documents Babel. )Dans la ligne de commande, tapez:
Dans votre
babel.config.js
fichier, ajoutez ce plugin@babel/plugin-transform-runtime
. Remarque: l'exemple ci-dessous inclut les autres préréglages et plugins que j'ai pour un petit projet React / Node / Express sur lequel j'ai travaillé récemment:la source
.babelrc
ressemble à ceci: `` `` {"presets": ["@ babel / preset-env"], "plugins": ["@ babel / plugin-transform-runtime"]} ``Vous obtenez une erreur car les générateurs d'utilisation asynchrone / attendent, qui sont une fonctionnalité ES2016, pas ES2015. Une façon de résoudre ce problème consiste à installer le préréglage babel pour ES2016 (
npm install --save babel-preset-es2016
) et à compiler vers ES2016 au lieu de ES2015:Comme les autres réponses le mentionnent, vous pouvez également utiliser polyfills (mais assurez-vous de charger le polyfill avant de lancer tout autre code). Alternativement, si vous ne souhaitez pas inclure toutes les dépendances de polyfill, vous pouvez utiliser le babel-régénérateur-runtime ou le babel-plugin-transform-runtime .
la source
J'ai corrigé cette erreur en installant babel-polyfill
puis je l'ai importé dans le point d'entrée de mon application
pour les tests, j'ai inclus --requis babel-polyfill dans mon script de test
la source
Nouvelle réponse Pourquoi suivez-vous ma réponse?
Ans: Parce que je vais vous donner une réponse avec le dernier projet de mise à jour de la version npm.
14/04/2017
Si vous utilisez cette version ou une version UP de Npm et toutes les autres ... il suffit donc de changer:
webpack.config.js
Après avoir changé les
webpack.config.js
fichiers, ajoutez simplement cette ligne en haut de votre code.Maintenant, vérifiez que tout va bien. LIEN de référence
Merci également à @BrunoLM pour sa belle réponse.
la source
Les navigateurs ciblés que je dois prendre en charge prennent déjà en charge async / wait, mais lors de l'écriture de tests mocha, sans le paramètre approprié, j'ai toujours cette erreur.
La plupart des articles que je googlé sont obsolètes, y compris la réponse acceptée et haute réponses voté ici, à savoir que vous n'avez pas besoin
polyfill
,babel-regenerator-runtime
,babel-plugin-transform-runtime
. etc. si votre ou vos navigateurs cibles prennent déjà en charge async / wait (bien sûr, si vous n'avez pas besoin de polyfill)Je ne veux pas non plus l'utiliser
webpack
.La réponse de Tyler Long est en fait sur la bonne voie depuis qu'il l'a suggéré
babel-preset-env
(mais je l'ai d'abord omise car il a mentionné le polifill au début). J'ai quand même eu leReferenceError: regeneratorRuntime is not defined
premier, puis j'ai réalisé que c'était parce que je n'avais pas fixé la cible. Après avoir défini la cible pour le nœud, je corrige l'erreur régénérateurRuntime:la source
Aux utilisateurs babel7 et ParcelJS> = 1.10.0 utilisateurs
.babelrc
extrait de https://github.com/parcel-bundler/parcel/issues/1762
la source
1 - Installez la méthode babel-plugin-transform-async-to-module, babel-polyfil, bluebird, babel-preset-es2015, babel-core:
2 - Ajoutez votre polyfill js babel:
import 'babel-polyfill';
3 - Ajoutez un plugin dans votre .babelrc:
Source: http://babeljs.io/docs/plugins/transform-async-to-module-method/
la source
J'ai eu une configuration
avec webpack à l' aide
presets: ['es2015', 'stage-0']
et mocha qui a été l' exécution des tests compilés par webpack.
Pour faire fonctionner mes
async/await
tests in, tout ce que j'avais à faire était d'ajouter unemocha --require babel-polyfill
option.la source
J'obtiens cette erreur en utilisant gulp avec rollup lorsque j'ai essayé d'utiliser des générateurs ES6:
Il se peut que la solution consiste à inclure
babel-polyfill
comme composant de tonnelle:et ajoutez-le comme dépendance dans index.html:
la source
Pour les personnes cherchant à utiliser la
babel-polyfill
version 7 ^ faites-le avec lawebpack
ver3 ^.Npm installer le module
npm i -D @babel/polyfill
Ensuite, dans votre
webpack
fichier dans votreentry
point, procédez comme suitla source
Ma chaudière de travail babel 7 pour réagir avec le temps de régénération du régénérateur:
.babelrc
package.json
main.js
la source
Si vous créez une application, vous avez juste besoin des
@babel/preset-env
et@babel/polyfill
:(Remarque: vous n'avez pas besoin d'installer les packages
core-js
etregenerator-runtime
car ils auront tous deux été installés par @ babel / polyfill)Puis dans
.babelrc
:Définissez maintenant vos environnements cibles. Ici, nous le faisons dans le
.browserslistrc
fichier:Enfin, si vous y allez
useBuiltIns: "entry"
, mettezimport @babel/polyfill
en haut de votre fichier d'entrée. Sinon, vous avez terminé.L'utilisation de cette méthode importera de manière sélective ces polyfills et le fichier «régénérateur-runtime» (corrigeant votre
regeneratorRuntime is not defined
problème ici) UNIQUEMENT s'ils sont nécessaires à l'un de vos environnements / navigateurs cibles.la source
pour référence future :
Depuis la version 7.0.0-beta.55 de Babel, les préréglages d'étape ont été supprimés
référez-vous au blog https://babeljs.io/blog/2018/07/27/removing-babels-stage-presets
async wait peut toujours être utilisé par
https://babeljs.io/docs/en/babel-plugin-transform-async-to-generator#usage
installation
utilisation dans .babelrc
et en utilisant babel polyfill https://babeljs.io/docs/en/babel-polyfill
installation
webpack.config.js
la source
En 2019 avec
Babel 7.4.0+
, lebabel-polyfill
package a été déconseillé au profit de l'inclusion directecore-js/stable
(core-js@3+
, pour les fonctionnalités ECMAScript de polyfill) etregenerator-runtime/runtime
(nécessaire pour utiliser les fonctions de générateur transpilées):Informations issues de la
babel-polyfill
documentation .la source
Le moyen le plus simple de résoudre ce «problème de régénérateur non défini» dans votre console:
Vous n'avez pas besoin d'installer de plugins inutiles. Ajoutez simplement:
<script src="https://unpkg.com/[email protected]/runtime.js"></script>
à l'intérieur du corps dans votre index.html. Maintenant, régénérateurRuntime doit être défini une fois que vous exécutez babel et maintenant vos fonctions asynchrones / attendent doivent être compilées avec succès dans ES2015
la source
Si vous utilisez Gulp + Babel pour une interface, vous devez utiliser babel-polyfill
npm install babel-polyfill
puis ajoutez une balise de script à index.html au-dessus de toutes les autres balises de script et référencez babel-polyfill à partir de node_modules
la source