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

Is it okay to use babel-node in production

我一直在使用 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

进行常规构建

According to http://babeljs.io/docs/setup/#babel_register, babel-register is not meant for production use — The require hook is primarily recommended for simple cases.

对于 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.jsonsrc 下面是你的输入文件,build 是转换后的输出文件

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

然后构建它!

$ npm run build

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

中的文件
$ npm start

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

require("babel/register");

All subsequent files required by node with the extensions .es6, .es, .jsx and .js will be transformed by Babel. The polyfill is also automatically required.

您将能够将源文件保留在 ES6 中,但仍然可以使用 node server.js

执行它们

根据您的评论,您似乎遇到了一些麻烦。特别注意上面黄色突出显示的部分。你的第一个文件只能是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

我刚刚写了a blog post on this topic

Babeljs CLI documentation 发出以下警告:

babel-node not meant for production use

You should not be using babel-node in production. It is unnecessarily heavy, with high memory usage due to the cache being stored in memory. You will also always experience a startup performance penalty as the entire app needs to be compiled on the fly.

这是一个示例,说明如何将 npm 脚本设置为 运行 您的应用程序使用节点而不是 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

上找到更多详细信息

@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 或其任何帮助模块!很漂亮。

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

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

另一方面,

  • 直接使用 babel-node 简化了开发——您不需要 "build" 脚本,也不需要单独的 src/libdist 目录
  • 如果您 import 来自本地文件,您会从 src/myutils 导入还是从 lib/myutils 导入?使用 babel-node 消除了这个问题。

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