Công cụ tái tạo Babel 6 Không được xác định


634

Tôi đang cố gắng sử dụng async, chờ đợi từ đầu trên Babel 6, nhưng tôi không nhận được trình tái tạo.

tập tin .babelrc

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

tập tin pack.json

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

tập tin .js

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

Sử dụng nó bình thường mà không có async / await hoạt động tốt. Bất cứ ý tưởng những gì tôi đang làm sai?


Bạn đã bao gồm tái sinh?
ssube

3
babel-polyfill là những gì bạn cần.
Ronnie Royston

babel-polyfill đã bị khấu hao kể từ 7.4; Điều này được cập nhật để bài viết mô tả việc di chuyển.
JWCS

Đối với những người sử dụng phiên bản mới hơn của babel và nút: stackoverflow.com/a/62254909/8169904
Mon

Câu trả lời:


682

babel-polyfill( không dùng nữa kể từ Babel 7.4). Bạn cũng phải cài đặt nó để có được async / đang chờ làm việc.

npm i -D babel-core babel-polyfill babel-preset-es2015 babel-preset-stage-0 babel-loader

pack.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 với async / await (mã mẫu)

"use strict";

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

function bar() {
  return "bar";
}

Trong tập tin khởi động

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

Nếu bạn đang sử dụng webpack, bạn cần đặt nó làm giá trị đầu tiên của entrymảng trong tệp cấu hình webpack của bạn (thường webpack.config.js), theo nhận xét của @Cemen:

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

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

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

Nếu bạn muốn chạy thử nghiệm với babel thì hãy sử dụng:

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

77
Quan trọng khi bạn đang sử dụng babel với webpack: thay vì sử dụng require("babel-polyfill")không hoạt động, bạn thêm "babel-polyfill"vào entrycấu hình của bạn , như thế này : entry: ["babel-polyfill", "src/main.js"]. Điều này làm việc cho tôi, bao gồm cả việc sử dụng trong webpack-dev-server với HMR.
Cemen

6
Tôi đã cố gắng để các bài kiểm tra mocha của mình chạy với babel6 và async và tôi đã phải thêm - yêu cầu babel-polyfill vào cấu hình người chạy thử nghiệm npm
npm

13
Babel - đăng ký để làm gì?
trusktr

6
@Lloyd devDependencynếu bạn đang sử dụng webpack vì sau đó nó sẽ "biên dịch" các tệp trước khi chạy. dependencynếu bạn không sử dụng webpack và bạn đang cần babel.
BrunoLM

4
Điều này làm cho kích thước tệp đầu ra rất lớn ... Tốt hơn là chỉ sử dụng những gì bạn cần thay vì yêu cầu babel-polyfill trực tiếp.
Inanc Gumus

341

Bên cạnh polyfill, tôi sử dụng babel-plugin-Transform-runtime . Plugin được mô tả là:

Bên ngoài tham chiếu đến người trợ giúp và nội dung, tự động điền mã của bạn mà không gây ô nhiễm toàn cầu. Điều này thực sự có nghĩa là gì? Về cơ bản, bạn có thể sử dụng các tính năng tích hợp như Promise, Set, Symbol, v.v. cũng như sử dụng tất cả các tính năng Babel yêu cầu một polyfill liền mạch, không gây ô nhiễm toàn cầu, làm cho nó cực kỳ phù hợp cho các thư viện.

Nó cũng bao gồm hỗ trợ cho async / await cùng với các tích hợp khác của ES 6.

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

Trong .babelrc , thêm plugin thời gian chạy

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

Lưu ý Nếu bạn đang sử dụng babel 7, gói đã được đổi tên thành @ babel / plugin-Transform-runtime .


11
Tôi không cần babel-runtimephải lấy async chờ làm việc. Đúng không? Chỉnh sửa: Tôi đang chạy phía máy chủ mã. :)
GijsjanB

