如何运行启用了ES6功能的Node.js应用程序?

83

我使用BabelJS(以前称为6to5)的require hook来运行带有es6features的node应用程序:

// 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?https://iojs.org/en/index.html - Jahed
我不知道io.js。看起来很棒,但与BabelJS不同的是它不支持rest arguments - maiermic
1
好的。我们会关注它,它的发展速度很快,不像NodeJS,所以我相信它很快就会得到支持。 - Jahed
6
дҪ жӯЈеңЁеҜ»жүҫbabel-nodeеҗ—пјҹhttps://babeljs.io/docs/usage/cli/#babel-node - Felix Kling
可能想要查看 https://www.npmjs.com/package/babel-register-cli。 - aceofspades
简单的解决方案在 node 13.5,express 6.13.4 上成功。https://timonweb.com/tutorials/how-to-enable-ecmascript-6-imports-in-nodejs/ - burntsugar
10个回答

145

在你的应用程序的package.json文件中添加babel-clibabel-preset-es2015(又名ES6)依赖项,并定义一个start脚本:

babel-clibabel-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中移除它。

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

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

其中一个好处是,运行应用的命令保持不变,这在与其他开发人员合作时非常有帮助。


20
需要注意的是,Babel文档明确警告不要在生产环境中使用babel-node(http://babeljs.io/docs/usage/cli/#babel-node)。 - Phil
5
你的设置对 nodemon 或其他工具有什么影响?在开发时每次修改文件后都需要手动重新加载服务器吗?请问。 您是否真的需要在每次修改文件时手动重新加载服务器,或者可以尝试使用 nodemon 或其他类似工具来自动重新加载呢? - Green
从文档中可以得知: 不应在生产环境中使用babel-node。它是不必要的沉重工具,由于缓存存储在内存中而导致高内存使用率。你还将始终遭受启动性能惩罚,因为整个应用程序需要即时编译。 - Felipe Martim
更新:截至2017年,首选的常见预设是preset-env。只要安装了它,甚至不需要指定... - Frank N
因此,只要安装了 babel-clipreset-env,并且如果您喜欢直接进行操作(无需使用 npm run... 和编辑 package.json),则可以从项目根目录发出以下命令: $> ./node_modules/.bin/babel-node yourToolhere.js - Frank N
为什么我需要所有这些依赖项才能运行特定的JS版本? - Philip Rego

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 - 它也可以是阶段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"
}
在项目的根目录下(有 package.json 文件),创建 .babelrc 文件。
{
 "presets": ["es2015", "stage-0"]
}

5.创建两个目录:

src - 这里是使用es6编写的工作目录文件

dist - 这里的文件将使用babel编译为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目录中的更改并编译到dist中

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

npm run serve//它执行watch和启动node服务器,在每次文件更改时,nodemon会使用dist目录更改重新启动node服务器

9.最后注意事项

  • 服务器将运行dist/index.js文件作为主文件。
  • dist/index.js文件将从src/index.js编译而来,因此应该是项目的主文件。
  • 应将dist目录添加到git的忽略列表中(但如果它是一个node包,则不要在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
根据Babel本身的说明,babel包在Babel 6中是无操作的。 Babel的CLI命令已从babel包移动到babel-cli包中。 考虑安装@babel/core@babel/cli。将脚本更改为"babel src -d dist" - YSLdev

17
您可以使用带有“--harmony”标志的Node来运行支持ES6特性的脚本。

5
带有 --harmony 标志的 Node 不支持 rest arguments。这是 BabelJS 支持的一项功能,我想要使用它。 - maiermic
你可以看到现在支持了剩余参数 https://kangax.github.io/compat-table/es6/#node8_10 - Dmitry Davydov

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

这是最好的解决方案。

  1. npx babel-node scripts.js

!Babel node 在退出过程中存在问题,而 kexec 包在这种情况下也无法提供帮助 (我已经尝试过)。

在这两种情况下,你需要使用 .babelrc 文件来描述应用程序的预设和插件。

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


node -r babel-register scripts.js 在开发中非常简单,而且运行良好。 - Nditah

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预设选项,因为我们可以使用require方法进行设置。


1
它在生产环境中使用时存在一些警告 https://babeljs.io/docs/setup/#installation不适用于生产环境。 require钩子主要推荐简单的情况下使用。 - WitVault
在这种情况下,我该如何在生产环境中运行我的应用程序?我需要将文件编译成es5吗? :/ - sandiprb
@sandip_rb 是的,你必须在进入生产环境之前编译你的文件。 你必须找出这个解决方案适用于不支持 ES6(小于4.x版本)的 node.js 版本。现在 node.js 版本已经支持 ES6 - ahmed hamdy
@sandip_rb,查看关于在生产中使用Babel的有用链接-> https://medium.com/@Cuadraman/how-to-use-babel-for-production-5b95e7323c2f#.qovdqz4bm - ahmed hamdy

3

npm init es6

这将创建一个带有"type": "module"设置的package.json文件。


Node的Active LTS版本(目前为v16)及以上默认启用了大多数ES6特性。在package.json中将type设置为module只会启用import/export语法。这会导致禁用require()并且不设置某些全局变量,如__dirname,这可能并不总是理想的。 - Besworks

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);
});

使用 node es6 thefile.js 命令来运行你的 ES6 特性脚本。

参考资料: 官方的使用文档


1
自从 Babel 6 版本起,您现在必须安装 babel-register 并使用以下内容。
require("babel-register");

一定要安装 babel es2015 预设。


1

0

由于此页面上的大多数答案不再适用,截至2023年5月,以下是最新方法:

步骤1:安装必要的包


在项目目录中运行以下命令以安装所需的软件包:

npm install --save-dev @babel/core @babel/cli @babel/preset-env

这将安装Babel核心、命令行界面和编译现代JavaScript代码的预设。

步骤2:配置Babel


在项目根目录下创建一个名为`babel.config.json`的文件,并添加以下内容:
{
  "presets": ["@babel/preset-env"]
}

这会告诉 Babel 使用 @babel/preset-env 预设,其中包括支持最新的 JavaScript 语法。

步骤三:更新你的 `package.json` 文件

打开你的 package.json 文件并在 scripts 部分添加以下脚本:
   "dev": "babel -w src -d lib | nodemon lib",

这只是一个示例,它可以根据您的项目结构进行更改。 此脚本将从/src目录编译您的JavaScript文件到/lib目录,然后在编译后的文件上运行nodemon。请注意,此脚本假定您的主入口文件名为index.js。 更通用的脚本如下:

"<script name>: "babel -w <code directory> -d <final/dist directory> | <other scripts for running the server>"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接