在生产中使用babel-node可以吗?
我一直在开发一个使用babel-node的网站,并使用babelify转换进行browserify,以支持ES6语法。
我只是想知道,我可以在生产中运行这个作为 babel-node server
而不是 node server
我还有什么其他的select在节点中运行ES6?
这里是我正在运行的构build和开始的命令
// 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
它babelify
并运送给客户。
对于服务器端代码 ,我只是使用babel-cli来进行常规的构build
根据http://babeljs.io/docs/setup/#babel_register,babel-register 不适合生产使用 – require hook主要推荐用于简单情况。
为Babel 6+
从巴别塔6开始,默认情况下不包括转换。 所以让我们开始安装babel-cli
和babel-preset-es2015
。
$ npm install --save-dev babel-cli babel-preset-es2015
添加一个转换到你的.babelrc
文件 – 这是我们上面下载的.babelrc
模块。 看看预设的完整列表,看哪一个是最适合你的。
{ "presets": ["es2015"] }
添加一个build
脚本到你的package.json
。 src
下面是你的input文件, build
是转换后的输出文件
"scripts": { "build": "babel src -d build" }
然后build立它!
$ npm run build
然后运行你的代码。 此时,您将需要执行build
目录中的文件
$ npm start
对于Babel <= 5,只需使用require钩子。
require("babel/register");
所有具有扩展名.es6 , .es , .jsx和.js的节点所需的后续文件将由Babel转换。 polyfill也是自动需要的。
您将能够保留您的源文件在ES6中,但仍然使用node server.js
执行它们
根据你的意见,你似乎有点麻烦。 特别要注意上面突出显示的黄色部分。 您的第一个文件只能是由节点本身运行的ES5。 随后的所有需求都将由巴别转变。
这是典型的设置可能的样子
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
我刚写了一篇关于这个话题的博客文章
Babeljs CLI文档警告以下内容:
babel-node不适用于生产用途
你不应该在生产中使用babel-node。 由于caching被存储在内存中,所以内存使用率很高,这是不必要的。 整个应用程序需要进行即时编译,您也会经常遇到启动性能问题。
这是一个如何设置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" },
您可以在博客文章中find更多详细信息
衡量在生产中使用babel节点的利弊是非常重要的。
-
babel-node
在商品硬件上的启动成本增加了半秒到一秒。 但是,如果您的应用程序是长时间运行的服务器,那么启动成本并不重要。 - 尝试测量额外的内存消耗。 以我的应用为例(读取和处理时间序列数据),它只有20MB。 根据你的情况,这可能会或可能不重要。
另一方面,
- 使用babel-node直接简化了开发 – 你将不需要“构build”脚本,你将不会有单独的
src
/lib
和dist
目录 - 如果你从本地文件
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或其任何帮助模块! 相当漂亮。