是否可以在生产中使用babel-node

svn*_*vnm 84 javascript node.js browserify babeljs

我一直在使用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"
Run Code Online (Sandbox Code Playgroud)

这是我的开发依赖项

"babel": "^4.0.1",
"babelify": "^5.0.3",
"browserify": "^8.0.3"
Run Code Online (Sandbox Code Playgroud)

Tha*_*you 112

对于客户端代码,您正在做正确的事情.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
Run Code Online (Sandbox Code Playgroud)

.babelrc文件中添加转换- 这是我们上面下载的perst模块.查看完整的预设列表,了解哪一个最适合您.

{
  "presets": ["es2015"]
}
Run Code Online (Sandbox Code Playgroud)

添加build脚本到您的package.json.下面src是您的输入文件,build是转换后的输出文件

"scripts": {
  "build": "babel src -d build"
}
Run Code Online (Sandbox Code Playgroud)

然后建立它!

$ npm run build
Run Code Online (Sandbox Code Playgroud)

然后运行你的代码.此时,您将要执行目录中的build文件

$ npm start
Run Code Online (Sandbox Code Playgroud)

对于Babel <= 5,只需使用require钩子.

require("babel/register");
Run Code Online (Sandbox Code Playgroud)

具有扩展名.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");
Run Code Online (Sandbox Code Playgroud)

app.js

// this file will be loaded through babel
// you can now use ES6 here and in every other include
Run Code Online (Sandbox Code Playgroud)

燃烧起来;动起来!

$ node server.js
Run Code Online (Sandbox Code Playgroud)

  • 实际上我只是尝试了这个,把`require("babel/register");`放在我的server.js中,当我运行`node server.js`时,我得到错误:`意外的保留字:import ...`所以它似乎没有用 (9认同)
  • 同时它改为要求("babel-register"); ..无论如何,我得到"意外的令牌导入".. (4认同)

cua*_*man 53

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

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"
},
Run Code Online (Sandbox Code Playgroud)

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

  • Babel不仅适用于ES6,而且适用于ESNext ..因此,只要它们在TC39规范中得到解决,它就会不断添加ES7和最新版本的功能. (14认同)
  • @LVarayut是的,根据功能,babel仍然需要服务器端.Node v4.0.0不支持所有ES6功能(特别是通过导入/导出语法的模块).有关该主题的更多信息,请参阅https://nodejs.org/en/docs/es6/,或键入node --v8-options | 在终端中grep"进行中"以获取尚未实现的ES6功能的列表. (8认同)
  • 由于Node 4.0支持ES6,我们还需要使用babel来编译代码吗? (3认同)

Dan*_*scu 14

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

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

另一方面,

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

我只使用Babel进行模块支持.现在V8刚刚在2017年1月10日发布了对模块的支持.希望我们能在几个月内看到Node下的模块支持,这让我有理由使用Babel.


wle*_*300 7

@ 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或其任何帮助模块!很漂亮.