我正在尝试使用webpack的babel-loader在JavaScript中运行异步等待函数。我正在使用以下配置:
{
name: 'client',
context: path.join(__dirname, 'src', 'static', 'scripts'),
entry: {
index: './index.js'
},
output: {
path: path.join(__dirname, 'src', 'static', 'bundles'),
filename: '[name].js'
},
module: {
loaders: [
{
test: /\.js$/,
loader: 'babel',
query: {
presets: ['es2015', 'stage-0']
}
}
]
},
resolve: {
root: path.join(__dirname),
fallback: path.join(__dirname, 'node_modules'),
modulesDirectories: ['node_modules'],
}
}
但它不断推送错误,并显示以下消息:
模块构建失败:错误:./ src / static / scripts / index.js:带有选项{}的预期类型“Identifier”
我的index.js有以下内容:
console.log('hi from app');
async function hello() {
return Promise.resolve('hi')
}
async function conversation () {
const hi = await hello()
console.log(hi);
}
答案 0 :(得分:2)
首先,确保您使用的是所有最新版本的babel插件:
npm i -D babel-loader babel-polyfill babel-preset-es2015 babel-preset-stage-0 babel-runtime
(我不确定babel-runtime
是否真的需要 - YMMV)
在您的网络包的entry
中,请使用:
entry: [
'babel-polyfill',
'./index.js'
]
您需要babel-polyfill
添加到您的输入脚本以启用“regeneratorRuntime”,这是async / await所必需的。
然后使用babel-loader
部分中的module
(而不是babel
)
module: {
loaders: [
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
loader: 'babel-loader',
query: {
presets: [
'es2015',
'stage-0'
]
}
}
]
那应该解决它。
注意:如果您在服务器端使用Node,则需要在条目顶部添加一个显式require('babel-polyfill');
,以确保识别出任何异步/等待语法。
es2015和stage-0不足以填充节点5 - 而是在.babelrc
{
"presets": [
"node5"
]
}
node5是一个babel插件的集合,我维护它只是填充缺少的Node 5.x的那些部分。它应该主要与Node 4.x一起使用(虽然有很小的变化,但现在在ES6兼容性方面几乎相同。)
您需要首先使用NPM安装它:
npm i -D babel-preset-node5
答案 1 :(得分:1)
看起来你点了bug。它似乎已经解决但尚未发布。
如果你不能等到它被释放,你可以应用与解决问题的commit相对应的补丁。
应用补丁的一种方法:
将以下差异保存到包根文件夹中的文件(例如visit.patch
)中。然后将修补程序应用git apply visit.patch
。
From 940b86dadbd0151c33c02e89f0b5ff61077c9214 Mon Sep 17 00:00:00 2001
From: Henry Zhu <hi@henryzoo.com>
Date: Thu, 5 Nov 2015 20:10:15 -0500
Subject: [PATCH] transform-regenerator: set node.id to an identifier if null -
fixes #2835
---
packages/babel-plugin-transform-regenerator/lib/visit.js | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/node_modules/babel-preset-es2015/node_modules/babel-plugin-transform-regenerator/lib/visit.js b/node_modules/babel-preset-es2015/node_modules/babel-plugin-transform-regenerator/lib/visit.js
index 0f68ffc..c4a0d2e 100644
--- a/node_modules/babel-preset-es2015/node_modules/babel-plugin-transform-regenerator/lib/visit.js
+++ b/node_modules/babel-preset-es2015/node_modules/babel-plugin-transform-regenerator/lib/visit.js
@@ -146,6 +146,10 @@ function getOuterFnExpr(funPath) {
var node = funPath.node;
t.assertFunction(node);
+ if (!node.id) {
+ node.id = funPath.scope.parent.generateUidIdentifier("callee");
+ }
+
if (node.generator && // Non-generator functions don't need to be marked.
t.isFunctionDeclaration(node)) {
var pp = funPath.findParent(function (path) {
@@ -171,9 +175,7 @@ function getOuterFnExpr(funPath) {
);
}
- return node.id || (
- node.id = funPath.scope.parent.generateUidIdentifier("callee")
- );
+ return node.id;
}
function getRuntimeMarkDecl(blockPath) {
更新
似乎bug wasn't properly fixed和提交已经reverted。看起来这是由于此pull request中已解决的另一个问题。
答案 2 :(得分:0)
对于节点v8.11上的预设env
,我遇到了一个异步功能问题,那就是永远不会运行,也不例外。
然后我参考官方文档,并将target
添加到.babelrc
,现在可以使用了。
{
"presets": [
["env", {
"targets": {
"node": "current"
}
}]
]
}