load(url, context, nextLoad)


稳定性: 1.2 - 发布候选版

load 钩子提供了一种定义自定义方法的方法,用于确定 URL 应该如何被解释、获取和解析。它还负责验证导入断言。

🌐 The load hook provides a way to define a custom method of determining how a URL should be interpreted, retrieved, and parsed. It is also in charge of validating the import assertion.

format 的最终值必须是以下之一:

🌐 The final value of format must be one of the following:

format描述load 返回的 source 可接受类型
'builtin'加载 Node.js 内置模块不适用
'commonjs'加载 Node.js CommonJS 模块不适用
'json'加载 JSON 文件{ string, ArrayBuffer, TypedArray }
'module'加载 ES 模块{ string, ArrayBuffer, TypedArray }
'wasm'加载 WebAssembly 模块{ ArrayBuffer, TypedArray }

source 的值会被忽略,类型为 'builtin',因为目前无法替换 Node.js 内置(核心)模块的值。类型为 'commonjs' 时,source 的值也会被忽略,因为 CommonJS 模块加载器不提供让 ES 模块加载器覆盖 CommonJS 模块返回值 的机制。这个限制在未来可能会被克服。

🌐 The value of source is ignored for type 'builtin' because currently it is not possible to replace the value of a Node.js builtin (core) module. The value of source is ignored for type 'commonjs' because the CommonJS module loader does not provide a mechanism for the ES module loader to override the CommonJS module return value. This limitation might be overcome in the future.

警告:ESM 的 load 钩子与来自 CommonJS 模块的命名导出不兼容。尝试将它们一起使用将导致从导入中得到一个空对象。未来可能会解决这个问题。

这些类型都对应于 ECMAScript 中定义的类。

如果基于文本的格式(即 'json''module')的源值不是字符串,它将使用 util.TextDecoder 转换为字符串。

🌐 If the source value of a text-based format (i.e., 'json', 'module') is not a string, it is converted to a string using util.TextDecoder.

load 钩子提供了一种方式来定义用于获取已解析 URL 源代码的自定义方法。这允许加载器在潜在情况下避免从磁盘读取文件。它也可以用于将无法识别的格式映射为受支持的格式,例如将 yaml 映射为 module

🌐 The load hook provides a way to define a custom method for retrieving the source code of a resolved URL. This would allow a loader to potentially avoid reading files from disk. It could also be used to map an unrecognized format to a supported one, for example yaml to module.

export async function load(url, context, nextLoad) {
  const { format } = context;

  if (Math.random() > 0.5) { // Some condition
    /*
      For some or all URLs, do some custom logic for retrieving the source.
      Always return an object of the form {
        format: <string>,
        source: <string|buffer>,
      }.
    */
    return {
      format,
      shortCircuit: true,
      source: '...',
    };
  }

  // Defer to the next hook in the chain.
  return nextLoad(url);
} 

在更高级的场景中,这也可以用来将不受支持的源转换为受支持的源(见下方示例)。

🌐 In a more advanced scenario, this can also be used to transform an unsupported source to a supported one (see Examples below).