是否可以在生产中使用babel-node

时间:2015-06-11 06:59:09

标签: javascript node.js browserify babeljs

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

4 个答案:

答案 0 :(得分:106)

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

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

  

根据http://babeljs.io/docs/setup/#babel_registerbabel-register 不适合生产使用 - 主要建议在简单情况下使用require挂钩。

for 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< = 5,只需使用require hook。

require("babel/register");
  

节点所需的所有后续文件,扩展名为 .es6 .es .jsx .js 将由巴贝尔改造。 <{3}}也是自动需要的。

您可以将源文件保存在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

答案 1 :(得分:52)

我刚写了a blog post on this topic

Babeljs CLI documentation警告以下内容:

  

babel-node不适合生产使用

     

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

这是一个如何设置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

上找到更多详情

答案 2 :(得分:12)

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

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

另一方面,

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

我只使用Babel进行模块支持。现在V8刚刚在2017年1月10日发布了support for modules。希望我们在几个月内看到Node下的模块支持,这让我有理由使用Babel。

答案 3 :(得分:7)

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