Регенератор Babel 6Runtime не визначено


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;

Його нормальне використання без асинхронізації / очікування працює чудово. Будь-які ідеї, що я роблю неправильно?


Ви включили регенератор?
ssube

3
babel-polyfill - це те, що вам потрібно.
Ронні Ройстон

вавіль-поліфіл знецінено на 7,4; у цьому оновленому пості описано міграцію.
JWCS

Для тих, хто використовує новіші версії babel and node: stackoverflow.com/a/62254909/8169904
пн.

Відповіді:


682

babel-polyfill( застаріло на Вавілон 7.4). Ви також повинні встановити його, щоб асинхронність / очікування працювала.

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 з асинхронією / wait (зразок коду)

"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.jsвеб-пакету (як правило ), відповідно до коментаря @Cemen:

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

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

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

Якщо ви хочете запустити тести з бабером, тоді використовуйте:

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

77
Важливим при використанні стовпотворіння з WebPack: замість використання require("babel-polyfill")яких не працюють, ви додаєте "babel-polyfill"в вашому entryв конфігурації, як це: entry: ["babel-polyfill", "src/main.js"]. Це працювало для мене, включаючи використання в webpack-dev-сервері з HMR.
Цемен

6
Я намагався змусити мої тести працювати з babel6 та async, і мені довелося додати - вимагати babel-polyfill до конфігурації бігуна npm test
arisalexis

13
Для чого потрібен реферат?
trusktr

6
@Lloyd, devDependencyякщо ви використовуєте webpack, оскільки він потім "компілює" файли перед запуском. dependencyякщо ви не використовуєте веб-пакет, і вам потрібна подружка.
BrunoLM

4
Це робить розмір вихідного файлу величезним ... Краще використовувати лише те, що потрібно, а не вимагати безпосередньо babel-polyfill.
Inanc Gumus

340

Окрім polyfill, я використовую babel-plugin-transform-runtime . Плагін описаний як:

Екстерналізація посилань на помічників та вбудованих програм, автоматично поліфілюючи ваш код, не забруднюючи глобальні дані. Що це насправді означає? В основному, ви можете використовувати вбудовані модулі, такі як Promise, Set, Symbol тощо, а також використовувати всі функції Babel, які потребують поліфілінгу плавно, без глобального забруднення, що робить його надзвичайно придатним для бібліотек.

Вона також включає підтримку асинхронізації / очікування разом з іншими вбудованими системами ES 6.

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

У .babelrcдодайте плагін виконання

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

Примітка Якщо ви використовуєте babel 7, пакет було перейменовано на @ babel / plugin-transform-runtime .


11
Мені не потрібно було, babel-runtimeщоб асинхрон чекав роботи. Це правильно? Редагувати: я запускаю сторону сервера коду. :)
GijsjanB

8
Якщо ви змогли використовувати його без часу виконання, це тому, що це вже є у вашому дереві залежностей. Тож майте на увазі, що якщо ви пишете бібліотеку, і час виконання вапняку йде як залежність від розробника, він може не бути там для ваших користувачів. Вам доведеться включити його як звичайну залежність для розподілу.
neverfox

23
babel-plugin-transform-runtimeпотрібно лише . Працює як шарм.
saike

9
Це рішення не в порядку, оскільки для розширення requireвикликів, доданих transform-runtimeплагіном, потрібна додаткова робота Browserify або Webpack .
Finesse

9
Зауважте, що для Babel 7 вам потрібно бігтиnpm install --save-dev @babel/plugin-transform-runtime
Андрій Семакін

196

Користувачі Babel 7

У мене виникли проблеми з тим, як обійти це питання, оскільки більшість інформації стосується попередніх версій для дівоцтва. Для Babel 7 встановіть ці дві залежності:

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

І, в .babelrc, додайте:

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

Як ми можемо це зробити без .babelrc (просто за допомогою конфігураційного файлу webpack)
Pouya Jabbarisani

2
Документ показує використання як "plugins": ["@babel/plugin-transform-runtime"], а не "plugins": [ ["@babel/transform-runtime"] ]тут. Різне ім'я плагіна. Обидва твори. Але який із них належний? ..
kyw

5
Я отримую вимогу, не визначається при дотриманні цього методу
Бетмен

1
@kyw найкраще завжди дотримуватися документів - немає різниці, крім конвенції.
Метт Ширлі

4
Додавання @babel/transform-runtimeдо плагінів викликало помилку "експорт не визначений" для мене. Я змінив це на це, щоб отримати асинхронну роботу в Babel7:["@babel/plugin-transform-runtime", { "regenerator": true } ]
Харі,

105

Оновлення

Він працює, якщо встановити ціль на Chrome. Але це може не працювати для інших цілей, зверніться до: https://github.com/babel/babel-preset-env/isissue/112

Тож ця відповідь НЕ цілком слушна для початкового запитання. Я збережу це тут як посилання на babel-preset-env.

Просте рішення - додати import 'babel-polyfill'на початку коду.

Якщо ви використовуєте веб-пакет, швидким рішенням є додавання, babel-polyfillяк показано нижче:

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

Я вважаю, що я знайшов останню найкращу практику.

Перевірте цей проект: https://github.com/babel/babel-preset-env

yarn add --dev babel-preset-env

Використовуйте наступне як конфігурацію вавило:

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

Тоді ваш додаток має бути готовим перейти в останні 2 версії браузера Chrome.

Ви також можете встановити Node як цільову або відрегулювати список браузерів відповідно до https://github.com/ai/browserslist

Скажи мені що, не кажи мені, як.

Мені дуже подобається babel-preset-envфілософія: скажіть, яке середовище ви хочете підтримати, НЕ кажіть мені, як їх підтримувати. Це краса декларативного програмування.

Я перевірив, async awaitі вони НЕ працюють. Я не знаю, як вони працюють, і я насправді не хочу знати. Я хочу витратити свій час на власний код та свою бізнес-логіку. Завдяки цьому babel-preset-envвін звільняє мене від пекла Вавілонської конфігурації.


3
Це справді працює. Єдиним недоліком є ​​купа залежностей, babel-preset-envале я думаю, що вона того варта. Любіть також декларативний стиль. Також yarn installзаразyarn add
Роман Ушеренко

1
@gargantuan Так.
Тайлер Лонг

3
Насправді не рішення, якщо ви хочете націлити на старіші веб-переглядачі або версії вершин.
Рохан Ортон

2
Про всяк випадок, коли це не очевидно .... це рекомендоване рішення НЕ буде працювати, якщо вам потрібен ваш код для роботи в IE11
Моріс

7
Чому за це стільки голосів? Це працює лише тому, що він більше не перетворює асинхронізацію / очікування і, отже, більше не потребує regeneratorRuntime і тому, що він не трансформований, він не працюватиме в браузерах, які не підтримують його.
Шикьо

47

Крім того, якщо вам не потрібні всі передбачені модулі babel-polyfill, ви можете просто вказати babel-regenerator-runtimeу своєму конфігурації веб-пакету:

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

  // ...
};

Використовуючи webpack-dev-сервер з HMR, це зменшило кількість файлів, які він повинен зібрати на кожній збірці, досить багато. Цей модуль встановлений як частина, babel-polyfillтому якщо у вас вже є те, що ви добре, інакше ви можете встановити його окремо npm i -D babel-regenerator-runtime.


Це здається найзручнішим рішенням. Однак більшість браузерів підтримують генератори, тому це рішення, мабуть, не є оптимальним. Дивіться: blogs.candoerz.com/question/213492/…
Kitanotori

Що робити, якщо ви не використовуєте веб-пакет?
Бетмен

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 Я редагував публікацію, тому це повний приклад.
webnoob

2
Це loose: trueпотрібно?
Том Седерлунд

При використанні цього додавання вимагає до мого файлу, а в браузері не визначено.
Бетмен

