我正在尝试编译一个Koa应用程序,并且Koa有断言检查以确保我将生成器函数作为中间件传递。但是,为了与前端代码保持一致,我想使用Babel从ES7编译我的服务器端代码。
是否可以针对节点和谐而不是ES5?我没有在选项中看到任何有希望的东西,但是选择目标似乎是能够使用编译器的标准事物。
更新
即使我使用的是stage: 1
,黑名单上的regenerator transform似乎也没有效果。
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
答案 0 :(得分:4)
--harmony
没有真正的标准定义,因为它取决于您碰巧使用的Node或iojs版本。您可以使用Babel做的最好的事情是明确决定要运行的转换。 Babel允许您提供whitelist
和/或blacklist
选项,例如
{
blacklist: [
'es6.classes'
]
}
例如,将停止转换ES6类并依赖于支持它们的平台。变换的主要列表是here。
在这种情况下, 'regenerator'
将禁用转换生成器。但是,如果你禁用它,并且你正在使用异步函数,那么你需要传递optional: ['asyncToGenerator']
以启用异步函数转换为带有包装函数的标准生成器,否则它们最终会进入最后输出
答案 1 :(得分: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;