Node.js计划支持导入/导出ES6 (ECMAScript 2015)模块

我一直在网上找这个问题没有一个明确的答案。

目前Node.js只使用CommonJS语法来加载模块,如果你真的想使用标准的ECMAScript 2015模块语法,你要么必须事先编译它,要么在运行时使用外部模块加载器。

目前我对使用这两种方法中的任何一种都不太乐观,Node.js的维护者是否计划支持ECMAScript 2015模块?我还没有找到任何关于这方面的线索。

目前Node.js 6。x声称支持96%的ECMAScript 2015特性,但没有任何引用模块(Node.js ECMAScript 2015支持链接)。

你知道Node.js在不久的将来会支持这些模块吗?

95252 次浏览

js 13.2.0 &以上

node . js 13.2.0现在支持ES模块没有标志🎉。然而,该实现仍被标记为实验性,因此在生产中使用时要谨慎。

要在13.2.0中启用ECMAScript模块(ESM)支持,请在package.json中添加以下内容:

{
"type": "module"
}

所有.js.mjs(或没有扩展名的文件)将被视为ESM。

除了整个package.json选项之外,还有许多不同的选项,所有这些都在13.2.0文档中详细描述。

js 13.1.0 &下面

那些仍在使用旧版本Node的人可能想要尝试[esm][3]模块加载器,这是Node.js ES模块规范的生产就绪实现:

node -r esm main.js

详细的更新…

2019年4月23日

最近发布了一份改变ECMAScript模块检测方式的PR: https://github.com/nodejs/node/pull/26745 < / p >

它仍然位于--experimental-modules标志后面,但是模块加载的方式发生了重大变化:

  • package.type,可以是modulecommonjs
      <李> type: "commonjs":
      • .js被解析为CommonJS
      • 默认的没有扩展的入口点是CommonJS
      <李> type: "module":
      • .js被解析为ECMAScript模块
      • 默认情况下不支持加载JSON或本地模块
      • 没有扩展的默认入口点是ECMAScript模块
  • --type=[mode]让你设置入口点的类型。将覆盖package.type作为入口点。
  • 一个新的文件扩展名.cjs
    • 这是专门用于支持以module模式导入CommonJS。
    • 这只是在ECMAScript模块加载器中,CommonJS加载器保持不变,但如果你使用完整的文件路径,扩展将在旧的加载器中工作。
  • <李> --es-module-specifier-resolution=[type]
    • 选项是explicit(默认值)和node
    • 默认情况下,我们的加载器不允许在导入中使用可选的扩展,模块的路径必须包含该扩展(如果有的话)
    • 默认情况下,加载器不允许导入有索引文件的目录
    • 开发人员可以使用--es-module-specifier-resolution=node来启用CommonJS说明符解析算法
    • 这不是一个“特性”,而是一个用于实验的实现。预计在移除该标志之前会发生变化
    <李> --experimental-json-loader
    • "type": "module"时导入JSON的唯一方法
    • 当启用时,所有import 'thing.json'将独立于模式通过实验加载器
    • 基于whatwg / html # 4315
  • 你可以使用package.main来设置模块的入口点
    • main中使用的文件扩展名将基于模块的类型进行解析

2019年1月17日

node . js 11.6.0仍然将ES模块列为实验模块,后面有一个标志。

9月13日

node . js 8.5.0已经发布,支持标志后面的mjs文件:

node --experimental-modules index.mjs

这样做的计划是删除v10.0 LTS发行版的标志。

——过时的信息。保存在这里是为了历史目的

2017年9月8日

Node.js主分支已经更新,初始支持ESM模块: https://github.com/nodejs/node/commit/c8a389e19f172edbada83f59944cad7cc802d9d5 < / p >

这应该在最近的夜间可用(这可以是通过NVM安装,与您现有的安装一起运行): https://nodejs.org/download/nightly/ < / p >

并在--experimental-modules标志后面启用:

package.json

{
"name": "testing-mjs",
"version": "1.0.0",
"description": "",
"main": "index.mjs" <-- Set this to be an mjs file
}

然后运行:

node --experimental-modules .

2017年2月:

一个关于Node.js中ES6模块的更新

Node.js的家伙们已经决定最不坏解决方案是使用.mjs文件扩展名。从中得出的结论是:

换句话说,给定两个文件foo.jsbar.mjs,使用import * from 'foo'会将foo.js视为CommonJS,而import * from 'bar' . js则会将foo.js视为CommonJS 将bar.mjs作为ES6模块

至于时间线……

在当前时间点,仍然有一些 ES6需要解决的规范和实现问题 和虚拟机方面的东西,在Node.js开始之前 构建ES6模块的可支持实现。工作开始了 进展,但需要一些时间-我们目前正在寻找 在大约一年至少.

2016年10月:

Node.js的一位开发人员最近参加了一个TC-39会议,并写了一篇关于为Node.js实现拦截器的精彩文章:

Node.js, TC-39, and Modules .js

基本的结论是:

  • ECMAScript模块被静态分析,CommonJS被评估
  • CommonJS模块允许猴子补丁导出,ECMAScript模块目前不允许
  • 如果没有某种形式的用户输入,很难检测出什么是ECMAScript模块,什么是CommonJS,但他们正在尝试。
  • *.mjs似乎是最有可能的解决方案,除非他们可以在没有用户输入的情况下准确检测ECMAScript模块

——原答案——

这是个烫手山芋已经有一段时间了。底线是,是的,Node.js最终将支持ES2015语法来导入/导出模块——很可能是在装载模块规范最终确定并达成一致时。

这里是nodejs运行的一个很好的概述。本质上,他们需要确保新规范适用于Node.js(主要是有条件的、同步加载的)和HTML(主要是异步加载的)。

目前没有人知道确切的答案,但我想Node.js将支持静态加载的import/export,以及用于动态加载的新的System.import——同时仍然保留遗留代码的require

以下是Node如何实现这一目标的一些建议: