当项目中使用async和await时,使用babel-preset-env进行编译,翻译js时会出错。
错误信息为:Uncaught ReferenceError: regeneratorRuntime is not defined
翻译为的js代码大概如下所示,其中regeneratorRuntime为自动生成的变量,关键是该变量未进行定义,导致运行出错;内部转换机制暂未知。
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(args, util) {
....
}
解决办法一:将babel-preset-env替换为babel-preset-es2015。
webpack.config.js配置:
rules: [{
test: /\.jsx?$/,
loader: 'babel-loader',
include: [path.resolve(__dirname, 'src'), /node_modules[\\/]scratch-[^\\/]+[\\/]src/],
options: {
// Explicitly disable babelrc so we don't catch various config
// in much lower dependencies.
babelrc: false,
plugins: [
'syntax-dynamic-import',
'transform-async-to-generator',
'transform-object-rest-spread',
['react-intl', {
messagesDir: './translations/messages/'
}]],
presets: ['es2015']
}
}
解决办法二:对于某些已经支持async/await语法的node版本,比如8.11.1,babel可以不对其进行转换翻译。webpack配置如下:
rules: [{
test: /\.js$/,
loader: 'babel-loader',
include: path.resolve(__dirname, 'src'),
query: {
presets: [['env', {targets: {node: '8.11.1'}}]]
}
}
解决办法三:使用transform-runtime插件(推荐)
cnpm install babel-plugin-transform-runtime --save-dev
webpack配置:
rules: [{
test: /\.jsx?$/,
loader: 'babel-loader',
include: [path.resolve(__dirname, 'src'), /node_modules[\\/]scratch-[^\\/]+[\\/]src/],
options: {
// Explicitly disable babelrc so we don't catch various config
// in much lower dependencies.
babelrc: false,
plugins: [
'syntax-dynamic-import',
'transform-async-to-generator',
'transform-object-rest-spread',
['transform-runtime', {
helpers: false,
polyfill: false,
regenerator: true,
moduleName: 'babel-runtime'
}
],
['react-intl', {
messagesDir: './translations/messages/'
}]],
presets: [['env', {targets: {browsers: ['last 3 versions', 'Safari >= 8', 'iOS >= 8']}}], 'react']
}
}