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

时间:2016-05-10 07:34:21

标签: javascript node.js module ecmascript-6 es6-modules

我一直在寻找互联网上没有明确答案。

目前NodeJS仅使用CommonJS语法来加载模块,如果您真的想使用标准的ES2015模块语法,您必须事先将其转换或在运行时使用外部模块加载器。

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

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

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

1 个答案:

答案 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,可以是modulecommonjs
    • type: "commonjs"
    • .js被解析为commonjs
    • 没有扩展名的入口点的默认值为commonjs
    • type: "module":
    • .js被解析为esm
    • 默认情况下不支持加载JSON或Native Module
    • 没有扩展名的入口点的默认值为esm
  • --type=[mode]让您在入口点设置类型。将覆盖package.type作为入口点。
  • 新文件扩展名.cjs
    • 这是专门用于支持以module模式导入commonjs。
    • 这只是在esm加载器中,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设置模块的入口点
    • 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.jsbar.mjs,使用import * from 'foo'会将foo.js视为CommonJS import * 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

基本的结论是:

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

- 原始答案 -

这已经是一段时间了。最重要的是,Node最终将支持用于导入/导出模块的ES2015语法 - 最有可能在spec for loading modules最终确定并达成一致时。

以下是a good overview举起NodeJS的内容。从本质上讲,他们需要确保新规范适用于Node,主要是条件,同步加载以及主要是异步的HTML。

现在没有人确切知道,但我想Node除了支持动态加载import/export之外还支持静态加载System.import,同时仍保留遗留代码的require

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