我一直在使用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
它babelify
并运送给客户。
对于服务器端代码 ,我只是使用babel-cli进行常规构建
据http://babeljs.io/docs/setup/#babel_register ,
babel-register
并不意味着在生产中使用 -的要求挂钩推荐用于简单的情况。
对于Babel 6+
从Babel 6开始,默认情况下不包含任何转换。 所以我们首先安装babel-cli
和babel-preset-es2015
。
$ npm install --save-dev babel-cli babel-preset-es2015
在.babelrc
文件中添加转换 - 这是我们上面下载的.babelrc
模块。 查看完整的预设列表,了解哪一个最适合您。
{
"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
我刚刚写了一篇关于这个主题的博客文章
Babeljs CLI文档警告以下内容:
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"
},
您可以在博客文章中找到更多详细信息
重要的是权衡在生产中使用babel-node的利弊。
babel-node
确实在商品硬件上增加了半秒到一秒的启动成本。 但是,如果您的应用程序是长期运行的服务器,那么启动成本并不重要。 另一方面,
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或其任何帮助模块! 很漂亮。