2015-11-07 5 views
4

Я пытаюсь запустить async ждут функции в JavaScript с помощью загрузчика babel веб-пакета. Я использую следующую конфигурацию:ES7 async ждет функции с babel-loader не работает

{ 
    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'], 
    } 
} 

но продолжает подталкивать ошибку со следующим сообщением:

Module build failed: Error: ./src/static/scripts/index.js: Expected type "Identifier" with option {}

Мой index.js имеет это содержание:

console.log('hi from app'); 

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

async function conversation() { 
    const hi = await hello() 
    console.log(hi); 
} 

ответ

1

Это выглядит как вы нанесли bug. Кажется, он решен, но еще не выпущен.

Если вы не можете дождаться его выпуска, вы можете применить исправление, соответствующее commit, которое решает проблему.

Один из способов применить патч:

Сохранить следующий дифф в файл (например, visit.patch) в вашем пакете корневой папке. Затем примените патч с помощью git apply visit.patch.


From 940b86dadbd0151c33c02e89f0b5ff61077c9214 Mon Sep 17 00:00:00 2001 
From: Henry Zhu <[email protected]> 
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) { 

Update:

кажется, что bug wasn't properly fixed и фиксации был reverted. Похоже, это связано с другой проблемой, которая была рассмотрена в этом pull request.

+0

Я попытался с функцией асинхронной но жалуется о неизвестной переменной с именем _callee, не могли бы вы помочь справиться с этой проблемой? –

+0

@JakeOrtiz Проверьте раздел обновления в ответе. Кажется, что они решают проблему :). – dreyescat

+0

Хорошо, большое спасибо за вашу помощь. –

2

Во-первых, убедитесь, что вы используете все последние версии Вавилонская плагинов:

npm i -D babel-loader babel-polyfill babel-preset-es2015 babel-preset-stage-0 babel-runtime

(я не уверен, что на самом деле babel-runtime required- YMMV)

В entry вашего WebPack, используйте:

entry: [ 
    'babel-polyfill', 
    './index.js' 
    ] 

Вам нужен babel-polyfill добавление к записи сумы t, чтобы включить «time_eneratorRuntime», который необходим для async/wait.

Затем используйте babel-loader в вашем module разделе (вместо babel)

module: { 
    loaders: [ 
     { 
     test: /\.js$/, 
     exclude: /(node_modules|bower_components)/, 
     loader: 'babel-loader', 
     query: { 
      presets: [ 
      'es2015', 
      'stage-0' 
      ] 
     } 
     } 
    ] 

Это должно исправить.

Примечание. Если вы используете узел на стороне сервера, вам нужно добавить явный require('babel-polyfill'); в начало вашего сценария ввода, чтобы обеспечить распознавание синтаксиса async/await.

es2015 и сценическое-0 не было достаточно, чтобы polyfill узел 5 - вместо того, чтобы использовать это в вашем .babelrc

{ 
    "presets": [ 
    "node5" 
    ] 
} 

node5 является коллекцией Бабель плагинов я утверждаю, чтобы polyfill только те части узла 5.x, которые отсутствуют. В основном это должно работать с узлом 4.х тоже

Вам необходимо установить его с НПМ первым (который, с небольшими вариациями, теперь почти идентичны по совместимости ES6.):

npm i -D babel-preset-node5

Смежные вопросы