Babel 6 regeneratorRuntime tidak didefinisikan


634

Saya mencoba menggunakan async, menunggu dari awal pada Babel 6, tapi saya mendapatkan regeneratorRuntime tidak didefinisikan.

File .babelrc

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

Menggunakannya secara normal tanpa async / menunggu berfungsi dengan baik. Ada ide yang saya lakukan salah?


Sudahkah Anda memasukkan regenerator?
ssube

3
babel-polyfill adalah yang Anda butuhkan.
Ronnie Royston

babel-polyfill telah disusutkan pada 7.4; posting ini diperbarui sehingga menggambarkan migrasi.
JWCS

Untuk mereka yang menggunakan versi terbaru dari babel dan node: stackoverflow.com/a/62254909/8169904
Senin

Jawaban:


682

babel-polyfill( tidak digunakan pada Babel 7.4) diperlukan. Anda juga harus menginstalnya agar async / menunggu berfungsi.

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 dengan async / await (kode sampel)

"use strict";

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

function bar() {
  return "bar";
}

Dalam file startup

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

Jika Anda menggunakan webpack, Anda harus meletakkannya sebagai nilai pertama entryarray Anda di file konfigurasi webpack Anda (biasanya webpack.config.js), sesuai komentar @Cemen:

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

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

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

Jika Anda ingin menjalankan tes dengan babel, gunakan:

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

77
Penting ketika Anda menggunakan babel dengan Webpack: daripada menggunakan require("babel-polyfill")yang tidak bekerja, Anda menambahkan "babel-polyfill"ke dalam entrydalam konfigurasi, seperti ini: entry: ["babel-polyfill", "src/main.js"]. Ini bekerja untuk saya, termasuk penggunaan di webpack-dev-server dengan HMR.
Cemen

6
Saya sedang mencoba untuk mendapatkan tes mocha saya untuk berjalan dengan babel6 dan async dan saya harus menambahkan --membutuhkan babel-polyfill ke konfigurasi test runner
npm

13
Untuk apa mendaftar-babel?
trusktr

6
@Lloyd devDependencyjika Anda menggunakan webpack karena ia kemudian akan "mengkompilasi" file sebelum berjalan. dependencyjika Anda tidak menggunakan webpack dan Anda memerlukan babel.
BrunoLM

4
Ini membuat ukuran file output sangat besar ... Lebih baik menggunakan apa yang Anda butuhkan daripada memerlukan babel-polyfill secara langsung.
Inanc Gumus

342

Selain polyfill, saya menggunakan babel-plugin-transform-runtime . Plugin ini dijelaskan sebagai:

Eksternalisasikan referensi ke helper dan builtin, secara otomatis mengisi kode Anda tanpa mencemari global. Apa artinya ini sebenarnya? Pada dasarnya, Anda dapat menggunakan built-in seperti Promise, Set, Symbol dll juga menggunakan semua fitur Babel yang membutuhkan polyfill secara mulus, tanpa polusi global, membuatnya sangat cocok untuk perpustakaan.

Ini juga termasuk dukungan untuk async / menunggu bersama dengan built-in ES 6 lainnya.

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

Di .babelrc, tambahkan plugin runtime

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

Catatan Jika Anda menggunakan babel 7, paket telah diubah namanya menjadi @ babel / plugin-transform-runtime .


11
Saya tidak perlu babel-runtimemenunggu async bekerja. Apakah itu benar? Sunting: Saya menjalankan sisi server kode. :)
GijsjanB

8
Jika Anda bisa menggunakannya tanpa babel-runtime, itu karena sudah ada di pohon dependensi Anda. Jadi ketahuilah bahwa jika Anda sedang menulis perpustakaan, dan babel-runtime akan muncul sebagai dependensi dev, mungkin tidak ada untuk pengguna Anda. Anda harus memasukkannya sebagai ketergantungan normal untuk distribusi.
neverfox

23
hanya babel-plugin-transform-runtimediperlukan. Bekerja seperti pesona.
saike

9
Solusi ini tidak OK karena membutuhkan pekerjaan Browserify atau Webpack tambahan untuk memperluas requirepanggilan yang ditambahkan oleh transform-runtimeplugin.
Finesse