8
Nếu bạn có thể sử dụng nó mà không cần babel-runtime, thì đó là vì nó đã có trong cây phụ thuộc của bạn. Vì vậy, hãy lưu ý rằng nếu bạn đang viết thư viện và babel-runtime xuất hiện dưới dạng phụ thuộc dev, nó có thể không có ở đó cho người dùng của bạn. Bạn sẽ phải bao gồm nó như là một phụ thuộc bình thường để phân phối.
neverfox

23
chỉ babel-plugin-transform-runtimeyêu cầu Hoạt động như một lá bùa.
saike

9
Giải pháp này không ổn vì nó yêu cầu thêm công việc Browserify hoặc Webpack để mở rộng các requirecuộc gọi được bổ sung bởi transform-runtimeplugin.
Finesse

9
Lưu ý rằng đối với Babel 7, bạn cần chạynpm install --save-dev @babel/plugin-transform-runtime
Andrey Semakin

197

Babel 7 người dùng

Tôi đã gặp một số rắc rối xung quanh vấn đề này vì hầu hết thông tin là dành cho các phiên bản babel trước đó. Đối với Babel 7, cài đặt hai phụ thuộc này:

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

Và, trong .babelrc, thêm:

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

Làm thế nào chúng ta có thể làm điều đó mà không cần .babelrc (chỉ sử dụng tệp cấu hình webpack)
Pouya Jabbarisani

2
Các tài liệu cho thấy việc sử dụng như "plugins": ["@babel/plugin-transform-runtime"], hơn là "plugins": [ ["@babel/transform-runtime"] ]ở đây. Tên plugin khác nhau. Cả hai công trình. Nhưng cái nào là đúng? ..
kyw 2/2/19

5
Tôi nhận được yêu cầu không được xác định khi làm theo phương pháp này
Batman

1
@kyw tốt nhất để luôn tuân theo các tài liệu - không có sự khác biệt nào ngoài quy ước.
Matt Shirley

4
Thêm @babel/transform-runtimevào các plugin gây ra lỗi "xuất khẩu không được xác định" đối với tôi. Tôi đã thay đổi nó thành cái này để có được async hoạt động trong Babel7:["@babel/plugin-transform-runtime", { "regenerator": true } ]
Hari

105

Cập nhật

Nó hoạt động nếu bạn đặt mục tiêu thành Chrome. Nhưng nó có thể không hoạt động cho các mục tiêu khác, vui lòng tham khảo: https://github.com/babel/babel-preset-env/issues/112

Vì vậy, câu trả lời này là KHÔNG hoàn toàn đúng cho câu hỏi ban đầu. Tôi sẽ giữ nó ở đây như một tài liệu tham khảo babel-preset-env.

Một giải pháp đơn giản là thêm import 'babel-polyfill'vào đầu mã của bạn.

Nếu bạn sử dụng gói web, một giải pháp nhanh chóng là thêm babel-polyfillvào như dưới đây:

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

Tôi tin rằng tôi đã tìm thấy thực hành tốt nhất mới nhất.

Kiểm tra dự án này: https://github.com/babel/babel-preset-env

yarn add --dev babel-preset-env

Sử dụng như sau cấu hình babel của bạn:

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

Sau đó, ứng dụng của bạn sẽ hoạt động tốt trong 2 phiên bản trình duyệt Chrome cuối cùng.

Bạn cũng có thể đặt Node làm mục tiêu hoặc tinh chỉnh danh sách trình duyệt theo https://github.com/ai/browserslist

Nói cho tôi biết, đừng nói với tôi như thế nào.

Tôi thực sự thích babel-preset-envtriết lý của bạn: cho tôi biết bạn muốn hỗ trợ môi trường nào, KHÔNG cho tôi biết cách hỗ trợ họ. Đó là vẻ đẹp của lập trình khai báo.

Tôi đã thử nghiệm async awaitvà họ làm việc. Tôi không biết làm thế nào họ làm việc và tôi thực sự không muốn biết. Thay vào đó, tôi muốn dành thời gian cho mã riêng và logic kinh doanh của mình. Nhờ babel-preset-env, nó giải phóng tôi khỏi địa ngục cấu hình Babel.


