跳到主要内容
CNode

Node 引入 ESM 新方案

分享
Ooliyg发布于 8 年前最后回复 8 年前
245760

administration-articles-bank-261949.jpg

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 模式来加载。

参考:

JS 菌公众账号

请关注我的订阅号,不定期推送有关 JS 的技术文章,只谈技术不谈八卦 😊

查看回复

回复 (2)

Y
yuu2lee4#28 年前

可以

I
itshizhan#18 年前

这个赞👍

参与回复

登录后即可参与回复。登录