9
Perhatikan bahwa untuk Babel 7 Anda harus menjalankannpm install --save-dev @babel/plugin-transform-runtime
Andrey Semakin

197

Pengguna Babel 7

Saya mengalami beberapa kesulitan untuk mengatasi hal ini karena sebagian besar informasi adalah untuk versi babel sebelumnya. Untuk Babel 7, instal dua dependensi ini:

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

Dan, di .babelrc, tambahkan:

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

Bagaimana kita bisa melakukannya tanpa .babelrc (hanya menggunakan file konfigurasi webpack)
Pouya Jabbarisani

2
Doc menunjukkan penggunaan sebagai "plugins": ["@babel/plugin-transform-runtime"], bukan di "plugins": [ ["@babel/transform-runtime"] ]sini. Nama plugin berbeda. Keduanya bekerja. Tapi yang mana yang benar? ...
kyw

5
Saya memerlukan tidak didefinisikan ketika mengikuti metode ini
Batman

1
@wh terbaik untuk selalu mengikuti dokumen - tidak ada perbedaan selain konvensi.
Matt Shirley

4
Menambahkan @babel/transform-runtimeke plugin menyebabkan kesalahan "ekspor tidak didefinisikan" untuk saya. Saya mengubahnya ke ini agar async bekerja di Babel7:["@babel/plugin-transform-runtime", { "regenerator": true } ]
Hari

105

Memperbarui

Ini berfungsi jika Anda menetapkan target ke Chrome. Tapi itu mungkin tidak berfungsi untuk target lain, silakan merujuk ke: https://github.com/babel/babel-preset-env/issues/112

Jadi jawaban ini TIDAK cukup tepat untuk pertanyaan awal. Saya akan menyimpannya di sini sebagai referensi babel-preset-env.

Solusi sederhana adalah menambahkan import 'babel-polyfill'di awal kode Anda.

Jika Anda menggunakan webpack, solusi cepat adalah menambahkan babel-polyfillseperti yang ditunjukkan di bawah ini:

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

Saya percaya saya telah menemukan praktik terbaik terbaru.

Periksa proyek ini: https://github.com/babel/babel-preset-env

yarn add --dev babel-preset-env

Gunakan yang berikut ini sebagai konfigurasi babel Anda:

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

Maka aplikasi Anda akan bagus untuk masuk dalam 2 versi browser Chrome terakhir.

Anda juga dapat mengatur Node sebagai target atau menyempurnakan daftar browser sesuai dengan https://github.com/ai/browserslist

Katakan padaku apa, jangan beri tahu aku caranya.

Saya sangat suka babel-preset-envfilosofi: beri tahu saya lingkungan mana yang ingin Anda dukung, JANGAN beri tahu saya cara mendukungnya. Ini keindahan pemrograman deklaratif.

Saya sudah menguji async awaitdan mereka DO bekerja. Saya tidak tahu bagaimana mereka bekerja dan saya benar-benar tidak ingin tahu. Saya ingin menghabiskan waktu saya pada kode saya sendiri dan logika bisnis saya sebagai gantinya. Berkat babel-preset-env, itu membebaskan saya dari neraka konfigurasi Babel.


3
Ini benar-benar berfungsi. Satu-satunya downside adalah sekelompok dependensi ditarik babel-preset-envtetapi saya pikir itu layak. Cinta gaya deklaratif juga. Juga yarn installsekarangyarn add
Roman Usherenko

1
@ raksasa Ya itu.
Tyler Long

3
Bukan solusi jika Anda ingin menargetkan browser yang lebih lama atau versi node.
Rohan Orton

2
Hanya dalam kasus itu tidak jelas .... solusi yang disarankan ini TIDAK akan bekerja jika Anda memerlukan kode Anda untuk bekerja di IE11
Maurice

7
Mengapa ini memiliki begitu banyak suara? Ini hanya berfungsi karena tidak lagi mengubah async / menunggu dan karenanya tidak lagi memerlukan regeneratorRuntime dan karena itu tidak diubah, itu tidak akan berfungsi pada browser yang tidak mendukungnya.
Shikyo

47

Atau, jika Anda tidak membutuhkan semua modul yang babel-polyfilldisediakan, Anda bisa menentukan babel-regenerator-runtimedi konfigurasi webpack Anda:

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

  // ...
};

Saat menggunakan webpack-dev-server dengan HMR, melakukan ini mengurangi jumlah file yang harus dikompilasi pada setiap build dengan cukup banyak. Modul ini dipasang sebagai bagian dari babel-polyfilljadi jika Anda sudah memilikinya, Anda dapat menginstalnya secara terpisah npm i -D babel-regenerator-runtime.


Ini tampaknya menjadi solusi yang paling nyaman. Namun, sebagian besar browser mendukung generator, jadi solusi ini mungkin bukan yang optimal. Lihat: blogs.candoerz.com/question/213492/…
Kitanotori

Bagaimana jika Anda tidak menggunakan paket web?
Batman

38

Solusi sederhana saya:

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
Anda kehilangan "transform-async-to-generator" di plugin. Saya harus menambahkan itu juga untuk membuatnya bekerja
GabrielBB

@GabrielBB Saya sudah mengedit posting jadi contoh lengkap.
webnoob

2
Apakah loose: truedibutuhkan?
Tom Söderlund

Saat menggunakan ini, ia menambahkan perlu ke file saya dan perlu tidak didefinisikan di browser.
Batman

longgar: benar TIDAK diperlukan. Yang benar-benar Anda butuhkan dalam .babelrc adalah: {"preset": ["es2015", "react", "stage-2"], "plugins": ["transform-runtime", "transform-async-to-generator "]}
Efe Ariaroo

29

Babel 7.4.0 atau lebih baru (core-js 2/3)

Pada Babel 7.4.0 , @babel/polyfill sudah usang .

Secara umum, ada dua cara untuk menginstal polyfill / regenerator: via namespace global (Opsi 1) atau sebagai ponyfill (Opsi 2, tanpa polusi global).


Pilihan 1: @babel/preset-env

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

akan secara otomatis menggunakan regenerator-runtimedan core-jssesuai dengan target Anda . Tidak perlu mengimpor apa pun secara manual. Jangan lupa untuk menginstal dependensi runtime:

npm i --save regenerator-runtime core-js

Atau, atur useBuiltIns: "entry"dan impor secara manual:

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

Opsi 2: @babel/transform-runtime dengan @babel/runtime(tidak ada polusi lingkup global)

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

Pasang itu:

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

Jika Anda menggunakan core-js polyfill, Anda menginstal @babel/runtime-corejs2atau @babel/runtime-corejs3sebagai gantinya, lihat di sini .

Bersulang


2
Ini adalah jawaban yang paling tepat dan terbaru dan membantu saya dengan masalah pada proyek saya saat ini. Terima kasih!
cdpautsch

2
{"preset": [["@ babel / preset-env", {"target": {"esmodules": true}}]]} Ini telah membantu saya untuk membangun node.js
Smolin Pavel

3
Maksud saya, saya sudah tahu itu tetapi untuk membantu orang lain ini harus menjadi jawaban yang benar. Salam Hormat!
Niewiadomski Paweł

Catatan: Saya pikir, masuk akal untuk menggunakan utas Babel 7 , sehingga kesalahan terkait versi dapat lebih baik dibedakan. Anda dapat menemukan versi yang lebih spesifik dari jawaban ini di sini (tetapi pernyataan di atas masih berlaku)
ford04

16

babel-regenerator-runtimesekarang sudah ditinggalkan , sebagai gantinya orang harus menggunakanregenerator-runtime .

Untuk menggunakan generator runtime dengan webpackdan babelv7:

pasang regenerator-runtime:

npm i -D regenerator-runtime

Dan kemudian tambahkan dalam konfigurasi webpack:

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

Ini harus menjadi jawaban yang diterima, babel-polyfill menambahkan terlalu banyak hal lain
Shikyo

Bekerja sempurna untuk saya ... Terima kasih banyak
Leandro William

1
Metode ini selalu menyertakan runtime. Saya percaya itu mengalahkan tujuan @babel/preset-env's useBuiltInsdari dinamis memasukkan runtime berdasarkan target browser Anda.
kyw

13

Perbarui .babelrcfile Anda sesuai dengan contoh berikut, ini akan berfungsi.

Jika Anda menggunakan @babel/preset-envpaket

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

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

2
tolong jelaskan jawaban Anda? apa yang dilakukan "simpul": "saat ini"
Vishal Solanki

