Babel 6 regeneratorRuntime ไม่ได้ถูกกำหนดไว้


634

ฉันกำลังพยายามใช้ async รอตั้งแต่เริ่มต้นที่ Babel 6 แต่ฉันไม่ได้กำหนด regeneratorRuntime

.babelrc ไฟล์

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

ไฟล์ package.json

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

ไฟล์. js

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

ใช้งานได้ตามปกติโดยไม่ต้องใช้ async / await ทำงานได้ดี ความคิดใดที่ฉันทำผิด


คุณรวม regenerator แล้วหรือยัง?
ssube

3
babel-polyfill คือสิ่งที่คุณต้องการ
Ronnie Royston

babel-polyfill ได้รับการคิดค่าเสื่อมราคาตั้งแต่ 7.4; อัปเดตนี้เพื่อโพสต์อธิบายการโยกย้าย
JWCS

สำหรับผู้ที่ใช้ Babel และโหนดรุ่นใหม่กว่า: stackoverflow.com/a/62254909/8169904
จันทร์

คำตอบ:


682

babel-polyfill( คัดค้าน Babel 7.4) คุณต้องติดตั้งเพื่อรับ async / รอการทำงาน

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 พร้อม async / await (โค้ดตัวอย่าง)

"use strict";

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

function bar() {
  return "bar";
}

ในไฟล์เริ่มต้น

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

หากคุณกำลังใช้webpackคุณต้องใส่มันเป็นค่าแรกของentryอาร์เรย์ในไฟล์กำหนดค่าwebpack.config.jswebpack ของคุณ (โดยปกติ) ตามความคิดเห็น @Cemen:

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

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

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

หากคุณต้องการรันการทดสอบด้วย babel ให้ใช้:

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

77
ที่สำคัญเมื่อคุณกำลังใช้ Babel กับ webpack: แทนที่จะใช้require("babel-polyfill")ที่ไม่ได้ทำงานที่คุณเพิ่ม"babel-polyfill"เข้าไปในของคุณในการตั้งค่าเช่นนี้entry entry: ["babel-polyfill", "src/main.js"]สิ่งนี้ใช้ได้สำหรับฉันรวมถึงการใช้งานใน webpack-dev-server พร้อม HMR
Cemen

6
ฉันพยายามที่จะรับการทดสอบมอคค่าของฉันเพื่อให้ทำงานกับ babel6 และ async และฉันต้องเพิ่ม - ต้องการ babel-polyfill ในการกำหนดค่าการทดสอบนักวิ่ง
npm

13
babel-register คืออะไร
trusktr

6
@ ลอยด์devDependencyถ้าคุณใช้ webpack เพราะมันจะ "คอมไพล์" ไฟล์ก่อนเรียกใช้ dependencyถ้าคุณไม่ได้ใช้ webpack และคุณต้องการ babel
BrunoLM

4
สิ่งนี้ทำให้ขนาดไฟล์ออกใหญ่ ... ดีกว่าที่จะใช้เฉพาะสิ่งที่คุณต้องการแทนที่จะต้องการ babel-polyfill โดยตรง
Inanc Gumus

340

นอกจาก polyfill ผมใช้Babel-ปลั๊กอินเปลี่ยนรันไทม์ ปลั๊กอินอธิบายว่า:

ทำการอ้างอิงภายนอกไปยังผู้ช่วยเหลือและบิลด์ภายในโดยอัตโนมัติเติมรหัสของคุณโดยไม่ทำให้เกิดมลภาวะ จริง ๆ แล้วสิ่งนี้หมายความว่าอย่างไร โดยทั่วไปคุณสามารถใช้บิวด์อินเช่น Promise, Set, Symbol เป็นต้นรวมถึงฟีเจอร์ทั้งหมดของ Babel ที่ต้องการโพลีฟิลอย่างราบรื่นโดยไม่มีมลภาวะระดับโลกทำให้เหมาะอย่างยิ่งสำหรับห้องสมุด

นอกจากนี้ยังมีการรองรับ async / คอยพร้อมกับบิวด์อินอื่น ๆ ของ ES 6

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

ใน.babelrcเพิ่มปลั๊กอินรันไทม์

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

หมายเหตุ: หากคุณกำลังใช้ Babel 7 แพคเกจได้รับการเปลี่ยนชื่อ@ Babel / ปลั๊กอินเปลี่ยนรันไทม์


11
ฉันไม่ต้องการbabel-runtimeรับ async รอการทำงาน ถูกต้องหรือไม่ แก้ไข: ฉันใช้ฝั่งเซิร์ฟเวอร์รหัส :)
GijsjanB

8
หากคุณสามารถใช้งานได้โดยไม่ต้องใช้ babel-runtime นั่นเป็นเพราะมันอยู่ในแผนผังการพึ่งพา ดังนั้นโปรดทราบว่าหากคุณกำลังเขียนไลบรารีและ babel-runtime กำลังเข้ามาเป็นผู้พัฒนาระบบอาจไม่ได้อยู่ที่นั่นสำหรับผู้ใช้ของคุณ คุณจะต้องรวมมันเป็นการพึ่งพาปกติสำหรับการกระจาย
Neverfox

23
babel-plugin-transform-runtimeจำเป็นเท่านั้น ทำงานเหมือนจับใจ
saike

9
โซลูชันนี้ไม่ตกลงเนื่องจากต้องใช้งาน Browserify หรือ Webpack เพิ่มเติมเพื่อขยายการrequireโทรที่เพิ่มโดยtransform-runtimeปลั๊กอิน
กลเม็ดเด็ด

9
โปรดทราบว่าสำหรับ Babel 7 คุณต้องวิ่งnpm install --save-dev @babel/plugin-transform-runtime
Andrey Semakin

196

ผู้ใช้ Babel 7 คน

ฉันมีปัญหาในการแก้ไขเนื่องจากข้อมูลส่วนใหญ่เป็นรุ่นบาเบลก่อน สำหรับ Babel 7 ให้ติดตั้งการขึ้นต่อกันทั้งสองนี้:

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

และใน .abelabel ให้เพิ่ม:

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

วิธีที่เราสามารถทำได้โดยไม่ต้อง .abelrc (เพียงแค่ใช้ไฟล์
กำหนดค่า webpack

2
เอกสารแสดงการใช้งานเป็น"plugins": ["@babel/plugin-transform-runtime"]ไม่ใช่ที่"plugins": [ ["@babel/transform-runtime"] ]นี่ ชื่อปลั๊กอินที่แตกต่างกัน ทั้งงาน แต่อันไหนที่ถูกต้อง?
kyw

5
ฉันไม่ได้รับสิ่งที่ต้องการเมื่อทำตามวิธีนี้
แบทแมน

1
@kyw ที่ดีที่สุดในการติดตามเอกสารเสมอ - ไม่แตกต่างจากการประชุม
Matt Shirley

4
การเพิ่ม@babel/transform-runtimeลงในปลั๊กอินทำให้เกิดข้อผิดพลาด "การส่งออกไม่ได้ถูกกำหนด" สำหรับฉัน ฉันเปลี่ยนเป็นสิ่งนี้เพื่อให้ async ทำงานใน Babel7:["@babel/plugin-transform-runtime", { "regenerator": true } ]
Hari

105

ปรับปรุง

ใช้งานได้หากคุณตั้งเป้าหมายเป็น Chrome แต่มันอาจไม่ทำงานสำหรับเป้าหมายอื่น ๆ โปรดดูที่: https://github.com/babel/babel-preset-env/issues/112

ดังนั้นคำตอบนี้ไม่เหมาะสมสำหรับคำถามต้นฉบับ babel-preset-envฉันจะให้ที่นี่เป็นข้อมูลอ้างอิงเพื่อ

ทางออกที่ง่ายคือการเพิ่มimport 'babel-polyfill'ที่จุดเริ่มต้นของรหัสของคุณ

หากคุณใช้ webpack ทางออกที่รวดเร็วคือการเพิ่มbabel-polyfillดังที่แสดงด้านล่าง:

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

ฉันเชื่อว่าฉันพบวิธีปฏิบัติที่ดีที่สุดล่าสุดแล้ว

ตรวจสอบโครงการนี้: https://github.com/babel/babel-preset-env

yarn add --dev babel-preset-env

ใช้สิ่งต่อไปนี้ตามการตั้งค่า babel ของคุณ:

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

จากนั้นแอปของคุณควรไปในเบราว์เซอร์ Chrome เวอร์ชัน 2 ล่าสุด

นอกจากนี้คุณยังสามารถตั้งค่าNodeให้เป็นเป้าหมายหรือปรับแต่งรายการเบราว์เซอร์ตามhttps://github.com/ai/browserslist

บอกฉันทีว่าอย่าบอกฉันสิ

ฉันชอบbabel-preset-envปรัชญาของ: บอกฉันว่าคุณต้องการสนับสนุนสภาพแวดล้อมแบบใดอย่าบอกวิธีการสนับสนุนพวกเขา มันเป็นความงามของการเขียนโปรแกรมที่เปิดเผย

ฉันได้ทดสอบasync awaitแล้วและพวกมันทำงานได้ดี ฉันไม่รู้ว่ามันทำงานอย่างไรและฉันก็ไม่อยากรู้ ฉันต้องการใช้เวลากับโค้ดของตัวเองและใช้ตรรกะทางธุรกิจแทน ขอบคุณbabel-preset-envมันปลดปล่อยฉันจากนรกการตั้งค่าบาเบล


3
มันใช้งานได้จริง ข้อเสียเพียงอย่างเดียวคือการพึ่งพาที่ดึงมาbabel-preset-envแต่ฉันคิดว่ามันคุ้มค่า รักสไตล์ที่เปิดเผยเช่นกัน นอกจากนี้ยังมีyarn installอยู่ในขณะนี้yarn add
โรมัน Usherenko

1
@gargantuan ใช่มันเป็นเช่นนั้น
ไทเลอร์ลอง

3
ไม่ใช่วิธีการแก้ปัญหาหากคุณต้องการกำหนดเป้าหมายเบราว์เซอร์รุ่นเก่าหรือรุ่นโหนด
Rohan Orton

2
ในกรณีที่ไม่ชัดเจน .... วิธีแก้ปัญหาที่แนะนำนี้จะไม่ทำงานหากคุณต้องการให้โค้ดทำงานใน IE11
Maurice

7
ทำไมสิ่งนี้ถึงมีคะแนนโหวตมากนัก? วิธีนี้ใช้งานได้เนื่องจากไม่แปลง async / คอยอีกต่อไปและไม่ต้องการ regeneratorRuntime อีกต่อไปและเนื่องจากมันไม่ได้ถูกแปลงจะไม่ทำงานบนเบราว์เซอร์ที่ไม่รองรับ
Shikyo

47

อีกทางเลือกหนึ่งหากคุณไม่ต้องการโมดูลทั้งหมดที่babel-polyfillมีให้คุณสามารถระบุbabel-regenerator-runtimeในการกำหนดค่าwebpack ของคุณ:

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

  // ...
};

เมื่อใช้ webpack-dev-server กับ HMR การทำเช่นนี้จะช่วยลดจำนวนไฟล์ที่จะรวบรวมในทุกบิลด์ได้มาก โมดูลนี้ได้รับการติดตั้งเป็นส่วนหนึ่งbabel-polyfillดังนั้นหากคุณมีโมดูลที่ใช้ได้อยู่แล้วมิฉะนั้นคุณสามารถติดตั้งโมดูลแยกต่างหากnpm i -D babel-regenerator-runtimeได้


นี่น่าจะเป็นทางออกที่สะดวกที่สุด อย่างไรก็ตามเบราว์เซอร์ส่วนใหญ่สนับสนุนกำเนิดดังนั้นวิธีนี้อาจไม่ใช่วิธีที่ดีที่สุด ดู: blogs.candoerz.com/question/213492/…
Kitanotori

ถ้าคุณไม่ได้ใช้ webpack ล่ะ
แบทแมน

38

ทางออกที่เรียบง่ายของฉัน:

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
คุณไม่มีปลั๊กอิน "transform-async-to-generator" ในปลั๊กอิน ฉันต้องเพิ่มสิ่งนั้นเช่นกันเพื่อให้มันใช้งานได้
GabrielBB

@GabrielBB ฉันได้แก้ไขโพสต์จึงเป็นตัวอย่างที่สมบูรณ์
webnoob

2
เป็นที่loose: trueจำเป็น?
Tom Söderlund

เมื่อใช้สิ่งนี้มันจะเพิ่มไฟล์ของฉันและต้องการไม่ได้กำหนดในเบราว์เซอร์
แบทแมน

Loose: ไม่จำเป็นต้องใช้จริง สิ่งที่คุณต้องการจริงๆใน. babelrc ของคุณคือ: {"presets": ["es2015", "react", "stage-2"], "plugins": ["transform-runtime", "transform-async-to-generator "]}
Efe Ariaroo

29

Babel 7.4.0 หรือใหม่กว่า (core-js 2/3)

ในฐานะของบาเบล 7.4.0 , @babel/polyfill จะ เลิก

โดยทั่วไปมีสองวิธีในการติดตั้ง polyfills / regenerator: ผ่าน namespace ทั่วโลก (ตัวเลือก 1) หรือเป็น ponyfill (ตัวเลือก 2 โดยไม่มีมลพิษทั่วโลก)


ตัวเลือกที่ 1: @babel/preset-env

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

จะใช้โดยอัตโนมัติregenerator-runtimeและการcore-jsได้ตามเป้าหมาย ไม่จำเป็นต้องนำเข้าสิ่งใดด้วยตนเอง อย่าลืมที่จะติดตั้งการพึ่งพารันไทม์:

npm i --save regenerator-runtime core-js

อีกวิธีหนึ่งคือตั้งค่าuseBuiltIns: "entry"และนำเข้าด้วยตนเอง:

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

ตัวเลือก 2: @babel/transform-runtimeด้วย@babel/runtime(ไม่มีขอบเขตขอบเขตมลพิษ)

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

ติดตั้ง:

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

ถ้าคุณใช้แกน js polyfills คุณติดตั้ง@babel/runtime-corejs2หรือ@babel/runtime-corejs3แทนโปรดดูที่นี่

ไชโย


2
นี่เป็นคำตอบที่ถูกต้องทันสมัยที่สุดและช่วยฉันในการแก้ปัญหาเกี่ยวกับโครงการปัจจุบันของฉัน ขอบคุณ!
cdpautsch

2
{"presets": [["@ babel / preset-env", {"เป้าหมาย": {"esmodules": true}}]]}} สิ่งนี้ช่วยฉันในการสร้าง node.js
Smolin Pavel

3
ฉันหมายความว่าฉันรู้แล้ว แต่เพื่อช่วยเหลือผู้อื่นนี่เป็นคำตอบที่ถูกต้อง ขอแสดงความนับถืออย่างสูง!
Niewiadomski Paweł

หมายเหตุ: ฉันคิดว่ามันเหมาะสมที่จะใช้เธรด Babel 7ดังนั้นข้อผิดพลาดเกี่ยวกับรุ่นจึงสามารถแยกความแตกต่างได้ดีขึ้น คุณสามารถหาคำตอบที่เฉพาะเจาะจงมากขึ้นได้ที่นี่ (แต่ข้อความข้างต้นยังคงเป็นจริง)
04

16

babel-regenerator-runtimeคือตอนนี้เลิกใช้regenerator-runtimeแทนควรใช้

ในการใช้ตัวสร้างรันไทม์ด้วยwebpackและbabelv7:

ติดตั้งregenerator-runtime:

npm i -D regenerator-runtime

จากนั้นเพิ่มในการกำหนดค่า webpack:

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

นี่ควรเป็นคำตอบที่ได้รับการยอมรับ, babel-polyfill เพิ่มวิธีอื่น ๆ มากเกินไป
Shikyo

ทำงานได้ดีสำหรับฉัน ... ขอบคุณมาก
Leandro William

1
วิธีการนี้จะรวมรันไทม์ด้วยเสมอ ผมเชื่อว่ามันขัดแย้งกับวัตถุประสงค์ของ@babel/preset-env's useBuiltInsจากแบบไดนามิกใส่รันไทม์ขึ้นอยู่กับเบราว์เซอร์เป้าหมายของคุณ
kyw

13

อัปเดต.babelrcไฟล์ของคุณตามตัวอย่างต่อไปนี้มันจะทำงาน

ถ้าคุณใช้@babel/preset-envแพ็คเกจ

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

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

2
โปรดอธิบายคำตอบของคุณ? "node": "current" ทำอะไร
Vishal Solanki

ฉันอยากจะรู้ว่าสิ่งนี้ทำอะไรและถ้ามันเป็นวิธีการแก้ปัญหาที่แนะนำ - นั่นคือมันไม่เป็นอันตรายต่อสิ่งใดและเป็น "หลักฐานในอนาคต" (มากเท่าที่จะเป็นไปได้ในขณะนี้) targetsดูเหมือนว่าจะอ้างถึงสิ่งนี้ : the environments you support/target for your projectในขณะนี้targets.nodeคือ: 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 ฉันใช้บล็อกที่สองที่กำหนดในคำตอบ (และลบออก"stage-0"ในกระบวนการ) และข้อผิดพลาดกำเนิดใหม่หายไป
user1063287

1
@BunkerBoy เพื่อความสะดวกคุณสามารถใช้ "node": "current" เพื่อรวมเฉพาะ polyfills และการแปลงสำหรับรุ่น Node.js ที่คุณใช้เพื่อเรียกใช้ Babel
Zero

ดังนั้นฉันจึงไม่ต้องติดตั้ง polyfills?
Vishal Solanki

12

ระวังฟังก์ชั่นการยก

ฉันมีทั้ง 'การนำเข้า polyfill' และ 'ฟังก์ชั่น async' ของฉันในไฟล์เดียวกัน แต่ฉันใช้ไวยากรณ์ของฟังก์ชั่นที่ยกขึ้นเหนือ polyfill ซึ่งจะทำให้ฉันมีReferenceError: regeneratorRuntime is not definedข้อผิดพลาด

เปลี่ยนรหัสนี้

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

สำหรับสิ่งนี้

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

เพื่อป้องกันไม่ให้ถูกยกขึ้นเหนือการนำเข้า polyfill


5
a; kgjablrsdkjfjasnkljfbajklfdablkhjnfl; เศร้าฉันสูญเสียความคิดของฉันและคุณได้ช่วยฉันฉันรักคุณ
John R Perry

11

ตั้งแต่ตุลาคม 2019 สิ่งนี้ได้ผลกับฉัน:

เพิ่มลงในที่ตั้งไว้ล่วงหน้า

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

จากนั้นติดตั้ง regenerator-runtime โดยใช้ npm

npm i regenerator-runtime

และในการใช้ไฟล์หลักของคุณ: (การนำเข้านี้ใช้เพียงครั้งเดียว)

import "regenerator-runtime/runtime";

สิ่งนี้จะช่วยให้คุณสามารถใช้async awaitsในไฟล์ของคุณและลบregenerator error


ไม่ได้ตั้งค่าสำหรับจะเริ่มต้นมันuseBuiltIns falseนี้จะไม่นำเข้ารถยนต์ polyfills ใด ๆ "@babel/preset-env"ขึ้นอยู่กับสภาพแวดล้อมเป้าหมายซึ่งค่อนข้างทำลายวัตถุประสงค์ของ นี่คือความคิดเห็นที่เกี่ยวข้องโดยหนึ่งในนักพัฒนา babel
bela53

10

ถ้าใช้แล้วก็ต้องเริ่มต้นสคริปต์ด้วยbabel-preset-stage-2--require babel-polyfill

ในกรณีของฉันข้อผิดพลาดนี้ถูกโยนโดยMochaการทดสอบ

การติดตามแก้ไขปัญหา

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


9

ฉันเริ่มได้รับข้อผิดพลาดนี้หลังจากที่แปลงโครงการของฉันให้เป็นโครงการแบบอักษรตัวพิมพ์ จากสิ่งที่ฉันเข้าใจปัญหาเกิดจาก async / คอยไม่ได้รับการยอมรับ

สำหรับฉันข้อผิดพลาดได้รับการแก้ไขโดยการเพิ่มสองสิ่งในการตั้งค่าของฉัน:

  1. ดังที่ได้กล่าวมาแล้วหลายครั้งฉันจำเป็นต้องเพิ่ม babel-polyfill ในอาร์เรย์รายการ webpack ของฉัน:

    ...
    
    รายการ: ['babel-polyfill', './index.js'],
    
    ...
  2. ฉันต้องการอัปเดต .abelrc ของฉันเพื่ออนุญาตให้มีการร้องเรียน async / ที่รอเข้าเครื่องปั่นไฟ:

    {
      "ค่าที่ตั้งล่วงหน้า": ["es2015"],
      "ปลั๊กอิน": ["transform-async-to-generator"]
    }

DevDependencies:

ฉันต้องติดตั้งบางสิ่งลงในอุปกรณ์ของฉันในไฟล์ package.json ของฉันด้วย คือฉันพลาด babel-plugin-transform-async-to-generator, babel-polyfill และ 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"
 }

สรุปสาระสำคัญรหัสเต็ม:

ผมได้รับรหัสจากการที่เป็นประโยชน์จริงๆและรัดกุมส่วนสำคัญ GitHub คุณสามารถหาได้ที่นี่


3
มันเป็นเรื่องดีที่จะใช้ที่ตั้งไว้แทนenv รวมถึงแล้ว es2015enves2015
Neurotransmitter

9

ฉันมีปัญหานี้ใน Chrome คล้ายกับคำตอบของRienNeVaPlu͢ซึ่งแก้ไขได้สำหรับฉัน:

npm install --save-dev regenerator-runtime

จากนั้นในรหัสของฉัน:

import 'regenerator-runtime/runtime';

ความสุขที่จะหลีกเลี่ยงการพิเศษ 200 babel-polyfillกิโลไบต์จาก


8

คุณได้รับข้อผิดพลาดเนื่องจาก async / รอการใช้เครื่องกำเนิดไฟฟ้าซึ่งเป็นคุณสมบัติ ES2016 ไม่ใช่ ES2015 วิธีหนึ่งในการแก้ไขปัญหานี้คือการติดตั้ง babel preset สำหรับ ES2016 ( npm install --save babel-preset-es2016) และคอมไพล์เป็น ES2016 แทน ES2015:

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

ตามคำตอบอื่น ๆ ที่กล่าวถึงคุณยังสามารถใช้polyfills (แต่ต้องแน่ใจว่าคุณโหลด polyfillก่อนที่จะเรียกใช้รหัสอื่น) หรือถ้าคุณไม่ต้องการที่จะรวมทั้งหมดของการอ้างอิง polyfill คุณสามารถใช้Babel-ฟื้นฟูรันไทม์หรือBabel-ปลั๊กอินเปลี่ยนรันไทม์


8

ข้อผิดพลาดนี้เกิดขึ้นเมื่อasync/awaitใช้ฟังก์ชันโดยไม่มีปลั๊กอิน Babel ที่เหมาะสม เมื่อวันที่มีนาคม 2563 สิ่งที่คุณต้องทำมีดังต่อไปนี้ ( @babel/polyfillและโซลูชั่นที่ยอมรับจำนวนมากเลิกใช้แล้วใน Babel อ่านเพิ่มเติมในBabel docs )

ในบรรทัดคำสั่งพิมพ์:

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

ในbabel.config.jsไฟล์ของคุณเพิ่มปลั๊กอิน@babel/plugin-transform-runtimeนี้ หมายเหตุ: ตัวอย่างด้านล่างนี้รวมถึงการตั้งค่าล่วงหน้าและปลั๊กอินอื่น ๆ ที่ฉันมีสำหรับโครงการ React / Node / Express ขนาดเล็กที่ฉันทำงานเมื่อเร็ว ๆ นี้:

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

สิ่งที่ทำให้ฉันประหลาดใจอยู่เสมอคือนักพัฒนาขี้เกียจ Babel devs ตัดสินใจเลิกใช้งานฟังก์ชั่นพวกเขาอาจคาดหวังว่าสิ่งนี้จะกลายเป็นปัญหา ทำไมไม่ให้คนอื่นรู้ว่าอะไรคือเจตนาที่เป็นไปได้มากที่สุดและพวกเขาควรทำอะไรเพื่อแก้ไข แต่ไม่เรามาแสดงข้อความที่ไม่มีประโยชน์อะไรสำหรับมือใหม่
Pavel Voronin

ไม่สามารถใช้งานได้imgur.com/a/2Ea8WDk
ไม่น่าเป็นไปได้

