使用async时出现"regeneratorRuntime is not defined"错误

3,965 阅读1分钟

错误发生时各依赖包的版本

1\. @babel-core 7.9.0
2\. webpack 4.42
3\. @babel/preset-env 7.9.0

错误发生时webpack配置

 {      
    test: /\.jsx?$/,      
    exclude: /node_modules/,      
    include: path.resolve(__dirname, './src'),      
    use: {        
        loader: 'babel-loader',             
        options: {          
            presets: ['@babel/preset-env', '@babel/preset-react']        
        }      
    }    
}

错误发生场景(原因)

async function() {
    await ....
}

解决方案一

options: {         
    presets: [
        ['@babel/preset-env', {
            targets: { // 制定浏览器环境或者配置是否支持esmodule
                esmodules: true // 优先级>浏览器配置
            }
        }], '@babel/preset-react']        
} 

解决方案二

  • 第一步

    npm install core-js@3

  • 第二步

    { options: {
    presets: [ ['@babel/preset-env', {
    useBuiltIns: 'usage', //不能是“entry”
    corejs: 3
    }], '@babel/preset-react' ]
    }
    }

方案二解析

  • 在babel7.4.0之前,使用@babel/polyfill解决regenerator-runtime/runtime 和 core-js/stable的polyfill问题。
  • 在babel7.4.0之后,将polyfill的内容直接包含进@babel/core@3之中。默认不开启。
  • 使用@babel/preset-env进行解析时,默认不引入任何的polyfill , 需要手动开启。通过useBuiltIns: 'usage'开启加载polyfill。加载来源是core-js@3,设置corejs: 3