在生产中使用 babel-node 可以吗?

Is it okay to use babel-node in production

本文关键字:babel-node 生产中      更新时间:2023-09-26

我一直在使用babel-node和browserify与babelify转换开发一个网站,以支持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"

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


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

根据 http://babeljs.io/docs/setup/#babel_register 的说法,babel-register不适用于生产用途 - require钩子主要推荐用于简单情况。

对于巴别塔 6+

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

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

.babelrc文件添加转换 — 这是我们上面下载的 prest 模块。查看预设的完整列表,看看哪一个最适合您。

{
  "presets": ["es2015"]
}

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

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

然后建造它!

$ npm run build

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

$ npm start

对于 Babel <= 5,只需使用 require 钩子。

require("babel/register");

节点所需的扩展名为 .es6、.es.jsx.js 的所有后续文件都将由 Babel 转换。填充代码也是自动必需的。

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


根据您的评论,您似乎遇到了一点麻烦。特别注意上面黄色突出显示的部分。您的第一个文件只能是 ES5,它由节点本身运行。所有后续需求都将由 Babel 改变......

下面是典型的设置可能的样子

服务器.js

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

应用.js

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

点燃它!

$ node server.js

我刚刚写了一篇关于这个主题的博客文章

Babeljs CLI 文档警告以下内容:

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"
},

您可以在博客文章中找到更多详细信息

权衡在

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

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

另一方面

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

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

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

简单地回答你的问题:不,babel-node不应该由你明确调用。 babel-node是一个由babel-cli使用的私人图书馆。

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

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