在生产中使用 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 进行常规构建
根据 http://babeljs.io/docs/setup/#babel_register 的说法,
babel-register
不适用于生产用途 - require钩子主要推荐用于简单情况。
对于巴别塔 6+
从 Babel 6 开始,默认情况下不包含任何转换。因此,让我们从安装babel-cli
和babel-preset-es2015
开始。
$ npm install --save-dev babel-cli babel-preset-es2015
向.babelrc
文件添加转换 — 这是我们上面下载的 prest 模块。查看预设的完整列表,看看哪一个最适合您。
{
"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 改变......
下面是典型的设置可能的样子
服务器.js
// only ES5 is allowed in this file
require("babel/register");
// other babel configuration, if necessary
// load your app
var app = require("./app.js");
应用.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 脚本以使用 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"
},
您可以在博客文章中找到更多详细信息
生产中使用 babel-node 的利弊很重要。
- 在商用硬件上,
babel-node
确实会增加半秒到一秒的启动成本。但是,如果您的应用程序是长时间运行的服务器,则启动成本将无关紧要。 - 尝试测量额外的内存消耗。例如,对于我的应用程序(读取和处理时间序列数据),它只有 20MB。根据您的情况,这可能很重要,也可能不重要。
另一方面
- 直接使用 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 或其任何辅助模块!相当漂亮。
- 生产中的Rails Javascript 404(资产管道)
- “未捕获的类型错误:未定义不是函数”错误只发生在生产中,而不是在开发中
- 在 Babel 的 Node 脚本中使用 ES6 语法
- 链轮'asset_path不会返回生产中HTML资产的摘要路径
- 如何在网站中为JS变量赋值,取决于它是否's正在本地运行或正在生产中
- 如何快速学习jslib?Reactjs,AngularJS,node,es6,babel
- 生产中的Rails:JavaScript文件未运行
- Babel-node脚本失败'意外标记'syntaxError on '线
- 在React.js、node.js、webpack、babel、express中使用fs模块
- Rails 4 -在生产中,我的javascript加载但不工作,而它在开发中工作良好
- 在node 6.7.0发布之后,我们还需要Babel来编译es6代码吗?
- 如何将angular 2项目构建/部署到生产中
- 在Babel、webpack和Node.js中设置默认导出
- 从另一个控制器广播一个函数是行不通的,但只有在生产中
- 如何在babel, Node.js和webpack的项目中包含jQuery ?
- 在reactjs中给出babel和node.js之间关系的细节
- rails 3.2:确认删除.在开发中,confim对话框打开一次,但在生产中,它打开三次
- 使用 Browserify/Babel/node.js您是否需要一个基于变量字符串的文件
- 在生产中使用 babel-node 可以吗?
- Overviewmap更改ol.OVERVIEWMAP_MAX_RATIO在生产中