Saya juga ingin tahu apa yang dilakukan dan apakah ini merupakan solusi yang disarankan - yaitu tidak membahayakan apa pun dan merupakan "bukti masa depan" (sebanyak apa pun dapat terjadi saat ini). targetstampaknya merujuk pada ini : the environments you support/target for your project, sementara targets.nodeadalah ini : 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, saya menggunakan blok kedua yang ditentukan dalam jawaban (dan dihapus "stage-0"dalam proses) dan kesalahan regenerator hilang.
user1063287

1
@BunkerBoy Untuk kenyamanan, Anda dapat menggunakan "node": "current" untuk hanya menyertakan polyfill dan transformasi yang diperlukan untuk versi Node.js yang Anda gunakan untuk menjalankan Babel
Zero

jadi untuk ini saya tidak perlu menginstal polyfill?
Vishal Solanki

12

Hati-hati dengan fungsi yang diangkat

Saya memiliki 'impor polyfill' dan 'fungsi async' saya di file yang sama, namun saya menggunakan sintaks fungsi yang mengangkatnya di atas polyfill yang akan memberi saya ReferenceError: regeneratorRuntime is not definedkesalahan.

Ubah kode ini

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

untuk ini

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

untuk mencegahnya diangkat di atas impor polyfill.


5
a; kgjablrsdkjfjasnkljfbajklfdablkhjnfl; sedih aku kehilangan akal dan kamu telah menyelamatkanku aku mencintaimu
John R Perry

11

Pada Oktober 2019 ini bekerja untuk saya:

Tambahkan ini ke preset.

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

Kemudian instal regenerator-runtime menggunakan npm.

npm i regenerator-runtime

Dan kemudian dalam penggunaan file utama Anda: (impor ini hanya digunakan sekali)

import "regenerator-runtime/runtime";

Ini akan memungkinkan Anda untuk menggunakan async awaitsfile Anda dan menghapus fileregenerator error


Tidak menetapkan nilai untuk useBuiltInsdefault untuk false. Ini tidak akan mengimpor polyfill secara otomatis tergantung pada lingkungan target, yang agak merusak tujuan "@babel/preset-env". Berikut ini juga komentar terkait oleh salah satu pengembang babel.
bela53

10

Jika menggunakan babel-preset-stage-2maka cukup mulai skrip dengan --require babel-polyfill.

Dalam kasus saya kesalahan ini dilemparkan oleh Mochates.

Setelah memperbaiki masalah

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


9

Saya mulai mendapatkan kesalahan ini setelah mengubah proyek saya menjadi proyek naskah. Dari apa yang saya mengerti, masalahnya berasal dari async / menunggu tidak dikenali.

Bagi saya kesalahan telah diperbaiki dengan menambahkan dua hal ke pengaturan saya:

  1. Seperti yang disebutkan di atas berkali-kali, saya perlu menambahkan babel-polyfill ke dalam array entri webpack saya:

    ...
    
    entri: ['babel-polyfill', './index.js'],
    
    ...
  2. Saya perlu memperbarui .babelrc saya untuk memungkinkan kompilasi async / menunggu menjadi generator:

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

DevDependencies:

Saya harus menginstal beberapa hal ke dalam devDependencies saya di file package.json saya juga. Yaitu, saya kehilangan babel-plugin-transform-async-to-generator, babel-polyfill dan 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"
 }

Inti Kode Lengkap:

Saya mendapatkan kode dari intisari GitHub yang sangat membantu dan ringkas yang dapat Anda temukan di sini .


3
Lebih baik menggunakan preset envdaripada es2015. sudah envtermasuk es2015.
Neurotransmitter

9

Saya punya masalah ini di Chrome. Mirip dengan jawaban RienNeVaPlu, ini menyelesaikannya untuk saya:

npm install --save-dev regenerator-runtime

Kemudian dalam kode saya:

import 'regenerator-runtime/runtime';

Senang menghindari tambahan 200 kB dari babel-polyfill.


9

Kesalahan ini disebabkan ketika async/awaitfungsi digunakan tanpa plugin Babel yang tepat. Pada Maret 2020, berikut ini yang harus Anda lakukan. ( @babel/polyfilldan banyak solusi yang diterima telah ditinggalkan di Babel. Baca lebih lanjut di Babel docs. )

Di baris perintah, ketik:

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

Di babel.config.jsfile Anda , tambahkan plugin ini @babel/plugin-transform-runtime. Catatan: Contoh di bawah ini termasuk preset dan plugin lain yang saya miliki untuk proyek React / Node / Express kecil yang saya kerjakan baru-baru ini:

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

Yang selalu membuat saya takjub adalah bagaimana para pengembang malas. Babel devs memutuskan untuk tidak lagi menggunakan fungsionalitas, mereka mungkin berharap ini menjadi masalah. Mengapa tidak memberi tahu orang apa niat yang paling mungkin, dan apa yang harus mereka lakukan untuk memperbaikinya. Tapi tidak, mari kita tunjukkan beberapa pesan yang tidak berguna bagi pemula.
Pavel Voronin

Ini tidak berfungsi imgur.com/a/2Ea8WDk
tidak mungkin

Bekerja dengan baik untuk saya. Proyek non-reaksi saya .babelrcterlihat seperti ini: `` `{" preset ": [" @ babel / preset-env "]," plugins ": [" @ babel / plugin-transform-runtime "]}` ``
Anthony

8

Anda mendapatkan kesalahan karena async / menunggu menggunakan generator, yang merupakan fitur ES2016, bukan ES2015. Salah satu cara untuk memperbaikinya adalah dengan menginstal preset babel untuk ES2016 ( npm install --save babel-preset-es2016) dan kompilasi ke ES2016 alih-alih ES2015:

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

Seperti jawaban lain menyebutkan, Anda juga dapat menggunakan polyfill (meskipun pastikan Anda memuat polyfill terlebih dahulu sebelum kode lain berjalan). Atau, jika Anda tidak ingin menyertakan semua dependensi polyfill, Anda dapat menggunakan babel-regenerator-runtime atau babel-plugin-transform-runtime .


7

Saya memperbaiki kesalahan ini dengan menginstal babel-polyfill

npm install babel-polyfill --save

kemudian saya mengimpornya di titik masuk aplikasi saya

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

untuk pengujian saya sertakan --require babel-polyfill dalam skrip pengujian saya

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

6

Jawaban Baru Mengapa Anda mengikuti jawaban saya?

Jawab: Karena saya akan memberi Anda jawaban dengan proyek npm versi Pembaruan terbaru.

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"

Jika Anda menggunakan versi ini atau lebih banyak versi NPM dan semua lainnya ... SO hanya perlu mengubah:

webpack.config.js

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

Setelah mengubah webpack.config.jsfile, tambahkan saja baris ini ke atas kode Anda.

import "babel-polyfill";

Sekarang periksa semuanya ok. Referensi LINK

Juga Terima Kasih @BrunoLM untuk Jawabannya yang bagus.


1
Mengapa dia menggunakan webpack jika itu adalah layanan backend? Jawaban Anda menyiratkan bahwa ia harus menggunakan webpack?
Spock

1
@Spock, saya memang memikirkannya. Saya menghadapi masalah yang sama dan saya memecahkan masalah saya dengan cara sederhana ini. Saya pikir ini jawaban positif untuk pengguna Webpack dan memiliki lebih banyak Jawaban Benar sehingga Anda dapat mengikuti yang lain.
MD Ashik

Mengapa Anda perlu menekan Vote !!!! Dapatkah Anda mengatakan alasannya jika Anda ingin membantu saya.
MD Ashik

6

Browser yang ditargetkan saya perlu mendukung sudah mendukung async / menunggu, tetapi ketika menulis tes moka, tanpa pengaturan yang tepat saya masih mendapatkan kesalahan ini.

Sebagian besar artikel saya googled sudah ketinggalan jaman, termasuk jawaban yang diterima dan tinggi sebagai jawaban di sini, yaitu Anda tidak perlu polyfill, babel-regenerator-runtime, babel-plugin-transform-runtime. dll. jika browser target Anda sudah mendukung async / menunggu (tentu saja jika tidak, Anda perlu polyfill)

Saya juga tidak ingin menggunakan webpack.

