Babel 6 rigeneratorRuntime non definito


634

Sto cercando di usare asincrono, attendo da zero su Babel 6, ma sto ottenendo rigeneratorRuntime non è definito.

.babelrc file

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

file package.json

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

file .js

"use strict";
async function foo() {
  await bar();
}
function bar() { }
exports.default = foo;

Usarlo normalmente senza asincrono / wait funziona perfettamente. Qualche idea su cosa sto facendo di sbagliato?


Hai incluso il rigeneratore?
ssube,

3
babel-polyfill è ciò di cui hai bisogno.
Ronnie Royston,

babel-polyfill è stato ammortizzato al 7,4; questo aggiornato così post descrive la migrazione.
JWCS,

Per coloro che utilizzano le versioni più recenti di babel e nodo: stackoverflow.com/a/62254909/8169904
Lun

Risposte:


682

babel-polyfill( deprecato a partire da Babele 7.4) è obbligatorio. È inoltre necessario installarlo per far funzionare async / wait.

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 con async / await (codice di esempio)

"use strict";

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

function bar() {
  return "bar";
}

Nel file di avvio

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

Se si utilizza il webpack, è necessario inserirlo come primo valore entrydell'array nel file di configurazione del webpack (in genere webpack.config.js), come indicato nel commento di @Cemen:

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

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

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

Se si desidera eseguire test con Babel, utilizzare:

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

77
Importante quando si utilizza babel con webpack: invece di usare require("babel-polyfill"), che non funziona, si aggiunge "babel-polyfill"nel vostro entryin config, in questo modo: entry: ["babel-polyfill", "src/main.js"]. Questo ha funzionato per me, incluso l'uso in webpack-dev-server con HMR.
Cemen,

6
Stavo cercando di far funzionare i miei test di moka con babel6 e async e ho dovuto aggiungere - richiesta babel-polyfill alla configurazione del runner di test
npm

13
A cosa serve il registro babel?
Trusktr,

6
@Lloyd devDependencyse si utilizza webpack perché "compilerà" i file prima di eseguirli. dependencyse non stai usando il webpack e hai bisogno di babel.
BrunoLM,

4
Questo rende enormi le dimensioni del file di output ... Meglio usare solo ciò di cui hai bisogno invece di richiedere direttamente babel-polyfill.
Inanc Gumus,

342

Oltre a polyfill, utilizzo babel-plugin-transform-runtime . Il plugin è descritto come:

Esternalizza i riferimenti ad helper e builtin, riempi automaticamente il tuo codice senza inquinare globalmente. Cosa significa questo in realtà? Fondamentalmente, puoi usare built-in come Promise, Set, Symbol ecc e anche tutte le funzionalità di Babel che richiedono un riempimento polifunzionale senza inquinamento globale, rendendolo estremamente adatto per le biblioteche.

Include anche il supporto per asincrono / wait insieme ad altri built-in di ES 6.

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

In .babelrc, aggiungi il plug-in di runtime

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

Nota Se stai usando babel 7, il pacchetto è stato rinominato in @ babel / plugin-transform-runtime .


11
Non avevo bisogno babel-runtimedi far funzionare asincramente l'attesa. È corretto? Modifica: sto eseguendo il lato server di codice. :)
GijsjanB,

8
Se sei stato in grado di usarlo senza babel-runtime, è perché è già nel tuo albero delle dipendenze. Quindi tieni presente che se stai scrivendo una libreria e babel-runtime sta arrivando come dipendenza dev, potrebbe non essere lì per i tuoi utenti. Dovrai includerlo come una normale dipendenza per la distribuzione.
Neverfox,

23
babel-plugin-transform-runtimerichiesto solo . Funziona come un fascino.
Saike,

9
Questa soluzione non è OK perché richiede un ulteriore processo di Browserify o Webpack per espandere le requirechiamate aggiunte dal transform-runtimeplug-in.
Finesse,

9
Nota che per Babel 7 devi correrenpm install --save-dev @babel/plugin-transform-runtime
Andrey Semakin il

197

Utenti Babel 7

Ho avuto qualche problema a aggirare questo dato che la maggior parte delle informazioni riguardava le precedenti versioni di babele. Per Babel 7, installa queste due dipendenze:

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

E, in .babelrc, aggiungi:

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

Come possiamo farlo senza .babelrc (solo usando il file di configurazione webpack)
Pouya Jabbarisani

2
Il documento mostra l'utilizzo come "plugins": ["@babel/plugin-transform-runtime"], piuttosto che "plugins": [ ["@babel/transform-runtime"] ]qui. Nome del plug-in diverso. Entrambe le opere Ma qual è quello giusto? ...
kyw

5
Ottengo il requisito non è definito quando si segue questo metodo
Batman

1
@kyw è meglio seguire sempre i documenti - nessuna differenza oltre alla convenzione.
Matt Shirley,

4
L'aggiunta @babel/transform-runtimeai plug-in ha causato l'errore "Le esportazioni non sono definite" per me. L'ho cambiato in questo per far funzionare asincrono in Babel7:["@babel/plugin-transform-runtime", { "regenerator": true } ]
Hari,

105

Aggiornare

Funziona se imposti il ​​target su Chrome. Ma potrebbe non funzionare per altri target, fare riferimento a: https://github.com/babel/babel-preset-env/issues/112

Quindi questa risposta NON è del tutto appropriata per la domanda originale. Lo terrò qui come riferimento a babel-preset-env.

Una soluzione semplice è quella di aggiungere import 'babel-polyfill'all'inizio del codice.

Se si utilizza il webpack, è necessario aggiungere una soluzione rapida babel-polyfillcome mostrato di seguito:

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

Credo di aver trovato le migliori pratiche più recenti.

Controlla questo progetto: https://github.com/babel/babel-preset-env

yarn add --dev babel-preset-env

Utilizzare quanto segue come configurazione babel:

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

Quindi la tua app dovrebbe andare bene nelle ultime 2 versioni del browser Chrome.

È inoltre possibile impostare Nodo come target o ottimizzare l'elenco dei browser in base a https://github.com/ai/browserslist

Dimmi cosa, non dirmi come.

Mi piace molto babel-preset-envla filosofia: dimmi quale ambiente vuoi supportare, NON dirmi come supportarli. È la bellezza della programmazione dichiarativa.

Ho testato async awaite funzionano. Non so come funzionano e non voglio davvero saperlo. Voglio invece dedicare il mio tempo al mio codice e alla mia logica aziendale. Grazie a babel-preset-env, mi libera dall'inferno della configurazione di Babele.


3
Funziona davvero. L'unico aspetto negativo è un mucchio di dipendenze trascinate babel-preset-envma penso che ne valga la pena. Adoro anche lo stile dichiarativo. Anche yarn installora èyarn add
Roman Usherenko il

1
@gargantuan Sì.
Tyler Long,

3
Non è davvero una soluzione se si desidera scegliere come target browser o versioni di nodi precedenti.
Rohan Orton,

2
Nel caso in cui non sia ovvio .... questa soluzione consigliata NON funzionerà se hai bisogno del tuo codice per funzionare in IE11
Maurice,

7
Perché questo ha così tanti voti positivi? Funziona solo perché non trasforma più async / waitit e quindi non ha più bisogno di rigeneratorRuntime e poiché non è trasformato non funzionerà su browser che non lo supportano.
Shikyo,

47

In alternativa, se non hai bisogno di tutti i moduli babel-polyfillforniti, puoi semplicemente specificare babel-regenerator-runtimenella configurazione del tuo webpack:

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

  // ...
};

Quando si utilizza webpack-dev-server con HMR, ciò riduce notevolmente il numero di file che deve essere compilato su ogni build. Questo modulo è installato come parte di esso, babel-polyfillquindi se hai già quello che stai bene, altrimenti puoi installarlo separatamente con npm i -D babel-regenerator-runtime.


Questa sembra essere la soluzione più conveniente. Tuttavia, la maggior parte dei browser supporta generatori, quindi questa soluzione non è probabilmente quella ottimale. Vedi: blogs.candoerz.com/question/213492/…
Kitanotori,

Cosa succede se non si utilizza il webpack?
Batman,

38

La mia soluzione semplice:

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
Ti manca "transform-async-to-generator" nei plugin. Ho dovuto aggiungere anche quello per farlo funzionare
GabrielBB

@GabrielBB Ho modificato il post, quindi è un esempio completo.
webnoob,

2
È loose: truenecessario?
Tom Söderlund il

Quando lo si utilizza, aggiunge richiede al mio file e non è definito nel browser.
Batman

sciolto: vero NON è necessario. Ciò di cui hai veramente bisogno nel tuo .babelrc è: {"preset": ["es2015", "reagire", "stage-2"], "plugins": ["transform-runtime", "transform-async-to-generator "]}
Efe Ariaroo,

29

Babel 7.4.0 o successivo (core-js 2/3)

A partire da Babel 7.4.0 , @babel/polyfill è obsoleto .

In generale, ci sono due modi per installare polyfill / rigeneratore: tramite spazio dei nomi globale (Opzione 1) o come ponyfill (Opzione 2, senza inquinamento globale).


Opzione 1: @babel/preset-env

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

userà automaticamente regenerator-runtimee in core-jsbase al tuo obiettivo . Non è necessario importare nulla manualmente. Non dimenticare di installare le dipendenze di runtime:

npm i --save regenerator-runtime core-js

In alternativa, impostalo useBuiltIns: "entry"e importalo manualmente:

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

Opzione 2: @babel/transform-runtime con @babel/runtime(nessun inquinamento globale)

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

Installalo:

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

Se usi i polyfill core-js, li installi @babel/runtime-corejs2o @babel/runtime-corejs3invece, vedi qui .

Saluti


2
Questa è la risposta corretta e più aggiornata e mi ha aiutato con un problema sul mio progetto attuale. Grazie!
cdpautsch,

2
{"presets": [["@ babel / preset-env", {"target": {"esmodules": true}}]]} Questo mi ha aiutato a costruire un node.js
Smolin Pavel,

3
Voglio dire, lo sapevo già, ma per aiutare gli altri questa dovrebbe essere la risposta corretta. I migliori saluti!
Niewiadomski Paweł,

Nota: penso che abbia senso usare il thread Babel 7 , quindi gli errori relativi alla versione possono essere meglio distinti. Puoi trovare una versione più specifica di questa risposta qui (ma le affermazioni precedenti sono ancora vere)
ford04

16

babel-regenerator-runtimeè ora deprecato , invece si dovrebbe usare regenerator-runtime.

Per utilizzare il generatore di runtime con webpacke babelv7:

installare regenerator-runtime:

npm i -D regenerator-runtime

E poi aggiungi nella configurazione del webpack:

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

Questa dovrebbe essere la risposta accettata, babel-polyfill aggiunge troppe altre cose
Shikyo,

Lavoro perfetto per me ... Grazie mille
Leandro William,

1
Questo metodo include sempre comunque il runtime. Credo che sconfigge lo scopo di @babel/preset-env's useBuiltInsdi inserire in modo dinamico sulla base di runtime browser di destinazione.
kyw

13

Aggiorna il tuo .babelrcfile secondo i seguenti esempi, funzionerà.

Se stai usando il @babel/preset-envpacchetto

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

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

2
spiegherei per favore la tua risposta? cosa "nodo": "corrente" fa
Vishal Solanki

Mi piacerebbe anche sapere cosa fa e se è una soluzione raccomandata, ovvero non mette a repentaglio nulla ed è "a prova di futuro" (per quanto tutto possa essere al momento). targetssembra riferirsi a questo : the environments you support/target for your projectmentre targets.nodeè questo : 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, ho usato il secondo blocco definito nella risposta (e rimosso "stage-0"nel processo) e l'errore del rigeneratore è andato via.
user1063287

1
@BunkerBoy Per comodità, puoi usare "node": "current" per includere solo i polyfill e le trasformazioni necessari per la versione di Node.js che usi per eseguire Babel
Zero

quindi per questo non devo installare polyfill?
Vishal Solanki,

12

Fare attenzione alle funzioni sollevate

Avevo sia la mia "importazione polyfill" che la mia "funzione asincrona" nello stesso file, tuttavia stavo usando la sintassi della funzione che la solleva sopra il polyfill che mi darebbe l' ReferenceError: regeneratorRuntime is not definederrore.

Cambia questo codice

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

a questo

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

per evitare che venga sollevato sopra l'importazione del polyfill.


5
a; kgjablrsdkjfjasnkljfbajklfdablkhjnfl; triste stavo perdendo la testa e mi hai salvato ti amo
John R Perry

11

A partire da ottobre 2019 questo ha funzionato per me:

Aggiungi questo al preset.

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

Quindi installare il rigeneratore-runtime usando npm.

npm i regenerator-runtime

E poi nel tuo file principale usa: (questa importazione viene usata una sola volta)

import "regenerator-runtime/runtime";

Questo ti consentirà di utilizzare async awaitsnel tuo file e rimuovere il fileregenerator error


Non impostando un valore per useBuiltInsverrà impostato automaticamente su false. Ciò non importa automaticamente eventuali polifillamenti a seconda dell'ambiente di destinazione, il che ne compromette lo scopo "@babel/preset-env". Ecco anche un commento correlato di uno degli sviluppatori di babel.
bela53,

10

Se si utilizza, è babel-preset-stage-2sufficiente avviare lo script con --require babel-polyfill.

Nel mio caso questo errore è stato generato da Mochatest.

In seguito risolto il problema

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


9

Ho iniziato a ricevere questo errore dopo aver convertito il mio progetto in un progetto dattiloscritto. Da quello che ho capito, il problema deriva da asincrono / attendo di non essere riconosciuto.

Per me l'errore è stato risolto aggiungendo due cose alla mia configurazione:

  1. Come accennato più volte, avevo bisogno di aggiungere babel-polyfill nel mio array di voci del webpack:

    ...
    
    voce: ['babel-polyfill', './index.js'],
    
    ...
  2. Avevo bisogno di aggiornare il mio .babelrc per consentire la compilazione di async / wait in generatori:

    {
      "preset": ["es2015"],
      "plugins": ["transform-async-to-generator"]
    }

DevDependencies:

Ho dovuto installare alcune cose nelle mie devDependencies anche nel mio file package.json. Vale a dire, mi mancava babel-plugin-transform-async-to-generator, babel-polyfill e 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"
 }

Codice completo:

Ho ottenuto il codice da una sintesi di GitHub davvero utile e concisa che puoi trovare qui .


3
È meglio usare il preset envanziché es2015. envinclude es2015già.
Neurotrasmettitore

9

Ho avuto questo problema in Chrome. Simile alla risposta di RienNeVaPlu, questo mi ha risolto:

npm install --save-dev regenerator-runtime

Quindi nel mio codice:

import 'regenerator-runtime/runtime';

Felice di evitare i 200 kB extra da babel-polyfill.


9

Questo errore si verifica quando le async/awaitfunzioni vengono utilizzate senza i plug-in Babel appropriati. A partire da marzo 2020, dovrebbe essere tutto ciò che devi fare. ( @babel/polyfille molte delle soluzioni accettate sono state deprecate in Babel. Leggi di più nei documenti Babel. )

Nella riga di comando, digitare:

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

Nel tuo babel.config.jsfile, aggiungi questo plugin @babel/plugin-transform-runtime. Nota: l'esempio seguente include gli altri preset e plugin che ho per un piccolo progetto React / Node / Express su cui ho lavorato di recente:

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

Quello che mi stupisce sempre è come gli sviluppatori sono pigri. Gli sviluppatori Babel hanno deciso di deprecare la funzionalità, potrebbero aspettarsi che questo diventi un problema. Perché non far sapere alle persone qual era l'intenzione più probabile e cosa dovrebbero fare per risolverlo. Ma no, mostriamo solo qualche messaggio che è assolutamente inutile per i neofiti.
Pavel Voronin,

Questo non funziona imgur.com/a/2Ea8WDk
improbabile il

Ha funzionato alla grande per me. Il mio progetto non reattivo .babelrcè simile al seguente: `` `{" preset ": [" @ babel / preset-env "]," plugins ": [" @ babel / plugin-transform-runtime "]}` ``
Anthony

8

Stai ricevendo un errore perché i generatori asincrono / attendono l'uso, che sono una funzione ES2016, non ES2015. Un modo per risolvere questo problema è installare la preimpostazione babel per ES2016 ( npm install --save babel-preset-es2016) e compilarla su ES2016 anziché ES2015:

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

Come menzionano le altre risposte, puoi anche usare i polyfill (assicurati di caricare il polyfill prima di eseguire qualsiasi altro codice). In alternativa, se non si desidera includere tutte le dipendenze del polyfill, è possibile utilizzare babel-rigenerator-runtime o babel-plugin-transform-runtime .


7

Ho corretto questo errore installando babel-polyfill

npm install babel-polyfill --save

quindi l'ho importato nel mio punto di ingresso dell'app

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

per i test ho incluso --requisto babel-polyfill nel mio script di test

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

6

Nuova risposta Perché segui la mia risposta?

Ans: Perché ho intenzione di darti una risposta con l'ultimo progetto npm versione di aggiornamento.

2017/04/14

"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"

Se usi questa versione o più versione UP di Npm e tutte le altre ... SO devi solo cambiare:

webpack.config.js

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

Dopo aver modificato i webpack.config.jsfile, aggiungi questa riga all'inizio del codice.

import "babel-polyfill";

Ora controlla che sia tutto a posto. LINK di riferimento

Grazie anche a @BrunoLM per la sua bella risposta.


1
Perché dovrebbe usare il webpack se si tratta di un servizio back-end? La tua risposta implica che deve usare il webpack?
Spock,

1
@Spock, ci ho pensato. Stavo affrontando lo stesso problema e ho risolto il mio problema in questo modo semplice. Penso che sia la risposta positiva per l'utente Webpack e le lepre hanno più risposta giusta in modo da poter seguire chiunque altro.
MD Ashik,

Perché hai bisogno di premere Giù Vota !!!! Puoi dire la ragione se vuoi aiutarmi.
MD Ashik,

6

I browser mirati che devo supportare già supportano async / waitit, ma quando scrivo i test moka, senza l'impostazione corretta ho ancora ricevuto questo errore.

La maggior parte degli articoli Ho cercato su google sono obsoleti, tra cui la risposta accettata e l'alta votato risposte qui, vale a dire che non è necessario polyfill, babel-regenerator-runtime, babel-plugin-transform-runtime. ecc. se i browser di destinazione supportano già asincronizzazione / attendi (ovviamente se non hai bisogno di polyfill)

Non voglio usare webpack nemmeno .

La risposta di Tyler Long è in realtà sulla strada giusta da quando ha suggerito babel-preset-env(ma l'ho omesso prima come ha menzionato il polifill all'inizio). Ho ancora ottenuto il ReferenceError: regeneratorRuntime is not definedprimo, poi ho capito che era perché non avevo fissato l'obiettivo. Dopo aver impostato la destinazione per il nodo, correggo l'errore rigeneratorRuntime :

  "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 - Installa babel-plugin-transform-async-to-module-method, 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 - Aggiungi il tuo polyfill js babel:

import 'babel-polyfill';

3 - Aggiungi plugin nel tuo .babelrc:

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

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


3

Ho avuto un setup
con webpack usando presets: ['es2015', 'stage-0']
e moka che eseguiva test compilati da webpack.

Per far funzionare i miei async/awaittest non mi resta che aggiungere mocha --require babel-polyfillun'opzione.


3

Ottengo questo errore usando gulp con rollup quando ho provato ad usare i generatori ES6:

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 }));
});

Posso ipotizzare che la soluzione fosse quella di includere babel-polyfillcome componente del pergolato:

bower install babel-polyfill --save

e aggiungilo come dipendenza in index.html:

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

Grazie. Questo ha funzionato per me. Non sapevo che dovevo aggiungere il tag script per farlo funzionare sul lato client.
Raza,

3

Per le persone che desiderano utilizzare la babel-polyfillversione 7 ^ farlo con webpackver3 ^.

Npm installa il modulo npm i -D @babel/polyfill

Quindi, nel tuo webpackfile, entryfai questo

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

3

La mia piastra di lavoro babel 7 per reagire con l'autonomia del rigeneratore:

.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

Se stai costruendo un'app, hai solo bisogno di @babel/preset-enve @babel/polyfill:

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

(Nota: non è necessario installare i pacchetti core-jse regenerator-runtimeperché entrambi saranno stati installati da @ babel / polyfill)

Quindi in .babelrc:

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

Ora imposta i tuoi ambienti target. Qui lo facciamo nel .browserslistrcfile:

# Browsers that we support

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

Infine, se ci sei andato useBuiltIns: "entry", metti import @babel/polyfillin cima al tuo file di voce. Altrimenti, hai finito.

L'uso di questo metodo importerà in modo selettivo quei polyfill e il file 'rigenerator-runtime' (risolvendo regeneratorRuntime is not definedqui il problema) SOLO se sono necessari in uno dei tuoi ambienti / browser di destinazione.


2

per riferimento futuro :

A partire dalla versione Babel 7.0.0-beta.55 i preset dello stage sono stati rimossi

consultare il blog https://babeljs.io/blog/2018/07/27/removing-babels-stage-presets

async waitit può essere ancora utilizzato da

https://babeljs.io/docs/en/babel-plugin-transform-async-to-generator#usage

installazione

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

utilizzo in .babelrc

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

e usando babel polyfill https://babeljs.io/docs/en/babel-polyfill

installazione

npm install --save @babel/polyfill

webpack.config.js

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

2

Nel 2019 con Babel 7.4.0+, il babel-polyfillpacchetto è stato deprecato a favore di includere direttamente core-js/stable( core-js@3+, per polifilare le funzioni ECMAScript) e regenerator-runtime/runtime(necessario per usare le funzioni del generatore traspilato):

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

Informazioni dalla babel-polyfill documentazione .


2

Il modo più semplice per risolvere questo "problema di rigeneratore non definito" nella tua console:

Non è necessario installare plug-in non necessari. Aggiungi solo:

<script src="https://unpkg.com/regenerator-runtime@0.13.1/runtime.js"></script>

all'interno del corpo nel tuo index.html. Ora rigeneratorRuntime dovrebbe essere definito una volta eseguito babel e ora le funzioni asincrone / attesa dovrebbero essere compilate correttamente in ES2015


1

Se usi Gulp + Babel come frontend devi usare babel-polyfill

npm install babel-polyfill

e quindi aggiungere un tag di script a index.html sopra tutti gli altri tag di script e fare riferimento a babel-polyfill da node_modules


Non vedo perché il downvote e il commento. Lo volevo per il browser Firefox. Inoltre ho preso le informazioni direttamente dal sito stesso di Babel. Il commento non mi ha aiutato a risolvere il problema quando l'ho provato.
Petros Kyriakou,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.