我在互联网上找遍了,没有一个明确的答案.

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

目前我不太确定这两种方法中的任何一种,都是 node .js维护人员是否计划支持ECMAScript 2015模块?关于这件事,我还没有找到任何线索.

此刻.js 6.x声称支持96%的ECMAScript 2015功能,但没有提到模块(Node.js ECMAScript 2015 support link).

您知道Node.js在不久的将来是否会支持这些开箱即用的模块吗?

推荐答案

Node.js 13.2.0 & Above

Node.js 13.2.0现在支持不带标志的ES模块?. 然而,该实现仍被标记为实验性的,因此在生产中使用时要谨慎.

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

{
  "type": "module"
}

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

除了整个package.json Select 加入之外,还有许多不同的 Select ,所有这些都在documentation for 13.2.0中详细介绍.

Node.js 13.1.0 & Below

那些仍在使用旧版本Node的用户可能希望try [esm][3]模块加载器,它是用于Node.js的ES模块规范的生产就绪实现:

node -r esm main.js

Detailed Updates...

23 April 2019

最近登陆的PR更改了检测ECMAScript模块的方式: https://github.com/nodejs/node/pull/26745

它仍然落后于--experimental-modules标志,但模块加载方式有重大变化:

  • package.type which can be either module or commonjs
    • type: "commonjs":
      • .js被解析为CommonJS
      • 没有扩展名的入口点默认为CommonJS
    • type: "module":
      • .js被解析为ECMAScript模块
      • 默认情况下不支持加载JSON或native module
      • 没有扩展名的入口点的默认值是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设置模块的入口点

17 January 2019

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

13 September 2017

Node.js 8.5.0已经发布,支持在一个标志后面的mjs文件:

node --experimental-modules index.mjs

计划是删除v10的标志.0 LTS发布.

--Outdated Information. Kept here for historical purposes--

8 September 2017

node .js master branch已更新,初步支持ESM模块:

这应该是最新的夜间版本(可以是installed via nvm,与现有安装一起运行):

并在--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 .

February 2017:

100

node .js的人已经决定least bad解决方案是使用.mjs文件扩展名.这样做的好处是:

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

至于时间表...

在目前的时间点上,仍然有一些

October 2016:

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

100

由此得出的基本结论是:

  • 对ECMAScript模块进行静态分析,并对CommonJS进行判断
  • CommonJS模块允许猴子补丁导出,而ECMAScript模块目前不允许
  • 如果没有某种形式的用户输入,很难检测出什么是ECMAScript模块,什么是CommonJS,但他们正在try .
  • *.mjs似乎是最有可能的解决方案,除非他们能够在无需用户输入的情况下准确检测ECMAScript模块

-- Original Answer --

这是一个棘手的问题已经有相当一段时间了.底线是,是的, node .js最终将支持导入/导出模块的ES2015种语法——最有可能的情况是specification for loading modules最终确定并达成一致.

这是a good overview个正在等待的 node .快点.本质上,他们需要确保新规范适用于 node .js主要是条件加载、同步加载,HTML主要是异步加载.

目前还没有人确切地知道,但是我想Node.js将会支持静电加载,除了新的System.import支持动态加载--同时仍然保留require用于遗留代码.

以下是关于Node如何实现这一点的一些建议:

Javascript相关问答推荐

HTML/JavaScript函数未执行

我应该在redux reducer中调用其他reducer函数吗?

Google图表时间轴—更改hAxis文本 colored颜色

. NET中Unix时间转换为日期时间的奇怪行为

D3 Scale在v6中工作,但在v7中不工作

在我的html表单中的用户输入没有被传送到我的google表单中

如何在JavaScript文件中使用Json文件

更新动态数据中对象或数组中的所有值字符串

连接到游戏的玩家不会在浏览器在线游戏中呈现

如何在不影响隐式类型的情况下将类型分配给对象?

使用带有HostBinding的Angular 信号来更新样式?

Reaction Redux&Quot;在派单错误中检测到状态Mutations

在SHINY R中的嵌套模块中,不能使用Java代码

如何防止ionic 输入中的特殊字符.?

在Odoo中如何以编程方式在POS中添加产品

如何为仅有数据可用的点显示X轴标签?

如何在独立的Angular 应用程序中添加Lucide-Angel?

如何在TransformControls模式下只保留箭头进行翻译?

如何使用Reaction路由导航测试挂钩?

在高位图中显示每个y轴系列的多个值