3
Điều này thực sự hoạt động. Nhược điểm duy nhất là một loạt các phụ thuộc được kéo theo babel-preset-envnhưng tôi nghĩ nó đáng giá. Yêu phong cách khai báo quá. Cũng yarn installbây giờyarn add
Roman Usherenko

1
@gargantuan Có.
Tyler Long

3
Không thực sự là một giải pháp nếu bạn muốn nhắm mục tiêu các trình duyệt cũ hơn hoặc các phiên bản nút.
Rohan Orton

2
Chỉ trong trường hợp không rõ ràng .... giải pháp được đề xuất này sẽ KHÔNG hoạt động nếu bạn cần mã của mình để hoạt động trong IE11
Maurice

7
Tại sao điều này có rất nhiều phiếu bầu? Điều này chỉ hoạt động vì nó không còn biến đổi async / await và do đó không còn cần bộ tái tạoR.78 và vì nó không được chuyển đổi nên nó sẽ không hoạt động trên các trình duyệt không hỗ trợ nó.
Shikyo

47

Ngoài ra, nếu bạn không cần tất cả các mô-đun babel-polyfillcung cấp, bạn chỉ có thể chỉ định babel-regenerator-runtimetrong cấu hình gói webpack của mình:

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

  // ...
};

Khi sử dụng webpack-dev-server với HMR, việc này giúp giảm số lượng tệp mà nó phải biên dịch trên mỗi bản dựng khá nhiều. Mô-đun này được cài đặt như một phần babel-polyfillvì vậy nếu bạn đã có thì bạn vẫn ổn, nếu không bạn có thể cài đặt riêng nó npm i -D babel-regenerator-runtime.


Đây dường như là giải pháp thuận tiện nhất. Tuy nhiên, hầu hết các trình duyệt đều hỗ trợ trình tạo, vì vậy giải pháp này có lẽ không phải là giải pháp tối ưu. Xem: blog.candoerz.com/question/213492/ Lời
Kitanotori 16/07/2016

Nếu bạn không sử dụng webpack thì sao?
dơi

38

Giải pháp đơn giản của tôi:

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
Bạn đang thiếu "biến đổi không đồng bộ thành trình tạo" trong các plugin. Tôi cũng phải thêm nó để làm cho nó hoạt động
GabrielBB

@GabrielBB Tôi đã chỉnh sửa bài đăng để nó là một ví dụ hoàn chỉnh.
webnoob

2
loose: truecần thiết không?
Tom Söderlund

Khi sử dụng, nó thêm yêu cầu vào tệp của tôi và yêu cầu không được xác định trong trình duyệt.
dơi

lỏng lẻo: đúng là KHÔNG cần thiết. Thứ bạn thực sự cần trong "]}
Efe Ariaroo

29

Babel 7.4.0 trở lên (core-js 2/3)

Tính đến Babel 7.4.0 , @babel/polyfill được tán thành .

Nói chung, có hai cách để cài đặt polyfill / tái tạo: thông qua không gian tên toàn cầu (Tùy chọn 1) hoặc dưới dạng ponyfill (Tùy chọn 2, không gây ô nhiễm toàn cầu).


Lựa chọn 1: @babel/preset-env

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

sẽ tự động sử dụng regenerator-runtimecore-jstheo mục tiêu của bạn . Không cần phải nhập bất cứ thứ gì bằng tay. Đừng quên cài đặt phụ thuộc thời gian chạy:

npm i --save regenerator-runtime core-js

Hoặc, đặt useBuiltIns: "entry"và nhập thủ công:

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

Lựa chọn 2: @babel/transform-runtime với @babel/runtime(không có ô nhiễm phạm vi toàn cầu)

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

Cài đặt nó:

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

Nếu bạn sử dụng các polyfill core-js, bạn cài đặt @babel/runtime-corejs2hoặc @babel/runtime-corejs3thay vào đó, xem tại đây .

Chúc mừng


2
Đây là câu trả lời chính xác, cập nhật nhất và giúp tôi giải quyết vấn đề trong dự án hiện tại của mình. Cảm ơn bạn!
cdpautsch

2
{"presets": [["@ babel / preset-env", {"Target": {"esmodules": true}}]]} Điều này đã giúp tôi xây dựng node.js
Smolin Pavel

