🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
##require 的实现机制 - 将传入的模块 ID 通过加载规则找到对应的模块文件 - 读取这个文件里面的代码 - 通过拼接的方式为该段代码构建私有空间 - 执行该代码 - 拿到 module.exports 返回 ##模块的缓存 - 第一次加载某个模块时,Node 会缓存该模块。以后再加载该模块,就直接从缓存取出该模块的 module.exports 属性(不会再次执行该模块) - 如果需要多次执行模块中的代码,一般可以让模块暴露行为(函数) - 模块的缓存可以通过 require.cache 拿到,同样也可以删除 index.js ```js // 模块的缓存 'use strict'; function $require(id) { const fs = require('fs'); const path = require('path'); const filename = path.join(__dirname, id); // pathto/module1.js $require.cache = $require.cache || {}; if ($require.cache[filename]) { // return $require.cache[filename].exports; } // 没有缓存 第一次 const dirname = path.dirname(filename); // pathto let code = fs.readFileSync(filename, 'utf8'); // 定义一个数据容器,用容器去装模块导出的成员 let module = { id: filename, exports: {} }; let exports = module.exports; // module.exports code = ` (function($require, module, exports, __dirname, __filename) { ${code} })($require, module, exports, dirname, filename);`; eval(code); // 缓存起来 $require.cache[filename] = module; return module.exports; } setInterval(() => { var date = $require('./module/date.js'); console.log(date.getTime()); }, 1000); ``` module/date.js ``` console.log('date module exec'); module.exports = new Date(); ```