模块加载器


【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 文本文件。
  • 它不能用于加载 ECMAScript 模块(尽管可以 从 CommonJS 模块加载 ECMAScript 模块)。当用它来加载不是 ECMAScript 模块的 JavaScript 文本文件时,它会将其作为 CommonJS 模块加载。

有 ECMAScript 模块加载器:

【There is the ECMAScript module loader:】

  • 它是异步的。
  • 它负责处理 import 语句和 import() 表达式。
  • 它不能被猴子补丁,但可以使用 加载器钩子 进行自定义。
  • 它不支持将文件夹作为模块,目录索引(例如 './startup/index.js')必须完整指定。
  • 它不进行扩展名搜索。当指定的文件 URL 是相对或绝对路径时,必须提供文件扩展名。
  • 它可以加载 JSON 模块,但需要导入断言。
  • 它只接受 .js.mjs.cjs 扩展名的 JavaScript 文本文件。
  • 它可以用于加载 JavaScript CommonJS 模块。此类模块会通过 cjs-module-lexer 进行处理,以尝试识别命名导出,如果可以通过静态分析确定,则可以使用这些导出。导入的 CommonJS 模块会将其 URL 转换为绝对路径,然后通过 CommonJS 模块加载器进行加载。