我一直在互联网上寻找有关此问题的明确答案。
当前,NodeJS仅使用CommonJS语法来加载模块,如果您真的想使用标准的ES2015模块语法,则必须事先对其进行转换,或者在运行时使用外部模块加载器。
目前,我不太愿意使用这两种方法,NodeJS维护人员是否计划支持ES2015模块?我完全没有发现任何提示。
目前,NodeJS 6.x声称支持96%的ES2015功能,但没有任何模块参考(NodeJS ES2105支持链接)。
您是否知道在不久的将来NodeJS是否会立即支持这些模块?
节点13.2.0及以上
NodeJS 13.2.0现在支持不带标志的ES模块🎉但是,该实现仍被标记为实验性的,因此在生产中使用时应谨慎。
要在13.2.0中启用ESM支持,请将以下内容添加到您的package.json:
package.json
{ "type": "module" }
所有.js,.mjs(或不带扩展名的文件)将被视为ESM。
.js
.mjs
除了整个package.json选择加入之外,还有许多其他选项,有关详细信息,请参见13.2.0的文档。
节点13.1.0及以下
那些仍在使用旧版本Node的用户可能想尝试esm模块加载器,这是NodeJS ES模块规范的生产就绪型实现:
node -r esm main.js
详细更新…
2019年4月23日
最近降落的PR更改了检测ES模块的方式:https : //github.com/nodejs/node/pull/26745
它仍然落后--experimental-modules,但是模块的加载方式发生了重大变化:
--experimental-modules
package.type
module
commonjs
type: "commonjs"
type: "module"
--type=[mode]
.cjs
--es-module-specifier-resolution=[type]
explicit
node
--es-module-specifier-resolution=node
--experimental-json-loader
"type": "module"
import 'thing.json'
package.main
2019年1月17日
节点11.6.0仍在标志后面将ES模块列为实验模块。
2017年9月13日
NodeJS 8.5.0已发布,在标志后面支持mjs文件:
node --experimental-modules index.mjs
计划是删除v10.0 LTS版本的标志。
-过时的信息。 出于历史目的保留在这里
2017年9月8日
并在--experimental-modules标志后面启用:
{ "name": "testing-mjs", "version": "1.0.0", "description": "", "main": "index.mjs" <-- Set this to be an mjs file }
然后运行:
node --experimental-modules .
2017年2月:
https://medium.com/@jasnell/an-update-on-es6-modules-in-node- js-42c958b890c#.6ye7mtn37
NodeJS伙计们认为 最糟糕的 解决方案是使用.mjs文件扩展名。得出的结论是:
换句话说,给定两个文件foo.js和bar.mjs,using import * from 'foo'将被foo.js视为CommonJS,而import * from 'bar' 将被bar.mjs视为ES6模块
foo.js
bar.mjs
import * from 'foo'
import * from 'bar'
至于时间表…
在当前时间点上,在Node.js甚至开始研究可支持的ES6模块实现之前,ES6和虚拟机方面仍需要解决许多规范和实现问题。工作正在进行中,但将需要一些时间- 我们目前 至少 需要一年左右的时间。
2016年10月:
Node.JS的开发人员之一最近参加了TC-39会议,并撰写了一篇关于实现Node.JS的阻止程序的绝妙文章:
https://hackernoon.com/node-js-tc-39-and- modules-a1118aecf95e
基本的收获是:
*.mjs
-原始答案-
这已经很长时间了。最重要的是,是的,Node最终将支持导入/导出模块的ES2015语法- 最有可能在最终确定并同意加载模块的规范时。
这是对 NodeJS保持良好状态的一个很好的概述。本质上,他们需要确保新规范适用于Node(主要是有条件的,同步加载)以及HTML(主要是异步)。
现在还没有人知道,但是我想Node可以支持import/export静态加载,除了可以System.import动态加载的新功能外,还可以保留require旧代码。
import/export
System.import
require
以下是一些有关Node如何实现此目标的建议: