5

我正在尝试编译一个 Koa 应用程序,并且 Koa 有断言检查以确保我将生成器函数作为中间件传递。但是,我想使用 Babel 从 ES7 编译我的服务器端代码,以与前端代码保持一致。

是否可以针对节点和谐而不是 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 );

src/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
4

2 回答 2

4

没有真正的标准定义,--harmony因为它取决于您碰巧使用的 Node 或 iojs 版本。你可以用 Babel 做的最好的事情就是明确地决定要运行哪些转换。Babel 允许你提供一个whitelist和/或blacklist选项,例如

{
  blacklist: [
    'es6.classes'
  ]
}

例如将停止转译 ES6 类并依赖您的平台支持它们。转换的主要列表在这里

'regenerator'在这种情况下,将禁用转译生成器。但是,如果您禁用它,并且您正在使用异步函数,那么您需要传递optional: ['asyncToGenerator']以启用将异步函数转换为具有包装函数的标准生成器,否则它们最终会出现在最终输出中。

于 2015-06-24T06:28:23.680 回答
1

奇怪的是,它似乎在 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;
于 2015-08-03T13:35:52.757 回答