3
Ý tôi là tôi đã biết điều đó rồi nhưng để giúp đỡ người khác thì đây phải là câu trả lời đúng. Trân trọng!
Niewiadomski Paweł

Lưu ý: Tôi nghĩ rằng, nên sử dụng luồng Babel 7 , vì vậy các lỗi liên quan đến phiên bản có thể được phân biệt rõ hơn. Bạn có thể tìm thấy một phiên bản cụ thể hơn của câu trả lời này tại đây (nhưng các tuyên bố trên vẫn đúng)
ford04

16

babel-regenerator-runtimebây giờ không được dùng nữa , thay vào đó người ta nên sử dụngregenerator-runtime .

Để sử dụng trình tạo thời gian chạy với webpackbabel v7:

cài đặt regenerator-runtime:

npm i -D regenerator-runtime

Và sau đó thêm vào trong cấu hình webpack:

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

Đây phải là câu trả lời được chấp nhận, babel-polyfill bổ sung thêm quá nhiều thứ khác
Shikyo

Làm việc hoàn hảo với tôi ... Cảm ơn rất nhiều
Leandro William

1
Phương pháp này luôn bao gồm thời gian chạy mặc dù. Tôi tin rằng nó đánh bại mục đích @babel/preset-envcủa useBuiltInstừ động chèn thời gian chạy dựa trên các trình duyệt mục tiêu của bạn.
kyw

13

Cập nhật .babelrctệp của bạn theo các ví dụ sau, nó sẽ hoạt động.

Nếu bạn đang sử dụng @babel/preset-envgói

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

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

2
xin vui lòng giải thích câu trả lời của bạn? "nút": "hiện tại" làm gì
Vishal Solanki

Tôi cũng muốn biết điều này làm gì và nếu đó là một giải pháp được đề xuất - tức là nó không gây nguy hiểm cho bất cứ điều gì và là "bằng chứng trong tương lai" (nhiều nhất có thể vào lúc này). targetsdường như tham khảo này : the environments you support/target for your project, trong khi targets.nodenày : 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, tôi đã sử dụng khối thứ hai được xác định trong câu trả lời (và được loại bỏ "stage-0"trong quy trình) và lỗi bộ tái sinh đã biến mất.
dùng1063287

1
@BunkerBoy Để thuận tiện, bạn có thể sử dụng "nút": "hiện tại" để chỉ bao gồm các polyfill và biến đổi cần thiết cho phiên bản Node.js mà bạn sử dụng để chạy Babel
Zero

Vì vậy, đối với điều này tôi không phải cài đặt polyfill?
Vishal Solanki

12

Cẩn thận với các chức năng nâng

Tôi đã có cả 'nhập polyfill' và 'hàm async' của mình trong cùng một tệp, tuy nhiên tôi đang sử dụng cú pháp hàm nâng nó lên trên polyfill sẽ cung cấp cho tôi ReferenceError: regeneratorRuntime is not defined lỗi .

Thay đổi mã này

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

đến đây

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

để ngăn chặn nó được nâng lên trên nhập khẩu polyfill.


5
a; kgjablrsdkjfjasnkljfbajklfdablkhjnfl; buồn tôi đã mất trí và bạn đã cứu tôi Tôi yêu bạn
John R Perry

11

Kể từ tháng 10 năm 2019, điều này làm việc cho tôi:

Thêm điều này vào cài đặt trước.

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

Sau đó cài đặt bộ tái sinh-thời gian chạy bằng npm.

npm i regenerator-runtime

Và sau đó trong tệp chính của bạn sử dụng: (quá trình nhập này chỉ được sử dụng một lần)

import "regenerator-runtime/runtime";

Điều này sẽ cho phép bạn sử dụng async awaitstrong tệp của mình và xóaregenerator error


Không đặt giá trị cho useBuiltInssẽ mặc định nó thành false. Điều này sẽ không tự động nhập bất kỳ polyfill nào tùy thuộc vào môi trường đích, điều này làm suy yếu mục đích của nó "@babel/preset-env". Đây cũng là một nhận xét liên quan của một trong những nhà phát triển babel.
bela53

10

Nếu sử dụng babel-preset-stage-2thì chỉ cần bắt đầu tập lệnh với--require babel-polyfill .

Trong trường hợp của tôi, lỗi này đã được ném bởi Mocha kiểm tra.

Đã khắc phục sự cố

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


9

Tôi bắt đầu nhận được lỗi này sau khi chuyển đổi dự án của tôi thành một dự án bản thảo. Từ những gì tôi hiểu, vấn đề bắt nguồn từ async / await không được công nhận.

Đối với tôi, lỗi đã được sửa bằng cách thêm hai thứ vào thiết lập của tôi:

  1. Như đã đề cập ở trên nhiều lần, tôi cần thêm babel-polyfill vào mảng mục nhập gói webpack của mình:

    ...
    
    mục nhập: ['babel-polyfill', './index.js'],
    
    ...
  2. Tôi cần cập nhật .babelrc của mình để cho phép bổ sung async / await vào trình tạo:

    {
      "cài đặt trước": ["es2015"],
      "plugin": ["Transform-async-to-Generator"]
    }

DevDependencies:

Tôi đã phải cài đặt một vài thứ vào devDependencies của mình trong tệp pack.json. Cụ thể, tôi đã thiếu babel-plugin-Transform-async-to-Generator, babel-polyfill và 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"
 }

Mã chính đầy đủ:

Tôi đã nhận được mã từ một ý chính GitHub thực sự hữu ích và súc tích mà bạn có thể tìm thấy ở đây .


3
Tốt hơn là sử dụng cài đặt sẵn envthay vì es2015. đã envbao gồm es2015rồi.
Chất dẫn truyền thần kinh

9

Tôi gặp vấn đề này trong Chrome. Tương tự như câu trả lời của RienNeVaPlus, điều này đã giải quyết nó cho tôi:

npm install --save-dev regenerator-runtime

Sau đó, trong mã của tôi:

import 'regenerator-runtime/runtime';

Hạnh phúc để tránh thêm 200 kB từ babel-polyfill.


8

Bạn đang gặp lỗi vì async / đang chờ sử dụng trình tạo, là tính năng ES2016, không phải ES2015. Một cách để khắc phục điều này là cài đặt cài đặt sẵn babel cho ES2016 ( npm install --save babel-preset-es2016) và biên dịch sang ES2016 thay vì ES2015:

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

Như các câu trả lời khác đề cập, bạn cũng có thể sử dụng polyfill (mặc dù hãy chắc chắn rằng bạn tải polyfill trước khi bất kỳ mã nào khác chạy). Ngoài ra, nếu bạn không muốn bao gồm tất cả các phụ thuộc polyfill, bạn có thể sử dụng babel- rebator -runtime hoặc babel-plugin-Transform-runtime .


8

Lỗi này xảy ra khi các async/awaitchức năng được sử dụng mà không có plugin Babel thích hợp. Kể từ tháng 3 năm 2020, sau đây là tất cả những gì bạn cần làm. ( @babel/polyfillvà rất nhiều giải pháp được chấp nhận đã bị phản đối ở Babel. Đọc thêm trong tài liệu về Babel. )

Trong dòng lệnh, gõ:

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

Trong babel.config.jstập tin của bạn , thêm plugin này @babel/plugin-transform-runtime. Lưu ý: Ví dụ dưới đây bao gồm các cài đặt trước và plugin khác mà tôi có cho một dự án React / Node / Express nhỏ mà tôi đã làm gần đây:

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

Điều luôn làm tôi ngạc nhiên là các nhà phát triển lười biếng như thế nào. Babel devs đã quyết định từ chối chức năng, họ có thể hy vọng điều này sẽ trở thành một vấn đề. Tại sao không cho mọi người biết ý định có khả năng nhất là gì và họ nên làm gì để khắc phục nó. Nhưng không, chúng ta hãy chỉ hiển thị một số thông điệp sẽ vô dụng đối với người mới.
Pavel Voronin

Điều này không hoạt động imgur.com/a/2Ea8WDk
không thể thực hiện được

