模块加载器
【Modules loaders】
Node.js 有两个系统用于解析说明符和加载模块。
【Node.js has two systems for resolving a specifier and loading modules.】
有 CommonJS 模块加载器:
【There is the CommonJS module loader:】
- 它是完全同步的。
- 它负责处理
require()调用。 - 它可以被动态修改。
- 它支持将文件夹作为模块。
- 在解析指定符时,如果没有找到完全匹配项,它会尝试添加扩展名(
.js、.json,最后是.node),然后尝试解析 将文件夹作为模块。 - 它将
.json视为 JSON 文本文件。 .node文件被解释为通过process.dlopen()加载的已编译的插件模块。- 它将所有缺少
.json或.node扩展名的文件视为 JavaScript 文本文件。 - 只有在模块图是同步的(不包含顶层
await)时,它才能用于 从 CommonJS 模块加载 ECMAScript 模块。当用于加载不是 ECMAScript 模块的 JavaScript 文本文件时,该文件将作为 CommonJS 模块加载。
有 ECMAScript 模块加载器:
【There is the ECMAScript module loader:】
- 它是异步的,除非它被用来加载
require()的模块。 - 它负责处理
import语句和import()表达式。 - 它不能被猴子补丁,但可以使用 加载器钩子 进行自定义。
- 它不支持将文件夹作为模块,目录索引(例如
'./startup/index.js')必须完整指定。 - 它不进行扩展名搜索。当指定的文件 URL 是相对或绝对路径时,必须提供文件扩展名。
- 它可以加载 JSON 模块,但需要导入断言。
- 它只接受
.js、.mjs和.cjs扩展名的 JavaScript 文本文件。 - 它可以用于加载 JavaScript CommonJS 模块。此类模块会通过
cjs-module-lexer进行处理,以尝试识别命名导出,如果可以通过静态分析确定,则可以使用这些导出。导入的 CommonJS 模块会将其 URL 转换为绝对路径,然后通过 CommonJS 模块加载器进行加载。