node.js - Node.js 如何在自己的内部实现 require()?
问题描述
在浏览 Node.js 的 GitHub 存储库中的源代码时require()
,我对一件事感到惊讶和困惑:
实际定义逻辑的loader.js文件本身使用调用。require()
require()
这怎么可能?
Node.js 内部使用的调用是否还有其他代码require()
,例如require()
loader.js 文件中使用的所有调用。
我知道require()
我在给定编辑器中编写的 Node.js 程序中的所有调用,在我的机器上,都是使用Module.prototype.require
loader.js 中声明的方法解决的。
解决方案
看起来实际的基础是在这里require
定义的,在. 此行使用 [ in 。再次使用which 定义如下:/internal/bootstrap/loaders.js
compileFunction][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会发生什么,我自己也不确定。
推荐阅读
- multithreading - 是否可以为 3 个进程及更多进程实现彼得森的算法?
- java - HSQLDB ANY 数组函数不起作用
- javascript - 如何为单个html元素赋予多个类
- php - 在列表中显示所有状态为“user”或“admin”的用户
- dart - 为什么此回调在此飞镖方法中显示为 null
- python - Keras 中的人脸分类 CNN 没有正确训练
- python - 通过 socks5 代理使用 telepot(telegram bot python 包)
- php - 如何为自定义 PHP 流包装器设置默认块大小
- reactjs - 在创建新的状态对象以保持不变性之后,我应该在 React.js 中删除以前的状态对象吗?
- line - 如何使精灵无法通过线?