Làm việc tuyệt vời cho tôi. Tôi không phản ứng dự án .babelrctrông như sau: `` `{ "cài đặt trước": [ "@ babel / preset-env"], "plugins": [ "@ babel / plugin-transform-runtime"]}` ``
Anthony

7

Tôi đã sửa lỗi này bằng cách cài đặt babel-polyfill

npm install babel-polyfill --save

sau đó tôi đã nhập nó vào điểm nhập ứng dụng của mình

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

để thử nghiệm tôi đã bao gồm - yêu cầu babel-polyfill trong tập lệnh thử nghiệm của tôi

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

6

Câu trả lời mới Tại sao bạn làm theo câu trả lời của tôi?

Trả lời: Bởi vì tôi sẽ cho bạn câu trả lời với dự án npm phiên bản cập nhật mới nhất.

14/11/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"

Nếu bạn sử dụng phiên bản UP này hoặc nhiều hơn phiên bản UP của Npm và tất cả các ... SO khác chỉ cần thay đổi:

webpack.config.js

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

Sau khi thay đổi webpack.config.jstập tin Chỉ cần thêm dòng này vào đầu mã của bạn.

import "babel-polyfill";

Bây giờ kiểm tra mọi thứ là ok. Liên kết tham khảo

Cũng cảm ơn @BrunoLM vì câu trả lời hay của anh ấy.


1
Tại sao anh ta sử dụng webpack nếu đó là dịch vụ phụ trợ? Câu trả lời của bạn ngụ ý rằng anh ta phải sử dụng webpack?
Spock

1
@Spock, tôi đã nghĩ về nó. Tôi đã phải đối mặt với cùng một vấn đề và tôi đã giải quyết vấn đề của mình theo cách đơn giản này. Tôi nghĩ đó là câu trả lời tích cực cho người dùng Webpack và thỏ rừng có nhiều Câu trả lời đúng hơn để bạn có thể theo dõi bất kỳ cách nào khác.
MD Ashik

Tại sao bạn điều bạn cần nhấn xuống Bình chọn !!!! Bạn có thể nói lý do nếu bạn muốn giúp tôi.
MD Ashik

6

Các trình duyệt được nhắm mục tiêu tôi cần hỗ trợ đã hỗ trợ async / await, nhưng khi viết bài kiểm tra mocha, không có cài đặt phù hợp tôi vẫn gặp lỗi này.

Hầu hết các bài viết tôi googled đang lỗi thời, trong đó có câu trả lời được chấp nhận và bình chọn cao câu trả lời ở đây, tức là bạn không cần polyfill, babel-regenerator-runtime, babel-plugin-transform-runtime. v.v. nếu trình duyệt mục tiêu của bạn đã hỗ trợ async / await (tất nhiên nếu không bạn cần polyfill)

Tôi cũng không muốn sử dụng webpack.

Câu trả lời của Tyler Long thực sự đang đi đúng hướng kể từ khi anh ấy đề xuất babel-preset-env(nhưng tôi đã bỏ qua nó đầu tiên khi anh ấy đề cập đến polifill lúc đầu). Tôi vẫn nhận được ReferenceError: regeneratorRuntime is not definedngay từ đầu sau đó tôi nhận ra đó là vì tôi đã không đặt mục tiêu. Sau khi thiết lập mục tiêu cho nút, tôi sửa lỗi tái tạo

  "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 - Cài đặt phương thức babel-plugin-Transform-async-to-module, 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 - Thêm vào polyfill js babel của bạn:

import 'babel-polyfill';

3 - Thêm plugin trong .babelrc của bạn:

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

Nguồn: http://babeljs.io/docs/plugins/transform-async-to-module-method/


3

Tôi đã có một thiết lập
với webpack bằng cách sử dụng presets: ['es2015', 'stage-0']
mocha đang chạy thử nghiệm được biên dịch bởi webpack.

Để làm cho async/awaitcác bài kiểm tra của tôi hoạt động, tất cả những gì tôi phải làm là thêm mocha --require babel-polyfilltùy chọn.


3

