首页 > 解决方案 > Node.js 如何在自己的内部实现 require()?

问题描述

在浏览 Node.js 的 GitHub 存储库中的源代码时require(),我对一件事感到惊讶和困惑:

实际定义逻辑的loader.js文件本身使用调用。require()require()

这怎么可能?

Node.js 内部使用的调用是否还有其他代码require(),例如require()loader.js 文件中使用的所有调用。

我知道require()我在给定编辑器中编写的 Node.js 程序中的所有调用,在我的机器上,都是使用Module.prototype.requireloader.js 中声明的方法解决的。

标签: node.js

解决方案


看起来实际的基础是在这里require定义的,在. 此行使用 [ in 。再次使用which 定义如下:/internal/bootstrap/loaders.jscompileFunction][3]/lib/vm.js_compileFunction

const {
  ContextifyScript,
  MicrotaskQueue,
  makeContext,
  isContext: _isContext,
  constants,
  compileFunction: _compileFunction,
  measureMemory: _measureMemory,
} = internalBinding('contextify');

如果我们回到/internal/bootstrap/loaders.js,它的定义如下:

let internalBinding;
{
  const bindingObj = ObjectCreate(null);
  // eslint-disable-next-line no-global-assign
  internalBinding = function internalBinding(module) {
    let mod = bindingObj[module];
    if (typeof mod !== 'object') {
      mod = bindingObj[module] = getInternalBinding(module);
      ArrayPrototypePush(moduleLoadList, `Internal Binding ${module}`);
    }
    return mod;
  };
}

getInternalBinding我们在该文件的顶部找到了这条评论:

// This file is compiled as if it's wrapped in a function with arguments
// passed by node::RunBootstrapping()
/* global process, getLinkedBinding, getInternalBinding, primordials */

至此,我们的游览画上了圆满的句号。require()所以是的,在定义的 inloader.js和实际的 C 绑定之间仍然存在一些代码。至于C-land会发生什么,我自己也不确定。


推荐阅读