Babel 6 regeneratorRuntime is not defined

前端 未结 30 1850
暖寄归人
暖寄归人 2020-11-22 03:49

I\'m trying to use async, await from scratch on Babel 6, but I\'m getting regeneratorRuntime is not defined.

.babelrc file

{
    \"presets\": [ \"es2         


        
相关标签:
30条回答
  • 2020-11-22 04:21

    1 - Install 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 - Add in your js babel polyfill:

    import 'babel-polyfill';

    3 - Add plugin in your .babelrc:

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

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

    0 讨论(0)
  • 2020-11-22 04:22

    I started getting this error after converting my project into a typescript project. From what I understand, the problem stems from async/await not being recognized.

    For me the error was fixed by adding two things to my setup:

    1. As mentioned above many times, I needed to add babel-polyfill into my webpack entry array:

      ...
      
      entry: ['babel-polyfill', './index.js'],
      
      ...
    2. I needed to update my .babelrc to allow the complilation of async/await into generators:

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

    DevDependencies:

    I had to install a few things into my devDependencies in my package.json file as well. Namely, I was missing the babel-plugin-transform-async-to-generator, babel-polyfill and the 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"
     }
    

    Full Code Gist:

    I got the code from a really helpful and concise GitHub gist you can find here.

    0 讨论(0)
  • 2020-11-22 04:23

    babel-polyfill (deprecated as of Babel 7.4) is required. You must also install it in order to get async/await working.

    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 with async/await (sample code)

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

    In the startup file

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

    If you are using webpack you need to put it as the first value of your entry array in your webpack configuration file (usually webpack.config.js), as per @Cemen comment:

    module.exports = {
      entry: ['babel-polyfill', './test.js'],
    
      output: {
        filename: 'bundle.js'       
      },
    
      module: {
        loaders: [
          { test: /\.jsx?$/, loader: 'babel', }
        ]
      }
    };
    

    If you want to run tests with babel then use:

    mocha --compilers js:babel-core/register --require babel-polyfill
    
    0 讨论(0)
  • 2020-11-22 04:24

    Be careful of hoisted functions

    I had both my 'polyfill import' and my 'async function' in the same file, however I was using the function syntax that hoists it above the polyfill which would give me the ReferenceError: regeneratorRuntime is not defined error.

    Change this code

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

    to this

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

    to prevent it being hoisted above the polyfill import.

    0 讨论(0)
  • 2020-11-22 04:25

    If using babel-preset-stage-2 then just have to start the script with --require babel-polyfill.

    In my case this error was thrown by Mocha tests.

    Following fixed the issue

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

    0 讨论(0)
  • 2020-11-22 04:28

    Besides polyfill, I use babel-plugin-transform-runtime. The plugin is described as:

    Externalize references to helpers and builtins, automatically polyfilling your code without polluting globals. What does this actually mean though? Basically, you can use built-ins such as Promise, Set, Symbol etc as well use all the Babel features that require a polyfill seamlessly, without global pollution, making it extremely suitable for libraries.

    It also includes support for async/await along with other built-ins of ES 6.

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

    In .babelrc, add the runtime plugin

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

    Note If you're using babel 7, the package has been renamed to @babel/plugin-transform-runtime.

    0 讨论(0)
提交回复
热议问题