异步自定义钩子的注意事项


🌐 Caveats of asynchronous customization hooks

异步自定义钩子有许多注意事项,并且不确定它们的问题是否可以解决。建议用户改为通过 module.registerHooks() 使用同步自定义钩子,以避免这些注意事项。

🌐 The asynchronous customization hooks have many caveats and it is uncertain if their issues can be resolved. Users are encouraged to use the synchronous customization hooks via module.registerHooks() instead to avoid these caveats.

  • 异步钩子在单独的线程上运行,因此钩子函数不能直接修改正在自定义的模块的全局状态。通常使用消息通道和原子操作在两者之间传递数据或影响控制流。参见 与异步模块自定义钩子通信
  • 异步钩子不会影响模块图中所有的 require() 调用。
    • 使用 module.createRequire() 创建的自定义 require 函数不受影响。
    • 如果异步 load 钩子没有覆盖通过它的 CommonJS 模块的 source,那么由这些 CommonJS 模块通过内置的 require() 加载的子模块也不会受到异步钩子的影响。
  • 在自定义 CommonJS 模块时,异步钩子需要处理几个注意事项。详见 异步 resolve 钩子异步 load 钩子
  • 当 CommonJS 模块内部的 require() 调用被异步钩子自定义时,Node.js 可能需要多次加载 CommonJS 模块的源代码,以保持与现有 CommonJS monkey-patching 的兼容性。如果模块代码在多次加载之间发生变化,可能会导致意想不到的行为。
    • 作为副作用,如果同时注册了异步钩子和同步钩子,并且异步钩子选择自定义 CommonJS 模块,则同步钩子可能会对该 CommonJS 模块中的 require() 调用被多次调用。