Jawaban Tyler Long sebenarnya ada di jalur yang benar sejak dia menyarankan babel-preset-env(tapi saya menghilangkannya dulu karena dia menyebutkan polifill di awal). Saya masih mendapatkan yang ReferenceError: regeneratorRuntime is not definedpertama kemudian saya sadari karena saya tidak menetapkan target. Setelah menetapkan target untuk simpul saya memperbaiki kesalahan 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 - Instal 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 - Tambahkan js babel polyfill Anda:

import 'babel-polyfill';

3 - Tambahkan plugin di .babelrc Anda:

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

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


3

Saya memiliki pengaturan
dengan menggunakan webpackpresets: ['es2015', 'stage-0']
dan mocha yang menjalankan tes yang dikompilasi oleh webpack.

Agar async/awaittes saya berfungsi, yang harus saya lakukan adalah menambahkan mocha --require babel-polyfillopsi.


3

Saya mendapatkan kesalahan ini menggunakan gulp dengan rollup ketika saya mencoba menggunakan generator 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 }));
});

Saya perkirakan solusinya adalah memasukkan babel-polyfillsebagai komponen bower:

bower install babel-polyfill --save

dan tambahkan itu sebagai ketergantungan pada index.html:

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

Terima kasih. Ini berhasil untuk saya. Saya tidak tahu bahwa saya perlu menambahkan tag skrip agar berfungsi di sisi klien.
Raza

3

Untuk orang yang ingin menggunakan babel-polyfillversi 7 ^ lakukan ini dengan webpackver3 ^.

Npm instal modul npm i -D @babel/polyfill

Kemudian di webpackfile Anda di entrytitik Anda lakukan ini

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

3

Babel kerja saya 7 boilerplate yang untuk bereaksi dengan runtime regenerator:

.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

Jika Anda membuat aplikasi, Anda hanya perlu @babel/preset-envdan @babel/polyfill:

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

(Catatan: Anda tidak perlu menginstal core-jsdanregenerator-runtime paket karena keduanya telah diinstal oleh @ babel / polyfill)

Kemudian di .babelrc:

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

Sekarang atur lingkungan target Anda. Di sini, kami melakukannya di .browserslistrcfile:

# Browsers that we support

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

Akhirnya, jika Anda ikut useBuiltIns: "entry", masukkanimport @babel/polyfill di bagian atas file entri Anda. Kalau tidak, Anda sudah selesai.

Menggunakan metode ini secara selektif akan mengimpor polyfill tersebut dan file 'regenerator-runtime' (memperbaiki regeneratorRuntime is not definedmasalah Anda di sini) SAJA jika dibutuhkan oleh salah satu lingkungan / browser target Anda.


2

untuk referensi di masa mendatang :

Pada Babel versi 7.0.0-beta.55 preset panggung telah dihapus

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

async menunggu masih bisa digunakan oleh

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

instalasi

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

penggunaan dalam .babelrc

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

dan menggunakan babel polyfill https://babeljs.io/docs/en/babel-polyfill

instalasi

npm install --save @babel/polyfill

webpack.config.js

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

2

Pada tahun 2019 dengan Babel 7.4.0+, babel-polyfillpaket telah usang mendukung secara langsung termasuk core-js/stable( core-js@3+, untuk polyfill fitur ECMAScript) dan regenerator-runtime/runtime(diperlukan untuk menggunakan fungsi generator yang dialihkan):

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

Informasi dari babel-polyfill dokumentasi .


2

Cara termudah untuk memperbaiki masalah ini 'regeneratorRuntime tidak didefinisikan' di konsol Anda:

Anda tidak harus menginstal plugin yang tidak perlu. Cukup tambahkan:

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

di dalam tubuh di index.html Anda. Sekarang regeneratorRuntime harus didefinisikan setelah Anda menjalankan babel dan sekarang fungsi-fungsi async / menunggu Anda harus dikompilasi dengan sukses ke ES2015


1

Jika Anda menggunakan Gulp + Babel untuk sebuah frontend, Anda perlu menggunakan babel-polyfill

npm install babel-polyfill

dan kemudian menambahkan tag skrip ke index.html di atas semua tag skrip lain dan referensi babel-polyfill dari node_modules


Saya tidak mengerti mengapa downvote dan komentar. Saya menginginkannya untuk browser firefox. Juga saya mengambil info langsung dari situs web babel itu sendiri. Komentar itu tidak membantu saya memecahkan masalah ketika saya mencobanya.
Petros Kyriakou
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.