вільно: вірно НЕ потрібно. Те, що вам дійсно потрібно у вашому .babelrc, це: {"presets": ["es2015", "реагувати", "етап-2"], "плагіни": ["трансформація-час виконання", "трансформація-асинхрон-генератор" "]}
Ефе Аріару

29

Вавілон 7.4.0 або новішої версії (core-js 2/3)

За Вавилонської 7.4.0 , @babel/polyfill є застарілим .

Загалом, існує два способи встановлення поліфілів / регенераторів: через глобальний простір імен (варіант 1) або як поніфіл (варіант 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

Якщо ви використовуєте core-js polyfills, ви встановлюєте @babel/runtime-corejs2або @babel/runtime-corejs3замість цього дивіться тут .

Ура


2
Це правильна, найсучасніша відповідь і допомогла мені зіткнутися з проблемою в моєму поточному проекті. Дякую!
cdpautsch

2
{"presets": [["@ babel / preset-env", {"target": {"esmodules": true}}]]} Це допомогло мені створити node.js
Смолін Павло

3
Я маю на увазі, що я це знав, але щоб допомогти іншим, це має бути правильною відповіддю. З повагою!
Niewiadomski Paweł

Примітка: Я думаю, має сенс використовувати нитку Babel 7 , тому помилки, пов'язані з версіями, можна краще розрізнити. Більш конкретну версію цієї відповіді ви можете знайти тут (але вищевикладені твердження все ще справедливі)
ford04

16

babel-regenerator-runtimeтепер застаріло , замість цього потрібно використовувати regenerator-runtime.

Щоб використовувати генератор виконання з webpackі babelv7:

встановити regenerator-runtime:

npm i -D regenerator-runtime

А потім додайте в конфігурацію веб-пакета:

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

Це повинно бути прийнятою відповіддю, babel-polyfill додає занадто багато інших речей
Shikyo

Робота для мене ідеальна ... Дякую
Леандро Вільям

1
Цей метод завжди включає час виконання. Я вважаю , що ураження цілі @babel/preset-env«з 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
поясніть, будь ласка, свою відповідь? що робить "вузол": "струм"
Вішал Соланкі

Я також хотів би знати, що це робить, і якщо це рекомендоване рішення - тобто це нічого не загрожує і є "майбутнім доказом" (стільки, що може бути на даний момент). 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"у процесі), і помилка регенератора пішла.
користувач1063287

1
@BunkerBoy Для зручності ви можете використовувати "node": "current", щоб включити лише необхідні поліфіли та перетворення для версії Node.js, яку ви використовуєте для запуску Babel
Zero

тож для цього мені не доведеться встановлювати поліфіли?
Вішал Соланкі

12

Будьте уважні до піднімаються функцій

У моєму файлі було і «імпорт поліфаули», і моя «функція асинхронізації», проте я використовував синтаксис функції, який піднімає його над полізасипкою, що дасть мені ReferenceError: regeneratorRuntime is not definedпомилку.

Змініть цей код

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

до цього

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

щоб запобігти його підняття над імпортом полісистеми.


5
a; kgjablrsdkjfjasnkljfbajklfdablkhjnfl; сумно, що я втратив розум, і ти врятував мене, я тебе люблю
Джон Р Перрі

11

Станом на жовтень 2019 року це працювало для мене:

Додайте це до попереднього налаштування.

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

Потім встановіть регенератор під час виконання, використовуючи npm.

npm i regenerator-runtime

А потім у головному використанні файлу: (цей імпорт використовується лише один раз)

import "regenerator-runtime/runtime";

Це дозволить вам використовувати async awaitsу своєму файлі та видалитиregenerator error


Якщо не встановити значення для useBuiltInsза замовчуванням, це буде false. Це не автоматично імпортує поліфілів залежно від цільового середовища, що нібито підриває мету "@babel/preset-env". Ось також пов’язаний коментар одного з розробників бабеля.
bela53

10

Якщо ви користуєтеся, babel-preset-stage-2тоді просто доведеться починати сценарій --require babel-polyfill.

У моєму випадку ця помилка була кинута Mochaтестами.

Після виправленого питання

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


9

Я почав отримувати цю помилку після перетворення свого проекту в проект машинопису. З того, що я розумію, проблема випливає з асинхронізації / очікування не визнання.

Для мене помилку було виправлено, додавши до моєї настройки дві речі:

  1. Як уже згадувалося вище, мені потрібно було додати babel-polyfill у свій масив введення веб-упаковки:

    ...
    
    запис: ['babel-polyfill', './index.js'],
    
    ...
  2. Мені потрібно було оновити.

    {
      "пресети": ["es2015"],
      "плагіни": ["перетворення-асинхрон-генератор"]
    }

DevDependitions:

Мені довелося також встановити кілька речей у свою програму devDependitions у мій файл 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замість es2015. envвключає es2015вже.
Нейромедіатор

9

У мене була ця проблема в Chrome. Подібно до відповіді RienNeVaPlu͢s, це вирішило це для мене:

npm install --save-dev regenerator-runtime

Потім у моєму коді:

import 'regenerator-runtime/runtime';

Рада уникнути зайвих 200 кБ від babel-polyfill.


8

Ви отримуєте помилку, оскільки асинхронні / очікують використання генераторів, які є функцією ES2016, а не ES2015. Один із способів виправити це - встановити попередньо встановлений пристрій для ES2016 ( npm install --save babel-preset-es2016) та компілювати на ES2016 замість ES2015:

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

Як згадуються в інших відповідях, ви також можете використовувати polyfills (хоча переконайтеся, що ви завантажуєте його спочатку, перш ніж запускається будь-який інший код). Крім того, якщо ви не хочете включати всі залежності від поліфазу, ви можете використовувати babel-регенератор-час виконання або babel-плагін-перетворення-час виконання .


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"

7

Ця помилка викликана, коли async/awaitфункції використовуються без належних плагінів Babel. Станом на березень 2020 року все, що вам потрібно зробити, має бути наступним. ( @babel/polyfillі багато прийнятих рішень були присуджені в Вавілоні. Докладніше читайте в документах Вавилона. )

У командному рядку введіть:

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'],
};

Що мене завжди дивує - це те, як розробники лінуються. Вавилонські розробники вирішили принизити функціональність, вони можуть очікувати, що це стане проблемою. Чому б не повідомити людям, що було найімовірнішим наміром, і що вони повинні зробити, щоб це виправити. Але ні, давайте покажемо якесь повідомлення, яке абсолютно непридатне для новачків.
Павло Воронін

Це не працює imgur.com/a/2Ea8WDk
неможливо

Для мене чудово працювали. Мій нереагуючий проект .babelrcвиглядає приблизно так: `` `{" presets ": [" @ babel / preset-env "]," plugins ": [" @ babel / plugin-transform-runtime "]}` ``
Ентоні

6

Нова відповідь Чому ви слідуєте моїй відповіді?

Відповідь: Оскільки я збираюся дати вам відповідь з останньою версією оновленої версії npm-проекту.

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"

Якщо ви використовуєте цю версію або більше UP версії Npm та всі інші ... Так просто потрібно змінити:

webpack.config.js

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

Після зміни webpack.config.jsфайлів Просто додайте цей рядок до верхнього коду.

import "babel-polyfill";

Тепер перевірте, що все в порядку. Довідкова посилання

Також дякую @BrunoLM за його приємну відповідь.


1
Навіщо він використовувати webpack, якщо це сервіс бекенда? Ваша відповідь означає, що він повинен використовувати веб-пакет?
Спок

1
@Spock, я про це думав. Я зіткнувся з тією ж проблемою, і я вирішив свою проблему простим способом. Я думаю, що це позитивна відповідь для користувача Webpack і зайці мають більше правильних відповідей, щоб ви могли слідувати будь-хто.
доктор медичних наук Ашик

Чому вам річ ​​потрібно натискати Голосувати !!!! Чи можете ви сказати причину, якщо ви хочете допомогти мені.
доктор медичних наук Ашик

6

Мене потрібні цільові браузери, які вже підтримують асинхронізацію / очікування, але при написанні мок-тестів, без належної настройки, я все-таки отримав цю помилку.

Більшість статей я гугл застаріли, в той числі прийнятого відповідь і високий голосували відповіді тут, тобто вам не потрібен polyfill, babel-regenerator-runtime, babel-plugin-transform-runtime. і т. д., якщо ваш цільовий браузер вже підтримує асинхронізацію / очікування (звичайно, якщо вам не потрібна полізаповнення)

Я також не хочу використовувати webpack.

Відповідь Тайлера Лонга насправді на вірному шляху, оскільки він запропонував babel-preset-env(але я її опустив першим, коли він згадав про поліфіл на початку). Я все ще отримав 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-метод, 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 - Додайте плагін у свій .babelrc:

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

Джерело: http://babeljs.io/docs/plugins/transform-async-to-module-method/


3

У мене було налаштування
з використанням веб- пакетуpresets: ['es2015', 'stage-0']
та mocha, які виконували тести, складені webpack.

Щоб я async/awaitпрацював на тестах, все, що мені потрібно було зробити - це додати mocha --require babel-polyfillваріант.


3

Я отримую цю помилку при використанні gulp з накопиченням, коли я намагався використовувати генератори 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>

Дякую. Це працювало для мене. Я не знав, що мені потрібно додати тег сценарію, щоб він працював на стороні клієнта.
Раза

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 для реагування на час регенерації:

.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у верхній частині вхідного файлу. Інакше ви закінчили.

Використовуючи цей метод, виборче імпортуйте ці поліфіли та файл "регенератор-час виконання" (виправляючи свою regeneratorRuntime is not definedпроблему тут) ТІЛЬКИ, якщо вони потрібні будь-якому з ваших цільових середовищ / браузерів.


2

для подальшої довідки :

Станом на версію Babel версії 7.0.0-beta.55 попередньо встановлено етапи

зверніться до блогу https://babeljs.io/blog/2018/07/27/removing-babels-stage-presets

Асинхронізацію очікування ще можна використовувати

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

установка

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

використання в .babelrc

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

а також за допомогою бабелівської полісистеми 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+для поліфіксації функцій ECMAScript) та regenerator-runtime/runtime(необхідного для використання функцій генератора транслірованого):

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

Інформація з babel-polyfill документації .


2

Найпростіший спосіб виправити цю проблему "regeneratorRuntime not определен" у вашій консолі:

Вам не потрібно встановлювати зайві плагіни. Просто додайте:

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

всередині тіла у вашому index.html. Тепер regeneratorRuntime слід визначити, як тільки ви запустите babel, і тепер ваші функції асинхрон / очікування повинні бути успішно зібрані в ES2015


1

Якщо ви використовуєте Gulp + Babel для переднього фронту, вам потрібно використовувати babel-polyfill

npm install babel-polyfill

а потім додайте тег скрипта до index.html вище за всі інші теги сценарію та посилання babel-polyfill від node_modules


Я не бачу, чому протиріччя і коментар. Я хотів це для браузера firefox. Також я взяв інформацію безпосередньо з веб-сайту babel. Коментар не допоміг мені вирішити проблему, коли я спробував це.
Петрос Кіріако
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.