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?
javascript
node.js
babeljs
BrunoLM
sumber
sumber
Jawaban:
babel-polyfill
( tidak digunakan pada Babel 7.4) diperlukan. Anda juga harus menginstalnya agar async / menunggu berfungsi.package.json
.babelrc
.js dengan async / await (kode sampel)
Dalam file startup
Jika Anda menggunakan webpack, Anda harus meletakkannya sebagai nilai pertama
entry
array Anda di file konfigurasi webpack Anda (biasanyawebpack.config.js
), sesuai komentar @Cemen:Jika Anda ingin menjalankan tes dengan babel, gunakan:
sumber
require("babel-polyfill")
yang tidak bekerja, Anda menambahkan"babel-polyfill"
ke dalamentry
dalam konfigurasi, seperti ini:entry: ["babel-polyfill", "src/main.js"]
. Ini bekerja untuk saya, termasuk penggunaan di webpack-dev-server dengan HMR.devDependency
jika Anda menggunakan webpack karena ia kemudian akan "mengkompilasi" file sebelum berjalan.dependency
jika Anda tidak menggunakan webpack dan Anda memerlukan babel.Selain polyfill, saya menggunakan babel-plugin-transform-runtime . Plugin ini dijelaskan sebagai:
Ini juga termasuk dukungan untuk async / menunggu bersama dengan built-in ES 6 lainnya.
Di
.babelrc
, tambahkan plugin runtimesumber
babel-runtime
menunggu async bekerja. Apakah itu benar? Sunting: Saya menjalankan sisi server kode. :)babel-plugin-transform-runtime
diperlukan. Bekerja seperti pesona.require
panggilan yang ditambahkan olehtransform-runtime
plugin.npm install --save-dev @babel/plugin-transform-runtime
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:
Dan, di .babelrc, tambahkan:
sumber
"plugins": ["@babel/plugin-transform-runtime"]
, bukan di"plugins": [ ["@babel/transform-runtime"] ]
sini. Nama plugin berbeda. Keduanya bekerja. Tapi yang mana yang benar? ...@babel/transform-runtime
ke plugin menyebabkan kesalahan "ekspor tidak didefinisikan" untuk saya. Saya mengubahnya ke ini agar async bekerja di Babel7:["@babel/plugin-transform-runtime", { "regenerator": true } ]
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-polyfill
seperti yang ditunjukkan di bawah ini:Saya percaya saya telah menemukan praktik terbaik terbaru.
Periksa proyek ini: https://github.com/babel/babel-preset-env
Gunakan yang berikut ini sebagai konfigurasi babel Anda:
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-env
filosofi: beri tahu saya lingkungan mana yang ingin Anda dukung, JANGAN beri tahu saya cara mendukungnya. Ini keindahan pemrograman deklaratif.Saya sudah menguji
async
await
dan 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. Berkatbabel-preset-env
, itu membebaskan saya dari neraka konfigurasi Babel.sumber
babel-preset-env
tetapi saya pikir itu layak. Cinta gaya deklaratif juga. Jugayarn install
sekarangyarn add
Atau, jika Anda tidak membutuhkan semua modul yang
babel-polyfill
disediakan, Anda bisa menentukanbabel-regenerator-runtime
di konfigurasi webpack Anda: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-polyfill
jadi jika Anda sudah memilikinya, Anda dapat menginstalnya secara terpisahnpm i -D babel-regenerator-runtime
.sumber
Solusi sederhana saya:
.babelrc
sumber
loose: true
dibutuhkan?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
akan secara otomatis menggunakan
regenerator-runtime
dancore-js
sesuai dengan target Anda . Tidak perlu mengimpor apa pun secara manual. Jangan lupa untuk menginstal dependensi runtime:Atau, atur
useBuiltIns: "entry"
dan impor secara manual:Opsi 2:
@babel/transform-runtime
dengan@babel/runtime
(tidak ada polusi lingkup global)Pasang itu:
Jika Anda menggunakan core-js polyfill, Anda menginstal
@babel/runtime-corejs2
atau@babel/runtime-corejs3
sebagai gantinya, lihat di sini .Bersulang
sumber
babel-regenerator-runtime
sekarang sudah ditinggalkan , sebagai gantinya orang harus menggunakanregenerator-runtime
.Untuk menggunakan generator runtime dengan
webpack
danbabel
v7:pasang
regenerator-runtime
:Dan kemudian tambahkan dalam konfigurasi webpack:
sumber
@babel/preset-env
'suseBuiltIns
dari dinamis memasukkan runtime berdasarkan target browser Anda.Perbarui
.babelrc
file Anda sesuai dengan contoh berikut, ini akan berfungsi.Jika Anda menggunakan
@babel/preset-env
paketsumber
targets
tampaknya merujuk pada ini :the environments you support/target for your project
, sementaratargets.node
adalah 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
"stage-0"
dalam proses) dan kesalahan regenerator hilang.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 defined
kesalahan.Ubah kode ini
untuk ini
untuk mencegahnya diangkat di atas impor polyfill.
sumber
Pada Oktober 2019 ini bekerja untuk saya:
Tambahkan ini ke preset.
Kemudian instal regenerator-runtime menggunakan npm.
Dan kemudian dalam penggunaan file utama Anda: (impor ini hanya digunakan sekali)
Ini akan memungkinkan Anda untuk menggunakan
async
awaits
file Anda dan menghapus fileregenerator error
sumber
useBuiltIns
default untukfalse
. 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.Jika menggunakan
babel-preset-stage-2
maka cukup mulai skrip dengan--require babel-polyfill
.Dalam kasus saya kesalahan ini dilemparkan oleh
Mocha
tes.Setelah memperbaiki masalah
mocha \"server/tests/**/*.test.js\" --compilers js:babel-register --require babel-polyfill
sumber
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:
Seperti yang disebutkan di atas berkali-kali, saya perlu menambahkan babel-polyfill ke dalam array entri webpack saya:
Saya perlu memperbarui .babelrc saya untuk memungkinkan kompilasi async / menunggu menjadi 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:
Inti Kode Lengkap:
Saya mendapatkan kode dari intisari GitHub yang sangat membantu dan ringkas yang dapat Anda temukan di sini .
sumber
env
daripadaes2015
. sudahenv
termasukes2015
.Saya punya masalah ini di Chrome. Mirip dengan jawaban RienNeVaPlu, ini menyelesaikannya untuk saya:
Kemudian dalam kode saya:
Senang menghindari tambahan 200 kB dari
babel-polyfill
.sumber
Kesalahan ini disebabkan ketika
async/await
fungsi digunakan tanpa plugin Babel yang tepat. Pada Maret 2020, berikut ini yang harus Anda lakukan. (@babel/polyfill
dan banyak solusi yang diterima telah ditinggalkan di Babel. Baca lebih lanjut di Babel docs. )Di baris perintah, ketik:
Di
babel.config.js
file 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:sumber
.babelrc
terlihat seperti ini: `` `{" preset ": [" @ babel / preset-env "]," plugins ": [" @ babel / plugin-transform-runtime "]}` ``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: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 .
sumber
Saya memperbaiki kesalahan ini dengan menginstal babel-polyfill
kemudian saya mengimpornya di titik masuk aplikasi saya
untuk pengujian saya sertakan --require babel-polyfill dalam skrip pengujian saya
sumber
Jawaban Baru Mengapa Anda mengikuti jawaban saya?
Jawab: Karena saya akan memberi Anda jawaban dengan proyek npm versi Pembaruan terbaru.
14/04/2017
Jika Anda menggunakan versi ini atau lebih banyak versi NPM dan semua lainnya ... SO hanya perlu mengubah:
webpack.config.js
Setelah mengubah
webpack.config.js
file, tambahkan saja baris ini ke atas kode Anda.Sekarang periksa semuanya ok. Referensi LINK
Juga Terima Kasih @BrunoLM untuk Jawabannya yang bagus.
sumber
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 yangReferenceError: regeneratorRuntime is not defined
pertama kemudian saya sadari karena saya tidak menetapkan target. Setelah menetapkan target untuk simpul saya memperbaiki kesalahan regeneratorRuntime :sumber
Untuk pengguna babel7 dan ParcelJS> = 1.10.0 pengguna
.babelrc
diambil dari https://github.com/parcel-bundler/parcel/issues/1762
sumber
1 - Instal babel-plugin-transform-async-to-module-method, babel-polyfil, bluebird, babel-preset-es2015, babel-core:
2 - Tambahkan js babel polyfill Anda:
import 'babel-polyfill';
3 - Tambahkan plugin di .babelrc Anda:
Sumber: http://babeljs.io/docs/plugins/transform-async-to-module-method/
sumber
Saya memiliki pengaturan
dengan menggunakan webpack
presets: ['es2015', 'stage-0']
dan mocha yang menjalankan tes yang dikompilasi oleh webpack.
Agar
async/await
tes saya berfungsi, yang harus saya lakukan adalah menambahkanmocha --require babel-polyfill
opsi.sumber
Saya mendapatkan kesalahan ini menggunakan gulp dengan rollup ketika saya mencoba menggunakan generator ES6:
Saya perkirakan solusinya adalah memasukkan
babel-polyfill
sebagai komponen bower:dan tambahkan itu sebagai ketergantungan pada index.html:
sumber
Untuk orang yang ingin menggunakan
babel-polyfill
versi 7 ^ lakukan ini denganwebpack
ver3 ^.Npm instal modul
npm i -D @babel/polyfill
Kemudian di
webpack
file Anda dientry
titik Anda lakukan inisumber
Babel kerja saya 7 boilerplate yang untuk bereaksi dengan runtime regenerator:
.babelrc
package.json
main.js
sumber
Jika Anda membuat aplikasi, Anda hanya perlu
@babel/preset-env
dan@babel/polyfill
:(Catatan: Anda tidak perlu menginstal
core-js
danregenerator-runtime
paket karena keduanya telah diinstal oleh @ babel / polyfill)Kemudian di
.babelrc
:Sekarang atur lingkungan target Anda. Di sini, kami melakukannya di
.browserslistrc
file: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 defined
masalah Anda di sini) SAJA jika dibutuhkan oleh salah satu lingkungan / browser target Anda.sumber
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
penggunaan dalam .babelrc
dan menggunakan babel polyfill https://babeljs.io/docs/en/babel-polyfill
instalasi
webpack.config.js
sumber
Pada tahun 2019 dengan
Babel 7.4.0+
,babel-polyfill
paket telah usang mendukung secara langsung termasukcore-js/stable
(core-js@3+
, untuk polyfill fitur ECMAScript) danregenerator-runtime/runtime
(diperlukan untuk menggunakan fungsi generator yang dialihkan):Informasi dari
babel-polyfill
dokumentasi .sumber
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/[email protected]/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
sumber
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
sumber