生产环境可以用babel-node吗

IT技术 javascript node.js browserify babeljs
2021-03-20 11:10:58

我一直在使用 babel-node 和带有 babelify 转换的 browserify 开发一个站点,以支持 ES6 语法。

我只是想知道,我可以在生产中运行它, babel-node server 而不是 node server 在 node 中运行 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个回答

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


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

http://babeljs.io/docs/setup/#babel_registerbabel-register不能用于生产环境-钩推荐用于简单的情况下的需要。

通天塔 6+

从 Babel 6 开始,默认情况下不包含任何转换。所以让我们从安装babel-cli开始babel-preset-es2015

$ npm install --save-dev babel-cli babel-preset-es2015

向您的.babelrc文件添加转换——这是我们在上面下载的 perst module。查看完整的预设列表,看看哪些(哪些)最适合您。

{
  "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");

node 需要的所有后续文件扩展名为.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
同时它变成了 require("babel-register"); ..无论如何我得到“意外的令牌导入”..
2021-04-25 11:10:58
如果有人有兴趣查看示例,那么现在以这种方式使用 node server.js :) 的示例项目就在这里这是一个使用 react router、babel 和 alt 的示例,我将用于真实站点。
2021-04-29 11:10:58
@steveniseki 我的更新应该演示如何启动和运行。
2021-05-07 11:10:58
太棒了,非常感谢,我实际上认为会是这种情况并尝试将我的 server.js 全部放在 ES5 中,但它似乎不起作用,无论如何,这个解决方案实际上更好地将应用程序推送到 app.js ,而且效果很好。谢谢
2021-05-14 11:10:58
实际上我只是试过这个,放入require("babel/register");我的 server.js,当我运行时node server.js出现错误: Unexpected reserved word: import ... 所以它似乎不起作用
2021-05-19 11:10:58

我刚刚写了一篇关于这个主题的博客文章

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"
},

您可以在博客文章中找到更多详细信息

既然 Node 4.0 支持 ES6,那我们还需要用 babel 来编译代码吗?
2021-04-24 11:10:58
Babel 不仅适用于 ES6,而且适用于 ESNext。因此,它会不断添加来自 ES7 和最新的特性,一旦它们在 TC39 规范中得到解决。
2021-05-09 11:10:58
@LVarayut 是的,根据功能,服务器端仍然需要 babel。Node v4.0.0 不支持所有 ES6 特性(尤其是通过导入/导出语法的module)。有关该主题的更多信息,请参阅nodejs.org/en/docs/es6,或键入 node --v8-options | grep 在终端中“进行中”以获取尚未实现的 ES6 功能列表。
2021-05-17 11:10:58

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

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

另一方面,

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

我只使用 Babel 来支持module。现在 V8 刚刚在 2017 年 1 月 10 日发布了对module的支持。希望我们能在几个月后看到 Node 中的module支持在一个标志下,这说明我使用 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 或其任何辅助module!很漂亮。