NodeJS计划支持导入/导出es6(es2015)模块

Zor*_*one 264 javascript module node.js ecmascript-6 es6-modules

我一直在寻找互联网,没有明确的答案.

目前使用的NodeJS只CommonJS的语法来加载模块,如果你真的想使用标准ES2015模块语法,你要么必须事先transpile,或在运行时使用外部模块加载.

目前我不太喜欢使用这两种方法,NodeJS维护者是否计划支持ES2015模块?我还没有找到关于此的暗示.

目前NodeJS 6.x声称支持96%的ES2015功能,但没有任何模块参考(NodeJS ES2105支持链接).

你知道NodeJS是否会在不久的将来支持这些模块?

Cod*_*gue 290

2019年1月17日更新

节点11.6.0仍然将ES模块列为实验,在标志后面.

那些寻找问题解决方案的人可能想尝试使用esm模块加载器,这是ESJ模块规范NodeJS的生产就绪实现:

node -r esm main.js
Run Code Online (Sandbox Code Playgroud)

2017年9月13日更新

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

node --experimental-modules index.mjs
Run Code Online (Sandbox Code Playgroud)

计划是删除v10.0 LTS版本的标志.

2017年9月8日更新

NodeJS主分支已更新,初始支持ESM模块:https:
//github.com/nodejs/node/commit/c8a389e19f172edbada83f59944cad7cc802d9d5

这应该是最新的每晚(这可以通过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
}
Run Code Online (Sandbox Code Playgroud)

然后运行:

node --experimental-modules .
Run Code Online (Sandbox Code Playgroud)

- 过时的信息.为了历史目的而留在这里 -

2017年2月更新:

https://medium.com/@jasnell/an-update-on-es6-modules-in-node-js-42c958b890c#.6ye7mtn37

NodeJS的人已经确定最不好的解决方案是使用package.type文件扩展名.从中得到的结论是:

换句话说,考虑到两个文件modulecommonjs使用type: "commonjs"将视.js作为CommonJS的同时,type: "module": 将把.js作为ES6模块

至于时间表......

在当前时间点,在Node.js甚至可以开始构建可支持的ES6模块实现之前,仍然需要在ES6和虚拟机方面发生许多规范和实现问题.工作正在进行中,但需要一些时间 - 我们目前至少要看一年左右.

2016年10月更新:

Node.JS上的一位开发人员最近参加了一次TC-39会议,并撰写了一篇关于阻截者的精彩文章来实现Node.JS:

https://hackernoon.com/node-js-tc-39-and-modules-a1118aecf95e

从中得出的基本结论是:

  • ES模块进行静态分析,评估CommonJS
  • CommonJS模块允许猴子修补导出,ES模块目前不允许
  • 如果没有某种形式的用户输入,很难检测出什么是ES模块和什么是CommonJS,但他们正在尝试.
  • --type=[mode] 似乎是最可能的解决方案,除非他们能够在没有用户输入的情况下准确检测ES模块

- 原始答案 -

这已经是一段时间的烫手山芋.最重要的是,Node最终将支持用于导入/导出模块的ES2015语法 - 最有可能在加载模块规范最终确定并达成一致时.

以下是 NodeJS的持有情况的一个很好的概述.从本质上讲,他们需要确保新规范适用于Node,主要是条件,同步加载以及主要是异步的HTML.

现在没有人确切知道,但我想Node package.type除了.cjs动态加载的新功能外还支持静态加载 - 同时仍然保留module遗留代码.

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

  • 关于`.mjs`扩展名:`我们在过去亲切地称这些"Michael Jackson Script"文件.万一你在JS谈话中听到有人在谈论流行艺术家. (35认同)
  • 我不明白为什么更改导入语法是不够的。一种用于导入 es(“正确”)的语法和一种用于导入 cjs 的语法?换句话说,给定两个文件 foo.js 和 bar.js ,`import * from 'foo'` 会将 foo.js 视为 CommonJS `import * as bar from 'bar'` 会将 bar.js 视为 ES6 Module 可以有人解释吗? (2认同)