ES7异步等待函数与babel-loader无法正常工作

时间:2015-11-07 05:16:14

标签: javascript async-await webpack babeljs

我正在尝试使用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);
}

3 个答案:

答案 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"
      }
    }]
  ]
}

Babel documentation