ใช้งานได้ดีสำหรับฉัน โครงการที่ไม่ตอบสนองของฉัน.babelrcมีลักษณะเช่นนี้: `` `{" presets ": [" @ babel / preset-env "]," plugins ": [" @ babel / plugin-transform-runtime "]}` `
Anthony

7

ฉันแก้ไขข้อผิดพลาดนี้โดยการติดตั้ง babel-polyfill

npm install babel-polyfill --save

จากนั้นฉันก็นำเข้ามาที่จุดเข้าแอพของฉัน

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

สำหรับการทดสอบฉันรวม - ต้องการ babel-polyfill ในสคริปต์ทดสอบของฉัน

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

6

ใหม่คำตอบทำไมคุณทำตามคำตอบของฉัน

ตอบ:เพราะฉันจะให้คำตอบกับโครงการอัปเดตเวอร์ชัน npm ล่าสุด

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"

หากคุณใช้เวอร์ชันนี้หรือสูงกว่าเวอร์ชัน Npm ของคุณและอื่น ๆ ... ดังนั้นเพียงแค่ต้องเปลี่ยน:

webpack.config.js

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

หลังจากเปลี่ยนwebpack.config.jsไฟล์เพียงเพิ่มบรรทัดนี้ไปที่ด้านบนสุดของรหัส

import "babel-polyfill";

ตอนนี้ตรวจสอบทุกอย่างก็โอเค ลิงค์อ้างอิง

ขอบคุณ @BrunoLM สำหรับคำตอบที่ดีของเขา


1
ทำไมเขาถึงต้องใช้ webpack ถ้ามันเป็นบริการแบ็กเอนด์? คำตอบของคุณบอกเป็นนัยว่าเขาต้องใช้เว็บแพค?
สป็อค

1
@ สป็อคฉันคิดเกี่ยวกับมัน ฉันกำลังเผชิญกับปัญหาเดียวกันและฉันแก้ปัญหาด้วยวิธีง่าย ๆ นี้ ฉันคิดว่ามันเป็นคำตอบในเชิงบวกสำหรับผู้ใช้ Webpack และกระต่ายมีคำตอบที่ถูกต้องมากขึ้นเพื่อให้คุณสามารถติดตามได้อีก
MD Ashik

ทำไมคุณต้องกดโหวต !!!! คุณพูดด้วยเหตุผลได้ไหมถ้าคุณต้องการช่วยฉัน
MD Ashik

6

เบราว์เซอร์เป้าหมายที่ฉันต้องการสนับสนุนแล้วรองรับ async / คอย แต่เมื่อเขียนการทดสอบมอคค่าโดยไม่มีการตั้งค่าที่เหมาะสมฉันยังคงได้รับข้อผิดพลาดนี้

บทความส่วนใหญ่ฉัน googled จะล้าสมัยรวมทั้งคำตอบที่ได้รับการยอมรับและได้รับการโหวตสูงคำตอบที่นี่คือคุณไม่จำเป็นต้องpolyfill, ,babel-regenerator-runtime babel-plugin-transform-runtimeเป็นต้นหากเบราว์เซอร์เป้าหมายของคุณรองรับ async / คอยแล้ว (แน่นอนถ้าไม่คุณต้องการ polyfill)

ฉันไม่ต้องการใช้webpackอย่างใดอย่างหนึ่ง

คำตอบของ Tyler Long นั้นอยู่ในเส้นทางที่ถูกต้องตั้งแต่ที่เขาแนะนำbabel-preset-env(แต่ฉันไม่สนใจมันก่อนเพราะเขาพูดถึง polifill ในตอนแรก) ฉันยังได้ReferenceError: regeneratorRuntime is not definedตอนแรกจากนั้นฉันก็รู้ว่าเป็นเพราะฉันไม่ได้ตั้งเป้าหมาย หลังจากตั้งค่าเป้าหมายสำหรับโหนดฉันแก้ไขข้อผิดพลาด 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 - ติดตั้ง 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 - เพิ่ม js babel polyfill ของคุณ:

import 'babel-polyfill';

3 - เพิ่มปลั๊กอินใน .abelabel ของคุณ:

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

ที่มา: http://babeljs.io/docs/plugins/transform-async-to-module-method/


3

ฉันมีการตั้งค่า
ด้วยwebpack ที่ใช้presets: ['es2015', 'stage-0']
และมอคค่าที่ใช้การทดสอบที่รวบรวมโดย webpack

เพื่อให้async/awaitการทดสอบของฉันทำงานได้ทั้งหมดที่ฉันต้องทำคือเพิ่มmocha --require babel-polyfillตัวเลือก


3

ฉันพบข้อผิดพลาดนี้โดยใช้ gulp กับ rollup เมื่อฉันพยายามใช้เครื่องกำเนิดไฟฟ้า 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 }));
});

ฉันอาจกรณีการแก้ปัญหาคือการรวมbabel-polyfillเป็นองค์ประกอบ bower:

bower install babel-polyfill --save

และเพิ่มเป็นการพึ่งพาใน index.html:

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

ขอบคุณ. สิ่งนี้ใช้ได้สำหรับฉัน ฉันไม่รู้ว่าฉันต้องการเพิ่มแท็กสคริปต์เพื่อให้ทำงานในฝั่งไคลเอ็นต์
Raza

3

สำหรับผู้ที่ต้องการใช้babel-polyfillเวอร์ชั่น 7 ^ ทำได้ด้วยwebpackver3 ^

Npm ติดตั้งโมดูล npm i -D @babel/polyfill

จากนั้นในwebpackไฟล์ของคุณในentryจุดของคุณทำเช่นนี้

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

3

Babel 7 ที่ทำงานอยู่ของฉันสำหรับทำปฏิกิริยากับ Regenerator Runtime

.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

หากคุณกำลังสร้างแอปคุณเพียงแค่ต้องการ@babel/preset-envและ@babel/polyfill:

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

(หมายเหตุ: คุณไม่จำเป็นต้องติดตั้งcore-jsและregenerator-runtimeแพ็คเกจเพราะทั้งคู่จะได้รับการติดตั้งโดย @ babel / polyfill)

จากนั้นใน.babelrc:

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

ตอนนี้ตั้งสภาพแวดล้อมเป้าหมายของคุณ ที่นี่เราทำมันใน.browserslistrcไฟล์:

# Browsers that we support

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

สุดท้ายถ้าคุณไปด้วยuseBuiltIns: "entry"ให้ใส่import @babel/polyfillที่ด้านบนของไฟล์บันทึกของคุณ มิฉะนั้นคุณจะทำ

การใช้วิธีนี้จะเลือกนำเข้าไฟล์ polyfills และไฟล์ 'regenerator-runtime' (แก้ไขregeneratorRuntime is not definedปัญหาของคุณที่นี่) เฉพาะในกรณีที่จำเป็นสำหรับสภาพแวดล้อม / เบราว์เซอร์เป้าหมายของคุณ


2

สำหรับการอ้างอิงในอนาคต :

ในฐานะที่ตั้งไว้ล่วงหน้าของ Babel เวอร์ชัน 7.0.0-beta.55 ได้ถูกลบออกไปแล้ว

อ้างอิงบล็อกhttps://babeljs.io/blog/2018/07/27/removing-babels-stage-presets

ยังคงสามารถใช้ async ที่รอคอยได้

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

การติดตั้ง

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

การใช้งานใน . abelrc

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

และใช้ babel polyfill https://babeljs.io/docs/en/babel-polyfill

การติดตั้ง

npm install --save @babel/polyfill

webpack.config.js

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

2

ใน 2019 ด้วยBabel 7.4.0+, babel-polyfillแพคเกจได้รับการคัดค้านในความโปรดปรานของรวมทั้งโดยตรงcore-js/stable( core-js@3+เพื่อ Polyfill ECMAScript มี) และregenerator-runtime/runtime(จำเป็นในการใช้ฟังก์ชั่น transpiled กำเนิด):

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

ข้อมูลจากเอกสารbabel-polyfill


2

วิธีที่ง่ายที่สุดในการแก้ไข 'regeneratorRuntime not define issue' ในคอนโซลของคุณ:

คุณไม่ต้องติดตั้งปลั๊กอินที่ไม่จำเป็น เพียงเพิ่ม:

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

ข้างในร่างกายใน index.html ของคุณ ตอนนี้ควรกำหนด regeneratorRuntime เมื่อคุณเรียกใช้ Babel และตอนนี้ฟังก์ชั่น async / await ของคุณควรได้รับการรวบรวมเป็น ES2015 ได้สำเร็จ


1

หากคุณใช้ Gulp + Babel สำหรับส่วนหน้าคุณต้องใช้ babel-polyfill

npm install babel-polyfill

จากนั้นเพิ่มแท็กสคริปต์ลงใน index.html เหนือแท็กสคริปต์อื่นทั้งหมดและการอ้างอิง babel-polyfill จาก node_modules


ฉันไม่เห็นว่าทำไม downvote และแสดงความคิดเห็น ฉันต้องการมันสำหรับเบราว์เซอร์ Firefox ฉันก็เอาข้อมูลโดยตรงจากเว็บไซต์ของตัวเอง ความคิดเห็นไม่ได้ช่วยฉันแก้ปัญหาเมื่อฉันลอง
Petros Kyriakou
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.