【问题标题】:Is it okay to use babel-node in production在生产中使用 babel-node 可以吗
【发布时间】:2015-08-26 17:36:03
【问题描述】:

我一直在使用 babel-node 和带有 babelify 转换的 browserify 开发一个站点,以支持 ES6 语法。

我只是想知道,我可以在生产环境中运行它吗 babel-node server 而不是 node server 我还有哪些其他选项可以运行 ES6节点?

这是我正在运行的构建和开始开发的命令

// npm run build
browserify -t [babelify] client.js > public/js/bundle.js",

// npm start
babel-node server.js"

这是我的开发依赖项

"babel": "^4.0.1",
"babelify": "^5.0.3",
"browserify": "^8.0.3"

【问题讨论】:

    标签: javascript node.js browserify babeljs


    【解决方案1】:

    对于客户端代码,您做的是正确的事情。 babelify 并将其发送给客户。


    对于服务器端代码,我会使用babel-cli进行常规构建

    根据http://babeljs.io/docs/setup/#babel_registerbabel-register 不适合生产使用 — require 钩子主要推荐用于简单的情况。

    适用于 Babel 6+

    从 Babel 6 开始,默认情况下不包含任何转换。那么让我们从安装babel-clibabel-preset-es2015 开始吧。

    $ npm install --save-dev babel-cli babel-preset-es2015
    

    为您的.babelrc 文件添加一个转换——这是我们在上面下载的 perst 模块。看看full list of presets,看看哪个最适合你。

    {
      "presets": ["es2015"]
    }
    

    build 脚本添加到您的package.json。下面src 是你的输入文件,build 是转换后的输出文件

    "scripts": {
      "build": "babel src -d build"
    }
    

    然后构建它!

    $ npm run build
    

    然后运行您的代码。此时,您需要执行 build 目录中的文件

    $ npm start
    

    对于 Babel

    require("babel/register");
    

    节点所需的所有后续文件,扩展名为 .es6.es.jsx.js > 将被 Babel 转化。 polyfill 也是自动需要的。

    您将能够将源文件保留在 ES6 中,但仍使用 node server.js 执行它们


    根据您的cmets,您似乎遇到了一些麻烦。特别注意上面黄色突出显示的部分。你的第一个文件只能是 ES5,由 node 自己运行。所有后续要求都将被 Babel 转换...

    这是典型设置的样子

    server.js

    // only ES5 is allowed in this file
    require("babel/register");
    
    // other babel configuration, if necessary
    
    // load your app
    var app = require("./app.js");
    

    app.js

    // this file will be loaded through babel
    // you can now use ES6 here and in every other include
    

    开火!

    $ node server.js
    

    【讨论】:

    • 其实我只是试过这个,把require("babel/register");放在我的server.js中,当我运行node server.js我得到错误:Unexpected reserved word: import ...所以它似乎没有工作
    • @steveniseki 我的更新应该演示如何启动和运行。
    • 太棒了,非常感谢,我实际上认为会是这种情况并尝试将我的 server.js 全部放在 ES5 中,但它似乎不起作用,无论如何这个解决方案实际上要好得多将应用程序推送到 app.js,它运行良好。谢谢
    • 现在以这种方式与节点 server.js 一起工作的示例项目是here,如果有人有兴趣查看该示例。这是一个使用 react router、babel 和 alt 的示例,我将用于真实站点。
    • 同时更改为 require("babel-register"); ..无论如何我得到“意外的令牌导入”..
    【解决方案2】:

    我刚刚写了a blog post on this topic

    Babeljs CLI documentation 发出以下警告:

    babel-node 不适合生产使用

    您不应该在生产环境中使用 babel-node。这是不必要的 重,由于缓存存储在内存中,内存使用率很高。 您还将始终遇到启动性能损失,因为 整个应用程序需要即时编译。

    这是一个如何设置 npm 脚本以使用 node 而不是 babel-node 运行应用程序的示例。

    "scripts": {
      "clean": "rm -rf build && mkdir build",
      "build-css": "node-sass scss/app.scss public/css/app.css",
      "build-server": "babel -d ./build ./server -s",
      "build": "npm run clean && npm run build-css && npm run build-server",
      "lint": "eslint source/ --quiet",
      "start": "node ./build/index.js",
      "debug": "node --debug ./build/index.js",
      "test": "for i in $(ls tests/); do babel-node \"./tests/${i}\" | faucet ; done",
      "validate": "npm run lint; npm run test && npm outdated --depth 0"
    },
    

    您可以在blog post找到更多详细信息

    【讨论】:

    • 既然 Node 4.0 支持 ES6,我们还需要使用 babel 编译代码吗?
    • @LVarayut 是的,根据功能,服务器端仍然需要 babel。 Node v4.0.0 不支持所有 ES6 特性(尤其是通过导入/导出语法的模块)。有关该主题的更多信息,请参阅nodejs.org/en/docs/es6,或键入 node --v8-options | grep "in progress" 在终端中获取尚未实现的 ES6 功能列表。
    • Babel 不仅适用于 ES6,而且适用于 ESNext。因此,它会不断添加 ES7 的功能以及在 TC39 规范中确定的最新功能。
    【解决方案3】:

    权衡在生产中使用 babel-node 的利弊很重要。

    • babel-node 确实会在商品硬件上增加半秒到一秒的启动成本。但是,如果您的应用是一个长期运行的服务器,那么启动成本就无关紧要了。
    • 尝试测量额外的内存消耗。例如,对于我的应用程序(读取和处理时间序列数据),它只有 20MB。根据您的情况,这可能很重要,也可能不重要。

    另一方面,

    • 直接使用 babel-node 可以简化开发 - 您不需要“构建”脚本,也不会有单独的 src/libdist 目录
    • 如果你从本地文件import,你是从src/myutils 导入,还是从lib/myutils 导入?使用 babel-node 可以解决这个问题。

    我只使用 Babel 来支持模块。现在 V8 刚刚在 2017 年 1 月 10 日发布了 support for modules。希望我们能在几个月后看到 Node 中的模块支持,这让我使用 Babel 的理由变得毫无意义。

    【讨论】:

      【解决方案4】:

      @cuadraman 的回答比@naomik 更准确。

      简要回答您的问题:不,您不应明确调用babel-nodebabel-nodebabel-cli 使用的私有库。

      官方教程包含在节点(不是浏览器端!)上启动和运行所需的一切:https://github.com/babel/example-node-server。阅读!我发现了很多使用迂回方法的误导性博客教程,并且发现这篇文章最容易理解。

      奖励:与许多人的想法相反,所有的转换魔法都可以在本地安装(使用npm install --save-dev babel-cli nodemon babel-preset-es2015 babel-preset-stage-2)。无需全局安装 Babel 或其任何辅助模块!很漂亮。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-23
        • 1970-01-01
        • 1970-01-01
        • 2011-05-20
        • 1970-01-01
        • 1970-01-01
        • 2010-09-12
        相关资源
        最近更新 更多