Tôi gặp lỗi này khi sử dụng gulp với rollup khi tôi cố gắng sử dụng trình tạo 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 }));
});

Tôi có thể giải pháp là bao gồm babel-polyfillthành phần bower:

bower install babel-polyfill --save

và thêm nó dưới dạng phụ thuộc trong index.html:

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

Cảm ơn bạn. Điều này làm việc cho tôi. Tôi không biết rằng tôi cần thêm thẻ script để nó hoạt động ở phía máy khách.
Raza

3

Đối với những người muốn sử dụng babel-polyfillphiên bản 7 ^, hãy làm điều này với webpackver3 ^.

Npm cài đặt mô-đun npm i -D @babel/polyfill

Sau đó, trong webpacktập tin của bạn theo entryquan điểm của bạn làm điều này

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

3

Công việc nấu ăn babel 7 của tôi để phản ứng với thời gian chạy bộ tái sinh:

.babelrc

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "node": true,
        },
      },
    ],
    "@babel/preset-react",
  ],
  "plugins": [
    "@babel/plugin-syntax-class-properties",
    "@babel/plugin-proposal-class-properties"
  ]
}

pack.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

Nếu bạn đang xây dựng một ứng dụng, bạn chỉ cần @babel/preset-env@babel/polyfill:

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

(Lưu ý: bạn không cần phải cài đặt core-jsregenerator-runtime các gói vì cả hai sẽ được cài đặt bởi @ babel / polyfill)

Sau đó trong .babelrc:

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

Bây giờ thiết lập môi trường mục tiêu của bạn. Ở đây, chúng tôi làm điều đó trong .browserslistrctập tin:

# Browsers that we support

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

Cuối cùng, nếu bạn đã đi cùng useBuiltIns: "entry", đặt import @babel/polyfillở đầu tệp nhập cảnh của bạn. Nếu không, bạn đã làm xong.

Sử dụng phương pháp này sẽ nhập có chọn lọc các polyfill đó và tệp 'bộ tạo thời gian chạy' (khắc phục sự cố của bạn regeneratorRuntime is not definedở đây) CHỈ nếu chúng cần cho bất kỳ môi trường / trình duyệt đích nào của bạn.


2

để tham khảo trong tương lai :

Kể từ phiên bản Babel phiên bản 7.0.0-beta.55 đã bị xóa

tham khảo blog https://babeljs.io/blog/2018/07/27/removing-babels-stage-presets

async await vẫn có thể được sử dụng bởi

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

cài đặt

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

sử dụng trong .babelrc

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

và sử dụng polyfill babel https://babeljs.io/docs/en/babel-polyfill

cài đặt

npm install --save @babel/polyfill

webpack.config.js

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

2

Năm 2019 với Babel 7.4.0+, babel-polyfillgói đã không được hỗ trợ trực tiếp bao gồm core-js/stable( core-js@3+, đối với các tính năng ECMAScript của polyfill) và regenerator-runtime/runtime(cần thiết để sử dụng các chức năng của trình tạo được sao chép):

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

Thông tin từ babel-polyfill tài liệu .


2

Cách dễ nhất để khắc phục 'vấn đề tái tạo không được xác định' này trong bảng điều khiển của bạn:

Bạn không phải cài đặt bất kỳ plugin không cần thiết. Chỉ cần thêm:

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

bên trong cơ thể trong index.html của bạn. Bây giờ, hàm tái tạo nên được xác định khi bạn chạy babel và bây giờ các hàm async / await của bạn sẽ được biên dịch thành công vào ES2015


1

Nếu bạn sử dụng Gulp + Babel cho một frontend, bạn cần sử dụng babel-polyfill

npm install babel-polyfill

và sau đó thêm thẻ script vào index.html trên tất cả các thẻ script khác và tham chiếu babel-polyfill từ node_modules


Tôi không thấy lý do tại sao downvote và bình luận. Tôi muốn nó cho trình duyệt firefox. Ngoài ra tôi lấy thông tin trực tiếp từ trang web babel. Nhận xét không giúp tôi giải quyết vấn đề khi tôi thử nó.
Petros Kyria Khẩu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.