在生产中使用 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-cli
和 babel-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 钩子。
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-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 或其任何帮助模块!很漂亮。
权衡在生产中使用 babel-node 的利弊很重要。
babel-node
确实会在商品硬件上增加半秒到一秒的启动成本。但是,如果您的应用是 long-running 服务器,那么启动成本就无关紧要了。
- 尝试测量额外的内存消耗。以我的应用程序(读取和处理时间序列数据)为例,它只有 20MB。根据您的情况,这可能重要也可能不重要。
另一方面,
- 直接使用 babel-node 简化了开发——您不需要 "build" 脚本,也不需要单独的
src
/lib
和 dist
目录
- 如果您
import
来自本地文件,您会从 src/myutils
导入还是从 lib/myutils
导入?使用 babel-node
消除了这个问题。
我只使用 Babel 来支持模块。现在 V8 刚刚于 2017 年 1 月 10 日 support for modules 发布。希望我们能在几个月后看到 Node 中的模块支持,这让我没有理由使用 Babel。
我一直在使用 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-cli
和 babel-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 钩子。
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-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 或其任何帮助模块!很漂亮。
权衡在生产中使用 babel-node 的利弊很重要。
babel-node
确实会在商品硬件上增加半秒到一秒的启动成本。但是,如果您的应用是 long-running 服务器,那么启动成本就无关紧要了。- 尝试测量额外的内存消耗。以我的应用程序(读取和处理时间序列数据)为例,它只有 20MB。根据您的情况,这可能重要也可能不重要。
另一方面,
- 直接使用 babel-node 简化了开发——您不需要 "build" 脚本,也不需要单独的
src
/lib
和dist
目录 - 如果您
import
来自本地文件,您会从src/myutils
导入还是从lib/myutils
导入?使用babel-node
消除了这个问题。
我只使用 Babel 来支持模块。现在 V8 刚刚于 2017 年 1 月 10 日 support for modules 发布。希望我们能在几个月后看到 Node 中的模块支持,这让我没有理由使用 Babel。