Open AndreGeng opened 5 years ago
node架构
node模块加载伪代码
function loadModule(filename, module, require) { const wrappedSrc = `(function(module, exports, require) { ${fs.readFileSync(filename, 'utf8')} })(module, module.exports, require)`; eval(wrappedSrc); } const require = (moduleName) => { console.log(`require invoked for module: ${moduleName}`); const id = require.resolve(moduleName); if (require.cache[id]) { return require.cache[id].exports; } // module metadata const module = { exports: {}, id: id, }; // Update the cache require.cache[id] = module; // load the module loadModule(id, module, require); // return exported variables return module.exports; }; require.cache = {}; require.resolve = (moduleName) => { /* resolve a full module id from the moduleName */ }
从伪代码中可以看出以下几点: 1. 模块的加载是有缓存的 2. 当两个模块存在**循环依赖**时,可能会出现**加载的模块代码不完整**的问题。
node架构
node模块加载伪代码