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


87

我一直在开发一个使用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"

Answers:


114

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


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

根据http://babeljs.io/docs/setup/#babel_register的说明babel-register并不用于生产用途-在简单情况下,主要建议使用require钩子。

适用于Babel 6+

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

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

向您的.babelrc文件添加转换-这是我们上面下载的perst模块。查看预设完整列表,以查看最适合您的预设

{
  "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改变...

这是典型设置的样子

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

9
实际上,我只是尝试了此操作,将其放入require("babel/register");server.js,然后在运行时node server.js收到错误消息: Unexpected reserved word: import ... 似乎没有起作用
svnm

1
@steveniseki我的更新应演示如何启动和运行东西。
谢谢您

太棒了,非常感谢,我实际上以为是这种情况,并尝试将我的server.js全部制作在ES5中,但似乎没有用,无论如何,此解决方案实际上将应用程序推送到app.js更好,并且效果很好。谢谢
svnm

示例项目现在工作以这种方式与节点server.js :)是这里如果有人有兴趣看的例子。这是一个使用React Router,Babel和Alt的示例,我将在一个实际站点中使用它。
svnm

4
同时更改为require(“ babel-register”); ..无论如何,我会收到“意外的令牌导入” ..
smotru

54

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

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

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


3
由于Node 4.0支持ES6,我们仍然需要使用babel来编译代码吗?
lvarayut

8
@LVarayut是的,根据功能的不同,服务器端仍然需要babel。节点v4.0.0不支持所有ES6功能(尤其是通过导入/导出语法的模块)。有关该主题的更多信息,请参见nodejs.org/en/docs/es6,或键入node --v8-options |。grep在终端中“进行中”,以获取尚未实现的ES6功能列表。
jbmusso

@jbmusso感谢您的出色解释:)
lvarayut

14
Babel不仅适用于ES6,而且适用于ESNext。。因此,一旦它们加入TC39规格,它将不断添加ES7和最新功能。
cuadraman

15

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

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

另一方面,

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

我仅将Babel用于模块支持。现在,V8刚刚在2017年1月10日发布了对模块的支持。希望我们能在几个月后看到Node在模块支持下的旗帜,这就是我使用Babel模拟辩论的原因。


8

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.