我试图在Babel 6上从头开始使用async、await,但我发现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;
在没有async/await的情况下,正常使用它就能正常工作。有什么想法吗,我做错了什么?
babel-polyfill
是必需的。你也必须安装它,以便让async/await工作。
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与async/await(示例代码)。
"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,你需要把它作为你的webpack配置文件(通常是webpack.config.js
)中entry
数组的第一个值,正如@Cemen的评论。
module.exports = {
entry: ['babel-polyfill', './test.js'],
output: {
filename: 'bundle.js'
},
module: {
loaders: [
{ test: /\.jsx?$/, loader: 'babel', }
]
}
};
如果你想用babel来运行测试,那么就用。
mocha --compilers js:babel-core/register --require babel-polyfill
除了polyfill,我还使用了[babel-plugin-transform-runtime](https://babeljs.io/docs/en/6.26.3/babel-plugin-transform-runtime)。该插件被描述为。
外部化对辅助程序和内置程序的引用,自动对你的代码进行polyfill而不污染globals。但这实际上是什么意思呢?基本上,你可以使用诸如Promise、Set、Symbol等内置插件,也可以无缝地使用所有需要polyfill的Babel功能,没有全局污染,这使得它非常适用于图书馆。
它还包括对async/await以及ES 6的其他内置插件的支持。
$ npm install --save-dev babel-plugin-transform-runtime
在.babelrc
中,添加运行时插件
{
"plugins": [
["transform-runtime", {
"regenerator": true
}]
]
}
注意 如果你使用的是babel 7,这个包已经改名为@babel/plugin-transform-runtime了。
另外,如果你不需要babel-polyfill
提供的所有模块,你可以直接在你的webpack配置中指定babel-regenerator-runtime
。
module.exports = {
entry: ['babel-regenerator-runtime', './test.js'],
// ...
};
当使用webpack-dev-server与HMR时,这样做可以减少它在每次构建时需要编译的文件数量。这个模块是作为babel-polyfill
的一部分来安装的,所以如果你已经有了这个模块,就可以了,否则你可以用npm i -D babel-regenerator-runtime
来单独安装它。