Javascript babel加载程序不工作的ES7异步等待函数

Javascript babel加载程序不工作的ES7异步等待函数,javascript,async-await,webpack,babeljs,Javascript,Async Await,Webpack,Babeljs,我正在尝试使用webpack的babel加载程序在JavaScript中运行异步等待函数。我正在使用以下配置: { name: 'client', context: path.join(__dirname, 'src', 'static', 'scripts'), entry: { index: './index.js' }, output: { path: path.join(__dirname, 'src', 'static', 'bundles'),

我正在尝试使用webpack的babel加载程序在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”

My index.js包含以下内容:

console.log('hi from app');

async function hello() {
  return Promise.resolve('hi')
}

async function conversation () {
  const hi = await hello()
  console.log(hi);
}
看起来你撞到了一辆卡车。它似乎已经解决,但尚未发布

如果您不能等到发布它,您可以应用与解决问题的对应的修补程序

应用修补程序的一种方法:

将以下差异保存到包根文件夹中的文件中(例如,
visit.patch
)。然后使用git apply visit.patch应用补丁


自940B86DADB0151C33C02E89F0B5FF61077C9214周一2001年9月17日00:00:00
发件人:朱亨利
日期:2015年11月5日星期四20:10:15-0500
主题:[修补程序]转换再生器:如果为空,则将node.id设置为标识符-
修复#2835
---
packages/babel插件转换再生器/lib/visit.js | 8+++++---
1个文件已更改,5个插入(+),3个删除(-)
差异——git a/node_模块/babel-preset-es2015/node_模块/babel插件转换再生器/lib/visit.js b/node_模块/babel-preset-es2015/node_模块/babel插件转换再生器/lib/visit.js
索引0f68ffc..c4a0d2e 100644
---a/node_模块/babel-preset-es2015/node_模块/babel插件转换再生器/lib/visit.js
+++b/node_模块/babel-preset-es2015/node_模块/babel插件转换再生器/lib/visit.js
@@-146,6+146,10@@函数GetOuterNexpr(funPath){
var node=funPath.node;
t、 资产功能(节点);
+如果(!node.id){
+node.id=funPath.scope.parent.generateUidIdentifier(“被调用方”);
+  }
+
if(node.generator&&//无需标记非生成器函数。
t、 isFunctionDeclaration(节点)){
var pp=funPath.findParent(函数(路径){
@@-171,9+175,7@@函数GetOuterNexpr(funPath){
);
}
-返回node.id||(
-node.id=funPath.scope.parent.generateUidIdentifier(“被调用方”)
-  );
+返回node.id;
}
函数getRuntimeMarkDecl(块路径){

更新:


似乎和提交已完成。似乎是由于本节中已解决的另一个问题造成的。

首先,确保您使用的是所有最新版本的babel插件:

npm i-D巴别塔加载器巴别塔polyfill巴别塔-preset-es2015巴别塔-preset-stage-0巴别塔运行时

(我不确定是否确实需要
babel运行时
——YMMV)

在网页的
条目中,使用以下命令:

  entry: [
    'babel-polyfill',
    './index.js'
  ]
您需要将
babel polyfill
添加到您的输入脚本中,以启用async/await所需的“regeneratorRuntime”

然后使用
模块
部分中的
babel加载程序
(而不是
babel

这应该可以解决问题

注意:如果您在服务器端使用Node,则需要在输入脚本的顶部添加一个显式的
require('babel-polyfill');
,以确保识别任何异步/等待语法

es2015和stage-0不足以填充节点5-相反,请在
中使用它。babelrc

{
  "presets": [
    "node5"
  ]
}
是我维护的babel插件的集合,用于填充缺少的Node 5.x部分。它也应该主要用于Node 4.x(虽然有一些小的变化,但现在在ES6兼容性方面几乎相同)

您需要首先使用NPM安装它:


npm i-D babel-preset-node5

对于节点v8.11上的preset
env
,我遇到了异步函数根本无法运行的问题,也没有异常

然后我参考了官方文档并将
target
添加到
.babelrc
,现在它可以工作了

{
  "presets": [
    ["env", {
      "targets": {
        "node": "current"
      }
    }]
  ]
}

我尝试使用异步函数,但它抱怨一个名为_callee的未知变量,你能帮助解决这个问题吗?@JakeOrtiz检查答案中的更新部分。他们似乎正在解决这个问题:)。似乎PR在11月26日15日合并而没有抱怨:+1:
{
  "presets": [
    "node5"
  ]
}
{
  "presets": [
    ["env", {
      "targets": {
        "node": "current"
      }
    }]
  ]
}