2019年3月29日目前,Node 对 ES6 Module 的支持又有新进展。一个新的 PR 更新了当前 --experimental-modules
的实现方案。
type 动态判断模块加载模式
更新后的方案将根据 package.json
文件中指定的 type 值来判断 js 文件是使用 ESM 还是 commonjs
- 如果 type 的值为 module 那么 js 文件将被作为 ESM 加载
- 如果 type 的值为 commonjs 那么 js 文件将被作为 commonjs 来加载
好处就是不需要使用 .mjs
这种与传统 js 扩展名不同的写法
使用 flag 指定入口文件模块加载模式
更新后的方案允许开发者使用 --entry-type=type
的方式来指定入口文件的解析方式,判断行为与 package.json
的 type 一致
支持新的扩展名 .cjs
新的扩展名 .cjs
表示在 module 模式的加载环境下去使用 commonjs 来加载扩展名为 .cjs
的模块
模块加载方式有所改变
新的 flag:--es-module-specifier-resolution=[type]
的默认值是 explicit
,和可选值 node
,在默认值的情况下引入模块时必须书写扩展名。
This implies that ./x will only ever import exactly the sibling file “x” without appending paths or extensions. “x” is never resolved to x.mjs or x/index.mjs (or the .js equivalents).
比方说这里加载
./x
模块,那么默认情况下只会加载名为x
的模块,而不是去尝试加载x.mjs
或x/index.mjs
提案在此:https://github.com/GeoffreyBooth/node-import-file-specifier-resolution-proposal#proposal
在 ESM 模式下加载 json 文件
--experimental-json-loader
flag 能够在 ESM 模式下加载 JSON 文件。
导入的 json 文件将提供的 json 文件中的内容转化为一个对象或数组。就好像直接通过 JSON 模块 parse 了一样。
main 根据 type 的值确认入口文件加载模式
在 package.json
文件中的 main 字段指定入口文件,根据 type 字段来指定是 commonjs 还是 ESM 模式来加载。
参考:
- https://github.com/nodejs/node/pull/26745/commits/b1094dbe19f31f7a69ad16d193748f610b159073
- https://github.com/GeoffreyBooth/node-import-file-specifier-resolution-proposal#proposal
请关注我的订阅号,不定期推送有关 JS 的技术文章,只谈技术不谈八卦 😊
这个赞👍
可以