Estou tentando usar assíncrono, aguarde do zero no Babel 6, mas estou obtendo regeneratorRuntime não está definido.
arquivo .babelrc
{
"presets": [ "es2015", "stage-0" ]
}
arquivo package.json
"devDependencies": {
"babel-core": "^6.0.20",
"babel-preset-es2015": "^6.0.15",
"babel-preset-stage-0": "^6.0.15"
}
arquivo .js
"use strict";
async function foo() {
await bar();
}
function bar() { }
exports.default = foo;
Usá-lo normalmente sem o async / waitit funciona muito bem. Alguma idéia do que estou fazendo de errado?
javascript
node.js
babeljs
BrunoLM
fonte
fonte
Respostas:
babel-polyfill
( descontinuado a partir do Babel 7.4) é necessário. Você também deve instalá-lo para obter o funcionamento assíncrono / aguardado.package.json
.babelrc
.js com async / waitit (código de exemplo)
No arquivo de inicialização
Se você estiver usando o webpack, precisará colocá-lo como o primeiro valor da sua
entry
matriz no arquivo de configuração do webpack (normalmentewebpack.config.js
), conforme o comentário do @Cemen:Se você deseja executar testes com o babel, use:
fonte
require("babel-polyfill")
o que não está funcionando, você adicionar"babel-polyfill"
em suaentry
em config, assim:entry: ["babel-polyfill", "src/main.js"]
. Isso funcionou para mim, incluindo o uso no webpack-dev-server com HMR.devDependency
se você estiver usando o webpack, porque ele "compila" os arquivos antes de executar.dependency
se você não estiver usando o webpack e estiver exigindo o babel.Além do polyfill, eu uso o babel-plugin-transform-runtime . O plug-in é descrito como:
Também inclui suporte para assíncrono / espera, juntamente com outros recursos internos do ES 6.
Em
.babelrc
, adicione o plug-in de tempo de execuçãofonte
babel-runtime
ficar assíncrono enquanto aguardava o trabalho. Isso está correto? Edit: Estou executando o lado do servidor de código. :)babel-plugin-transform-runtime
necessário apenas . Funciona como um encanto.require
chamadas adicionadas pelotransform-runtime
plug - in.npm install --save-dev @babel/plugin-transform-runtime
Babel 7 Usuários
Eu tive alguns problemas para contornar isso, pois a maioria das informações era para versões anteriores do babel. Para o Babel 7, instale estas duas dependências:
E, em .babelrc, adicione:
fonte
"plugins": ["@babel/plugin-transform-runtime"]
, e não"plugins": [ ["@babel/transform-runtime"] ]
aqui. Nome de plug-in diferente. Ambos os trabalhos. Mas qual é o correto ..?@babel/transform-runtime
de plugins causou o erro "exportações não definidas" para mim. Eu mudei para isso para obter assíncrono para trabalhar em Babel7:["@babel/plugin-transform-runtime", { "regenerator": true } ]
Atualizar
Funciona se você definir o destino para o Chrome. Mas pode não funcionar para outros destinos, consulte: https://github.com/babel/babel-preset-env/issues/112
Portanto, essa resposta NÃO é adequada para a pergunta original. Vou mantê-lo aqui como referência
babel-preset-env
.Uma solução simples é adicionar
import 'babel-polyfill'
no início do seu código.Se você usa o webpack, uma solução rápida é adicionar
babel-polyfill
como mostrado abaixo:Acredito que encontrei as melhores práticas mais recentes.
Verifique este projeto: https://github.com/babel/babel-preset-env
Use o seguinte como sua configuração de babel:
Em seguida, seu aplicativo deve estar disponível nas duas últimas versões do navegador Chrome.
Você também pode definir o Node como alvos ou ajustar a lista de navegadores de acordo com https://github.com/ai/browserslist
Diga-me o que, não me diga como.
Eu realmente gosto
babel-preset-env
da filosofia: diga-me qual ambiente você deseja apoiar, NÃO me diga como apoiá-los. É a beleza da programação declarativa.Eu testei
async
await
e eles funcionam. Eu não sei como eles funcionam e eu realmente não quero saber. Quero gastar meu tempo com meu próprio código e minha lógica de negócios. Graças ababel-preset-env
isso, me liberta do inferno da configuração de Babel.fonte
babel-preset-env
mas acho que vale a pena. Ame o estilo declarativo também. Tambémyarn install
é agorayarn add
Como alternativa, se você não precisar de todos os módulos
babel-polyfill
fornecidos, basta especificarbabel-regenerator-runtime
na sua configuração do webpack:Ao usar o webpack-dev-server com HMR, isso reduziu bastante o número de arquivos que ele precisa compilar em cada compilação. Este módulo é instalado como parte dele,
babel-polyfill
portanto, se você já tem o seu bem, caso contrário, poderá instalá-lo separadamente comnpm i -D babel-regenerator-runtime
.fonte
Minha solução simples:
.babelrc
fonte
loose: true
necessário?Babel 7.4.0 ou posterior (core-js 2/3)
A partir do Babel 7.4.0 ,
@babel/polyfill
foi preterido .Em geral, existem duas maneiras de instalar polyfills / regenerator: via namespace global (opção 1) ou como ponyfill (opção 2, sem poluição global).
Opção 1:
@babel/preset-env
usará automaticamente
regenerator-runtime
e decore-js
acordo com o seu objetivo . Não há necessidade de importar nada manualmente. Não se esqueça de instalar dependências de tempo de execução:Como alternativa, defina
useBuiltIns: "entry"
e importe-o manualmente:Opção 2:
@babel/transform-runtime
com@babel/runtime
(sem poluição no escopo global)Instale-o:
Se você usa polyfills core-js, instala
@babel/runtime-corejs2
ou@babel/runtime-corejs3
, em vez disso, consulte aqui .Felicidades
fonte
babel-regenerator-runtime
agora está obsoleto , em vez disso, deve-se usarregenerator-runtime
.Para usar o gerador de tempo de execução com
webpack
ebabel
v7:instalar
regenerator-runtime
:E depois adicione na configuração do webpack:
fonte
@babel/preset-env
'suseBuiltIns
de inserir dinamicamente em tempo de execução com base em seus navegadores de destino.Atualize seu
.babelrc
arquivo de acordo com os seguintes exemplos, ele funcionará.Se você estiver usando o
@babel/preset-env
pacotefonte
targets
parece referir-se esta :the environments you support/target for your project
, enquantotargets.node
é este :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"
no processo) e o erro do regenerador desapareceu.Cuidado com as funções de elevação
Eu tinha minha 'importação de polyfill' e minha 'função assíncrona' no mesmo arquivo, no entanto, estava usando a sintaxe da função que a eleva acima do polyfill, o que me daria o
ReferenceError: regeneratorRuntime is not defined
erro.Alterar este código
para isso
para impedir que ele seja içado acima da importação do polyfill.
fonte
Em outubro de 2019, isso funcionou para mim:
Adicione isso à predefinição.
Em seguida, instale o regenerator-runtime usando o npm.
E então, no arquivo principal, use: (essa importação é usada apenas uma vez)
Isso permitirá que você use
async
awaits
em seu arquivo e remova oregenerator error
fonte
useBuiltIns
o padrão seráfalse
. Isso não importará automaticamente nenhum polyfills, dependendo do ambiente de destino, o que prejudica o objetivo"@babel/preset-env"
. Aqui também está um comentário relacionado de um dos desenvolvedores do babel.Se estiver usando
babel-preset-stage-2
, basta iniciar o script--require babel-polyfill
.No meu caso, esse erro foi gerado por
Mocha
testes.Após corrigir o problema
mocha \"server/tests/**/*.test.js\" --compilers js:babel-register --require babel-polyfill
fonte
Comecei a receber esse erro depois de converter meu projeto em um projeto datilografado. Pelo que entendi, o problema decorre de async / aguarda não ser reconhecido.
Para mim, o erro foi corrigido adicionando duas coisas à minha configuração:
Como mencionado acima, muitas vezes, eu precisei adicionar o babel-polyfill ao meu array de entradas do webpack:
Eu precisava atualizar meu .babelrc para permitir a complementação de async / waitit em geradores:
DevDependencies:
Eu tive que instalar algumas coisas no meu devDependencies no meu arquivo package.json também. Ou seja, estava faltando o babel-plugin-transform-async-to-generator, o babel-polyfill e o babel-preset-es2015:
Lista completa do código:
Eu obtive o código de uma essência do GitHub realmente útil e concisa que você pode encontrar aqui .
fonte
env
vez dees2015
. jáenv
incluies2015
.Eu tive esse problema no Chrome. Semelhante à resposta de RienNeVaPlu, isso resolveu para mim:
Então no meu código:
Feliz em evitar os 200 kB extras de
babel-polyfill
.fonte
Este erro é causado quando
async/await
funções são usadas sem os plugins Babel adequados. Em março de 2020, você deve fazer o seguinte. (@babel/polyfill
e muitas das soluções aceitas foram preteridas em Babel. Leia mais nos documentos da Babel. )Na linha de comando, digite:
No seu
babel.config.js
arquivo, adicione este plugin@babel/plugin-transform-runtime
. Nota: O exemplo abaixo inclui as outras predefinições e plugins que tenho para um pequeno projeto React / Node / Express em que trabalhei recentemente:fonte
.babelrc
é assim: `` `{" presets ": [" @ babel / preset-env "]," plugins ": [" @ babel / plugin-transform-runtime "]}` ``Você está recebendo um erro porque os geradores de uso assíncrono / aguardado, que são um recurso do ES2016, não do ES2015. Uma maneira de corrigir isso é instalar a predefinição de babel para o ES2016 (
npm install --save babel-preset-es2016
) e compilar no ES2016 em vez do ES2015:Como as outras respostas mencionam, você também pode usar polyfills (embora certifique-se de carregar o polyfill primeiro antes da execução de qualquer outro código). Como alternativa, se você não deseja incluir todas as dependências do polyfill, pode usar o tempo de execução do babel-regenerator ou o tempo de execução do babel-plugin-transform-runtime .
fonte
Corrigi esse erro instalando o babel-polyfill
então eu o importei no ponto de entrada do meu aplicativo
para teste eu incluí --require babel-polyfill no meu script de teste
fonte
Nova resposta Por que você segue minha resposta?
Resp: Porque eu vou lhe dar uma resposta com o projeto npm da versão mais recente da atualização.
14/04/2017
Se você usar esta versão ou mais versão UP do Npm e todas as outras ... SO, basta alterar:
webpack.config.js
Depois de alterar os
webpack.config.js
arquivos Basta adicionar esta linha ao topo do seu código.Agora verifique se está tudo bem. LINK de referência
Agradeço também ao @BrunoLM por sua ótima resposta.
fonte
Os navegadores direcionados que eu preciso suportar já suportam async / waitit, mas ao escrever testes mocha, sem a configuração adequada, ainda recebi esse erro.
A maioria dos artigos que eu pesquisei estão desatualizados, incluindo a resposta aceita e alta votou respostas aqui, ou seja, você não precisa
polyfill
,babel-regenerator-runtime
,babel-plugin-transform-runtime
. etc., se o (s) navegador (s) de destino já suportar assíncrono / aguardar (é claro, se não precisar do polyfill)Também não quero usar
webpack
.A resposta de Tyler Long está realmente no caminho certo, desde que ele sugeriu
babel-preset-env
(mas eu o omiti primeiro, como ele mencionou o polifill no início). Ainda consegui oReferenceError: regeneratorRuntime is not defined
primeiro e percebi que era porque não havia definido o alvo. Depois de definir o destino para o nó, corrijo o erro regeneratorRuntime:fonte
Para usuários babel7 e ParcelJS> = 1.10.0 users
.babelrc
extraído de https://github.com/parcel-bundler/parcel/issues/1762
fonte
1 - Instale o método babel-plugin-transform-async-to-module-method, babel-polyfil, bluebird, babel-preset-es2015, babel-core:
2 - Adicione seu polyfill js babel:
import 'babel-polyfill';
3 - Adicione plugin no seu .babelrc:
Fonte: http://babeljs.io/docs/plugins/transform-async-to-module-method/
fonte
Eu tinha uma configuração
com o webpack usando
presets: ['es2015', 'stage-0']
e o mocha que estava executando testes compilados pelo webpack.
Para fazer meus
async/await
testes funcionarem, tudo que eu precisava fazer era adicionar amocha --require babel-polyfill
opção.fonte
Eu recebo esse erro usando gulp com rollup quando tentei usar geradores ES6:
Posso considerar que a solução foi incluir
babel-polyfill
como componente do pavilhão:e adicione-o como dependência em index.html:
fonte
Para quem procura usar a
babel-polyfill
versão 7 ^, faça isso comwebpack
ver3 ^.Npm instala o módulo
npm i -D @babel/polyfill
Então, no seu
webpack
arquivo no seuentry
ponto, faça issofonte
Meu modelo de trabalho babel 7 para reagir com o tempo de execução do regenerador:
.babelrc
package.json
main.js
fonte
Se você estiver criando um aplicativo, precisará apenas de
@babel/preset-env
e@babel/polyfill
:(Nota: você não precisa instalar os pacotes
core-js
eregenerator-runtime
porque ambos foram instalados pelo @ babel / polyfill)Então em
.babelrc
:Agora defina seus ambientes de destino. Aqui, fazemos isso no
.browserslistrc
arquivo:Finalmente, se você concordar
useBuiltIns: "entry"
, coloqueimport @babel/polyfill
no topo do seu arquivo de entrada. Caso contrário, você está pronto.O uso desse método importará seletivamente esses polyfills e o arquivo 'regenerator-runtime' (corrigindo seu
regeneratorRuntime is not defined
problema aqui) SOMENTE se eles forem necessários para qualquer um dos ambientes / navegadores de destino.fonte
para referência futura :
A partir das predefinições de estágio Babel versão 7.0.0-beta.55 foram removidas
consulte o blog https://babeljs.io/blog/2018/07/27/removing-babels-stage-presets
A espera assíncrona ainda pode ser usada por
https://babeljs.io/docs/en/babel-plugin-transform-async-to-generator#usage
instalação
uso em .babelrc
e usando babel polyfill https://babeljs.io/docs/en/babel-polyfill
instalação
webpack.config.js
fonte
Em 2019
Babel 7.4.0+
, obabel-polyfill
pacote foi descontinuado em favor de incluir diretamentecore-js/stable
(core-js@3+
, para polifillar os recursos do ECMAScript) eregenerator-runtime/runtime
(necessário para usar as funções do gerador de transpilado):Informações da
babel-polyfill
documentação .fonte
A maneira mais fácil de corrigir esse 'problema regeneratorRuntime não definido' no seu console:
Você não precisa instalar nenhum plug-in desnecessário. Basta adicionar:
<script src="https://unpkg.com/[email protected]/runtime.js"></script>
dentro do corpo em seu index.html. Agora regeneratorRuntime deve ser definido depois de executar o babel e agora suas funções async / waitit devem ser compiladas com êxito no ES2015
fonte
Se você estiver usando Gulp + Babel para um front-end, precisará usar o babel-polyfill
npm install babel-polyfill
e adicione uma tag de script ao index.html acima de todas as outras tags de script e faça referência a babel-polyfill de node_modules
fonte