以伪代码进行说明:
function require(modulePath) {
// 1. 将modulePath转换为绝对路径
// 2. 判断该模块是否已有缓存
if (require.cache['绝对路径']) {
return require.cache['绝对路径'];
}
// 3. 读取文件内容
// 4. 包裹到一个函数中
function _temp(module, exports, require, __dirname, __filename) {
// 模块代码...
}
// 6. 创建module对象
module.exports = {};
const exports = module.exports;
// 7. 调用函数
__temp.call(module.exports, module, exports, require, module.path, module.filename);
return module.exports;
}
// require函数有个静态属性cache, 它是一个对象, 里面缓存了已经加载的模块的内容
require.cache = {};