【问题标题】:Can Babel compile for "node --harmony" instead of ES5?Babel 可以为“node --harmony”而不是 ES5 编译吗?
【发布时间】:2015-09-10 04:35:52
【问题描述】:

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

是否可以针对节点和谐而不是 ES5?我在选项中看不到任何有希望的东西,但选择目标似乎是能够使用编译器完成的标准操作。

更新

将 Babel 的 regenerator transform 列入黑名单似乎没有任何效果,即使我使用的是 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

【问题讨论】:

    标签: node.js babeljs ecmascript-2016


    【解决方案1】:

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

    {
      blacklist: [
        'es6.classes'
      ]
    }
    

    例如会停止转译 ES6 类并依赖于您的平台来支持它们。转换的主要列表是here

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

    【讨论】:

    • 黑名单再生器没有效果,即使我使用的是stage: 1。奇怪的是,如果我从 CLI 运行 Babel 而不是使用 require 注入器,我会看到 Babel 只是在编译我的源代码,而不是 Koa 或任何其他 node_modules。这很好,这些模块的生成器应该完好无损,但是当我运行编译版本时,我仍然得到相同的断言错误。
    • 介意我问什么让你说它没有效果?您如何实际测试它是作为真正的生成器还是作为转译的生成器加载?你提到的断言是什么?
    • 我问是因为据我所知,regenerator-transpiled 生成器仍应通过 'GeneratorFunction' == fn.constructor.name 在 Koa 中的检查。
    • 查看koa-router 的文档,看起来您应该使用app.use(router.routes())。直接传递路由器对象会破坏断言。因为'GeneratorFunction' !== 'Router'
    【解决方案2】:

    奇怪的是,它似乎在 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;
    

    【讨论】:

    • app.use( Router.routes() ); - 这实际上是我现在安装路线的方式。看来 koa-router 有更新。
    猜你喜欢
    • 2016-04-17
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 2020-06-07
    • 2023-04-07
    相关资源
    最近更新 更多