Node.js 13.2.0 及以上
Node.js 13.2.0现在支持没有标志的 ES module 🎉。但是,该实现仍标记为实验性,因此在生产中谨慎使用。
要在 13.2.0 中启用 ECMAScript module (ESM) 支持,请将以下内容添加到您的package.json
:
{
"type": "module"
}
所有.js
, .mjs
(或没有扩展名的文件)都将被视为 ESM。
除了完全package.json
选择加入之外,还有许多不同的选项,所有这些都在13.2.0的文档中进行了详细说明。
Node.js 13.1.0 及以下
那些仍在使用旧版本 Node 的人可能想尝试[esm][3]
module加载器,它是 Node.js 的 ES module规范的生产就绪实现:
node -r esm main.js
详细更新...
2019 年 4 月 23 日
一个 PR 最近登陆以改变检测 ECMAScript module的方式:https :
//github.com/nodejs/node/pull/26745
它仍然落后于--experimental-modules
标志,但在加载module的方式上有重大变化:
package.type
可以是module
或commonjs
type: "commonjs"
:
type: "module"
:
.js
被解析为 ECMAScript module
- 默认不支持加载 JSON 或原生module
- 没有扩展名的入口点的默认值是 ECMAScript module
--type=[mode]
让您在入口点设置类型。将覆盖package.type
入口点。
- 一个新的文件扩展名
.cjs
。
- 这是专门支持在
module
模式下导入CommonJS的。
- 这仅在 ECMAScript module加载器中,CommonJS 加载器保持不变,但如果您使用完整文件路径,扩展将在旧加载器中工作。
--es-module-specifier-resolution=[type]
- 选项是
explicit
(默认)和node
- 默认情况下,我们的加载程序不允许导入中的可选扩展,如果有一个module的路径必须包含扩展
- 默认情况下,我们的加载程序不允许导入具有索引文件的目录
- 开发人员可以使用
--es-module-specifier-resolution=node
来启用 CommonJS 说明符解析算法
- 这不是“功能”,而是用于实验的实现。预计在标志被移除之前会发生变化
--experimental-json-loader
- 导入 JSON 的唯一方法
"type": "module"
- 当启用所有
import 'thing.json'
将通过独立于模式的实验加载器
- 基于whatwg/html#4315
- 您可以使用
package.main
来设置module的入口点
- main 中使用的文件扩展名将根据module的类型进行解析
2019 年 1 月 17 日
Node.js 11.6.0仍然将 ES Modules 列为实验性的,在一个标志后面。
2017 年 9 月 13 日
Node.js 8.5.0已发布,支持在标志后面的 mjs 文件:
node --experimental-modules index.mjs
这样做的计划是删除 v10.0 LTS 版本的标志。
——过时的信息。留在这里是为了历史目的——
2017 年 9 月 8 日
Node.js 主分支已更新,初步支持 ESM module:https :
//github.com/nodejs/node/commit/c8a389e19f172edbada83f59944cad7cc802d9d5
这应该在最新的每晚可用(这可以通过 nvm 安装以与现有安装一起运行):https :
//nodejs.org/download/nightly/
并在--experimental-modules
标志后面启用:
包.json
{
"name": "testing-mjs",
"version": "1.0.0",
"description": "",
"main": "index.mjs" <-- Set this to be an mjs file
}
然后运行:
node --experimental-modules .
2017 年 2 月:
Node.js 中 ES6 module的更新
Node.js 人员已经决定,最不坏的解决方案是使用.mjs
文件扩展名。从中得出的结论是:
换句话说,给定两个文件foo.js
and bar.mjs
, usingimport * from 'foo'
将foo.js
视为 CommonJS 而import * from 'bar'
将bar.mjs
视为 ES6 Module
至于时间线...
目前,在 Node.js 甚至可以开始研究 ES6 module的可支持实现之前,ES6 和虚拟机方面仍有许多规范和实现问题需要解决。工作正在进行中,但需要一些时间——我们目前至少在一年左右。
2016 年 10 月:
Node.js 的一位开发人员最近参加了 TC-39 会议,并写了一篇关于 Node.js 实现的阻塞器的精彩文章:
Node.js、TC-39 和module
基本的结论是:
- ECMAScript module被静态分析,CommonJS 被评估
- CommonJS module允许猴子补丁导出,而 ECMAScript module目前不支持
- 如果没有某种形式的用户输入,很难检测什么是 ECMAScript module,什么是 CommonJS,但他们正在尝试。
*.mjs
似乎是最有可能的解决方案,除非他们可以在没有用户输入的情况下准确地检测到 ECMAScript module
——原答案——
一段时间以来,这一直是一个烫手山芋。底线是,是的,Node.js 最终将支持ES2015导入/导出module的语法——最有可能是在最终确定并商定加载module的规范时。
这里很好地概述了是什么阻碍了 Node.js。本质上,他们需要确保新规范适用于 Node.js,Node.js 主要是有条件的同步加载,也适用于主要是异步的 HTML。
现在没有人确切知道,但我想 Node.js 将支持import/export
静态加载,除了新System.import
的动态加载 - 同时仍然保留require
遗留代码。
下面是一些关于 Node 如何实现这一目标的建议: