如何在启用ES6功能的情况下运行Node.js应用程序?


78

我用的是需要挂钩BabelJS(原名6to5)与运行节点的应用程序es6features

// run.js
require("babel/register");
require("./app.js6");

我打电话node run.js来运行我的app.js6。我需要安装BabelJS并为每个我想使用es6features的项目提供一个run.js。我希望打个电话nodejs6 app.js6。如何独立实现该系统(Unix和Windows)?


您是否考虑过使用io.js代替NodeJS + Babel?iojs.org/en/index.html
杰哈德(

我不知道io.js。看起来不错,但与BabelJS不同,它不支持rest参数
maiermic

1
对。请注意,它的运行速度与NodeJS不同,因此我相信它将很快得到支持。
Jahed 2015年


Answers:


138

babel-cliand babel-preset-es2015(也称为ES6)依赖项添加到应用程序的package.json文件中,并定义一个start脚本:

{
  "dependencies": {
    "babel-cli": "^6.0.0",
    "babel-preset-es2015": "^6.0.0"
  },
  "scripts": {
    "start": "babel-node --presets es2015 app.js"
  }
}

然后,您只需执行以下命令即可运行您的应用程序:

npm start

如果您决定停止使用Babel(例如,一旦Node.js支持所有ES6功能),则可以将其从package.json中删除:

{
  "dependencies": {},
  "scripts": {
    "start": "node app.js"
  }
}

这样的好处之一是,运行您的应用程序的命令保持不变,这在您与其他开发人员一起工作时会有所帮助。


20
应该注意的是,babel文档明确警告不要在生产中使用babel-node
Phil

5
什么nodemon或他人与您的设置?在开发过程中每次更改文件时,是否真的手动重新加载服务器?
2015年

从文档:您不应该在生产中使用babel-node。由于缓存存储在内存中,因此不必要地增加了内存使用量。由于整个应用程序都需要动态编译,因此您还将始终遭受启动性能损失。
Felipe Martim

更新:2017年,首选的通用预设是preset-env。只要安装了它,甚至都不需要指定它……
Frank Nocke

...所以,只要babel-clipreset-env安装,并直接,如果你喜欢的东西(W / O型NPM运行...和的package.json编辑需要)(从项目的根颁发)的命令是:$> ./node_modules/.bin/babel-node yourToolhere.js
弗兰克Nocke

39

如何配置具有es6支持的node.js应用程序并在文件更改时重新加载服务器


I.配置步骤(从头开始创建项目):

1.进入终端到您的项目主目录

npm init //为项目创建package.json

2,安装依赖

npm install --save-dev babel
npm install --save-dev babel-cli
npm install --save-dev babel-preset-es2015
npm install --save-dev babel-preset-stage-0 //*1
npm install --save-dev nodemon

1-也可以是Stage-1或2,这取决于我们要使用的es功能

3.我们应该在package.json文件中有类似的内容(确保包版本会有所不同但是没关系):

"devDependencies": {
  "babel": "^6.5.2",
  "babel-cli": "^6.16.0",
  "babel-preset-es2015": "^6.16.0",
  "babel-preset-stage-0": "^6.16.0",
  "nodemon": "^1.11.0"
}

4.在根项目目录中创建.babelrc文件(有package.json文件)

{
 "presets": ["es2015", "stage-0"]
}

5.创建两个目录:

src-这是包含在es6中写入的文件的工作目录

DIST -这里的文件将编译使用通天ES5

您的项目根目录应如下所示:

  • 项目
    • src
      • index.js //主项目文件
    • dist
    • package.json
    • .babelrc

7,添加到package.json所需的命令:

"scripts": {
  "watch": "babel -w src/ -d dist/",
  "build": "babel src/ -d dist/",
  "serve": "babel -w src/ -d dist/ | nodemon --watch dist",
  "test": "echo \"Error: no test specified\" && exit 1"
}

8,可用命令

npm run watch //在src目录中启动watch watch更改并编译为dist

npm run build //将文件从src目录编译到dist

npm run serve //它正在执行watch +启动节点服务器,每更改文件,它将使用nodemon重新启动节点服务器,该节点正在监视dist目录更改

9,最后的笔记

  • 服务器将dist / index.js文件作为主文件运行。
  • 文件dist / index.js将从src / index.js编译,因此应该有项目的主文件。
  • dist目录应该添加到git忽略(但如果是节点包,则不要在npm忽略它)

10.运行服务器并开始在src目录中创建应用。

npm run serve

二。更简单的方法(准备使用样板)

如果对您来说太多了,那么可以在github- https://github.com/maciejsikora/node-express-babel-boilerplate上找到完整的炒作样板。


问题这个转译只是转换js文件,并且不包含内部的节点模块
stackdave

1
创建第二个构建命令,例如-“ build-modules”:“ babel node-modules / -d dist /”,
Maciej Sikora


6

您需要安装babel-registerbabel-preset-es2015预设babel-register将“启用”选项中使用的选项转换ES6ES5即时移植

 npm install babel-register

 npm install babel-preset-es2015

您的run.js文件:

// require babel-register and set Babel presets options to es2015
require('babel-register')({
   presets: [ 'es2015' ]
});

require("./app.js6");

注意:现在您不需要.babelrc文件来设置Babel presets选项,因为我们使用require方法设置它


1
它对生产使用有一些警告babeljs.io/docs/setup/#installation 不适用于生产使用主要在简单情况下建议使用require钩子。
WitVault

在这种情况下,我将如何在生产中运行我的应用程序?我需要将文件编译到es5吗?:/
sandiprb

@sandip_rb是的,您必须在开始生产之前编译文件。您必须确定此解决方案适用于node.js不支持的版本ES6(小于4.x版本),现在的node.js版本支持 ES6
ahmed hamdy

@sandip_rb看到使用通天投入生产有用的链接- > medium.com/@Cuadraman/...
艾哈迈德hamdy

6
  1. node -r babel-register scripts.js

这是最好的解决方案

  1. npx babel-node scripts.js

!Babel节点在退出过程中不能很好地工作,并且kexec包在这种情况下也无济于事(正如我尝试的那样)

在这两种情况下,您都需要使用.babelrc,其中应描述应用程序的预设和插件。

npx仅用于执行未安装npm或的库yarn。否则您需要npm i -g babel-cli然后babel-node script.js


node -r babel-register scripts.js就像魅力一样,在开发中非常简单
Nditah

3

我希望打个电话nodejs6 app.js6

您可以尝试使用babel-core api的包装器解决方案:

// Save as es6.js

var babel = require("babel-core");
var argc = process.argv.length;

babel.transformFile(process.argv[argc - 1], function (err, result) {
    eval(result.code);
});

使用以下命令运行es6特色脚本 node es6 thefile.js

参考:官方用法文档


1

从babel 6开始,您现在必须安装babel-register并使用以下命令

require("babel-register");

确保还安装了babel es2015预设。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.