我一直在寻找互联网上没有明确答案。
目前NodeJS仅使用CommonJS语法来加载模块,如果您真的想使用标准的ES2015模块语法,您必须事先将其转换或在运行时使用外部模块加载器。
目前我不太喜欢使用这两种方法,NodeJS维护者是否计划支持ES2015模块? 我还没有找到关于此的暗示。
目前NodeJS 6.x声称支持96%的ES2015功能,但没有任何模块参考(NodeJS ES2105 support link)。
您知道NodeJS是否会在不久的将来支持这些模块?
答案 0 :(得分:283)
<强> TL;博士强>
Latest NodeJS仍然将ES模块列为实验性的,在标志后面。
那些寻找问题解决方案的人可能想尝试esm模块加载器,这是ESJ模块规范NodeJS的生产就绪实现:
node -r esm main.js
详细更新...
2019年4月23日
PR最近登陆以改变检测ES模块的方式: https://github.com/nodejs/node/pull/26745
它仍然位于--experimental-modules
标志之后,但模块的加载方式有重大变化:
package.type
,可以是module
或commonjs
type: "commonjs"
:.js
被解析为commonjs type: "module":
.js
被解析为esm --type=[mode]
让您在入口点设置类型。将覆盖package.type
作为入口点。.cjs
。
module
模式导入commonjs。--es-module-specifier-resolution=[type]
explicit
(默认)和node
--es-module-specifier-resolution=node
启用commonjs说明符解析算法--experimental-json-loader
"type": "module"
import 'thing.json'
将独立于模式package.main
设置模块的入口点
2019年1月17日
Node 11.6.0仍然将ES模块列为实验性的,在标志后面。
2017年9月13日
NodeJS 8.5.0已发布,支持标志后面的mjs文件:
node --experimental-modules index.mjs
此计划是删除v10.0 LTS版本的标志。
- 过时的信息。为了历史目的而留在这里 -
2017年9月8日
NodeJS主分支已更新,初始支持ESM模块:
https://github.com/nodejs/node/commit/c8a389e19f172edbada83f59944cad7cc802d9d5
这应该在最晚的夜间提供(可以installed via nvm与您现有的安装一起运行):
https://nodejs.org/download/nightly/
在--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月:
https://medium.com/@jasnell/an-update-on-es6-modules-in-node-js-42c958b890c#.6ye7mtn37
NodeJS的人已经确定最不好的解决方案是使用.mjs
文件扩展名。从中可以看出:
换句话说,给定两个文件
foo.js
和bar.mjs
,使用import * from 'foo'
会将foo.js
视为CommonJSimport * from 'bar'
将bar.mjs
视为ES6模块
至于时间表......
目前,还有很多 需要在ES6上发生的规范和实现问题 Node.js之前的事物和虚拟机方面甚至可以开始 开发可支持的ES6模块实现。工作在 进展但是需要一些时间 - 我们正在寻找 大约一年至少。
2016年10月:
Node.JS上的一位开发人员最近参加了一次TC-39会议,并撰写了一篇关于拦截器的精彩文章,以实现Node.JS:
https://hackernoon.com/node-js-tc-39-and-modules-a1118aecf95e
基本的结论是:
*.mjs
似乎是最有可能的解决方案,除非他们能够在没有用户输入的情况下准确检测ES模块- 原始答案 -
这已经是一段时间了。最重要的是,Node最终将支持用于导入/导出模块的ES2015语法 - 最有可能在spec for loading modules最终确定并达成一致时。
以下是a good overview举起NodeJS的内容。从本质上讲,他们需要确保新规范适用于Node,主要是条件,同步加载以及主要是异步的HTML。
现在没有人确切知道,但我想Node除了支持动态加载import/export
之外还支持静态加载System.import
,同时仍保留遗留代码的require
以下是有关Node如何实现此目标的一些建议: