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"
:
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.js
和bar.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如何实现这一点的一些建议: