Может ли Babel скомпилироваться для node --harmony вместо ES5?

Я пытаюсь скомпилировать приложение Koa, и у Koa есть утверждения, которые проверяют, что я передаю функции генератора в качестве промежуточного программного обеспечения. Однако я хотел бы скомпилировать код на стороне сервера из ES7 с помощью Babel для согласованности с кодом внешнего интерфейса.

Можно ли настроить гармонию узлов вместо ES5? Я не вижу ничего многообещающего в опциях, но выбор цели кажется стандартной вещью, которую можно сделать с помощью компилятора.

обновить

Добавление в черный список регенераторного преобразования Babel, похоже, не имеет никакого эффекта, хотя я использую stage: 1 .

index.js:

require( "babel/register" )({
    sourceMaps: "inline",
    stage: 1,
    blacklist: [ "regenerator" ],
    optional: [ "asyncToGenerator" ]
});

var app = require( "./src/server" );

app.listen( process.env.port || 3000 );

источник/server.js:

import koa from "koa";
import router from "koa-router";

router.get( "/", function *( next ) {
    this.body = "Hi!";
});

let app = koa();
app.use( router() );

export default app;

Выполнить: node --harmony index.js

node --version
v0.12.4

person Dan Ross    schedule 24.06.2015    source источник


Ответы (2)


На самом деле не существует стандартного определения --harmony, поскольку оно будет зависеть от того, какую версию Node или iojs вы используете. Лучшее, что вы можете сделать с Babel, — это явно решить, какие преобразования выполнять. Babel позволяет вам указать опцию whitelist и/или blacklist, например.

{
  blacklist: [
    'es6.classes'
  ]
}

например, прекратит транспиляцию классов ES6 и будет полагаться на вашу платформу, поддерживающую их. Основной список преобразований находится здесь.

'regenerator' в этом случае отключит транспилирующие генераторы. Однако, если вы отключите это и используете асинхронные функции, вам нужно передать optional: ['asyncToGenerator'], чтобы включить преобразование асинхронных функций в стандартные генераторы с функцией-оболочкой, поскольку в противном случае они попадут в окончательный вывод.

person loganfsmyth    schedule 24.06.2015
comment
Регенератор черного списка не дал никакого эффекта, хотя я использую stage: 1. Странно то, что если я запускаю Babel из CLI вместо использования инжектора require, я вижу, что Babel компилирует только мой исходный код, а не Koa или любые другие модули node_modules. Это хорошо, эти модули должны иметь свои генераторы нетронутыми, но когда я запускаю скомпилированную версию, я все равно получаю ту же ошибку утверждения. - person Dan Ross; 24.06.2015
comment
Не возражаете, если я спрошу, почему вы говорите, что это не имеет никакого эффекта? Как вы на самом деле проверяете, загружен ли он как настоящий генератор по сравнению с транспилированным? Что за утверждение вы упомянули? - person loganfsmyth; 24.06.2015
comment
Спрашиваю, потому что, насколько мне известно, regenerator-транспилированные генераторы все равно должны проходить 'GeneratorFunction' == fn.constructor.name проверку в Коа. - person loganfsmyth; 24.06.2015
comment
Глядя на документацию для koa-router, похоже, что вы должны делать app.use(router.routes()). Прямая передача объекта маршрутизатора нарушит утверждение. потому что 'GeneratorFunction' !== 'Router' - person loganfsmyth; 24.06.2015

Странно, кажется, что он работает из CLI (с небольшими изменениями в server.js)

babel-node --blacklist regenerator --harmony server.js

Код для server.js:

import koa from "koa";
import router from "koa-router";

const Router = router();

Router.get( "/", function *( next ) {
    this.body = "Hi foo!";
});

let app = koa();
app.use( Router.routes() );

export default app;
person Jastrzebowski    schedule 03.08.2015
comment
app.use( Router.routes() ); - Собственно так я сейчас и монтирую маршруты. Похоже, вышло обновление для koa-router. - person Dan Ross; 03.08.2015