Javascript 在生产中使用巴别塔节点可以吗

Javascript 在生产中使用巴别塔节点可以吗,javascript,node.js,browserify,babeljs,Javascript,Node.js,Browserify,Babeljs,我一直在开发一个网站,使用babel节点和带有babelify转换的browserify来支持ES6语法 我只是想知道,我是否可以在生产环境中作为babel节点服务器而不是node服务器运行ES6,我还需要在node中运行哪些其他选项 以下是我在开发中运行的build和start命令 // npm run build browserify -t [babelify] client.js > public/js/bundle.js", // npm start babel-node ser

我一直在开发一个网站,使用babel节点和带有babelify转换的browserify来支持ES6语法

我只是想知道,我是否可以在生产环境中作为
babel节点服务器
而不是
node服务器
运行ES6,我还需要在node中运行哪些其他选项

以下是我在开发中运行的build和start命令

// 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
it并将其发送给客户


对于服务器端代码,我只需要使用

根据,
babel register
不适用于生产使用-主要建议在简单情况下使用require hook

巴别塔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节点不适用于生产使用

您不应该在生产中使用babel节点。这是不必要的 重,由于缓存存储在内存中,内存使用率高。 您还将始终经历启动性能惩罚,因为 整个应用程序需要动态编译

这是一个如何设置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"
},

你可以在

@cuadraman的回答比@naomik更准确

简单回答您的问题:不,
babel节点
不应由您显式调用
babel节点
是由
babel cli
使用的私有库

官方教程提供了在节点(而不是浏览器端!)上启动和运行所需的一切:。读吧!我发现了太多误导性的博客教程,这些教程使用了迂回的方式,我发现这篇文章是最容易理解的


好处:与许多人的想法相反,所有的transpiling magic都可以在本地安装(使用
npm安装--save dev babel cli nodemon babel-preset-es2015 babel-preset-stage-2
)。无需在全球范围内安装Babel或其任何辅助模块!非常漂亮。

在生产中权衡使用巴别塔节点的利弊是很重要的

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

  • 使用babel节点可以直接简化开发—您不需要“构建”脚本,也不需要单独的
    src
    /
    lib
    dist
    目录
  • 如果您从本地文件导入,您是从
    src/myutils
    导入,还是从
    lib/myutils
    导入?使用
    babel节点
    可以消除该问题

我只使用Babel来支持模块。现在,V8刚刚于2017年1月10日发布。希望在几个月后,我们能看到Node中的模块支持在一个标志下出现,从而使我使用Babel的理由变得毫无意义。

实际上,我刚刚尝试了这个,将
require(“Babel/register”)
在我的server.js中,当我运行
node server.js
时,我得到一个错误:
意外的保留字:import…
,所以它似乎没有work@steveniseki我的更新应该演示如何启动和运行。太棒了,非常感谢,事实上,我假设情况会是这样,并尝试将我的server.js全部放在ES5中,但它似乎不起作用,无论如何,这个解决方案实际上比将应用程序推到app.js要好得多,而且它工作得非常好。感谢现在以这种方式使用node server.js:)的示例项目是,如果有人有兴趣查看该示例。这是一个使用react路由器、babel和alt的例子,我将在一个真实的站点上使用它。。无论如何,我得到了“意外令牌导入”。由于Node 4.0支持ES6,我们还需要使用babel来编译代码吗?@LVarayut是的,根据功能的不同,babel仍然需要服务器端。节点v4.0.0不支持所有ES6功能(尤其是通过导入/导出语法的模块)。有关此主题的详细信息,请参阅,或在终端中键入node--v8选项| grep“in progress”,以获取尚未实现的ES6功能的列表。@jbmuso感谢您的精彩解释:)Babel不仅适用于ES6,还适用于ESNext。。因此,一旦ES7和最新版本符合TC39规范,它就会不断添加这些特性。
// only ES5 is allowed in this file
require("babel/register");

// other babel configuration, if necessary

// load your app
var app = require("./app.js");
// this file will be loaded through babel
// you can now use ES6 here and in every other include
$ node server.js
"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"
},