// <node_internals>/internal/modules/cjs/loader.js:879Module._load = function(request, parent, isMain) {let relResolveCacheIdentifier;if (parent) {// ...}const filename = Module._resolveFilename(request, parent, isMain);const cachedModule = Module._cache[filename];// 如果命中缓存,直接取缓存if (cachedModule !== undefined) {updateChildren(parent, cachedModule, true);return cachedModule.exports;}// 如果是 NativeModule,加载它const mod = loadNativeModule(filename, request);if (mod && mod.canBeRequiredByUsers) return mod.exports;// Don't call updateChildren(), Module constructor already does.const module = new Module(filename, parent);if (isMain) {process.mainModule = module;module.id = '.';}Module._cache[filename] = module;if (parent !== undefined) { // ... }let threw = true;try {if (enableSourceMaps) {try {// 如果不是 NativeModule,加载它module.load(filename);} catch (err) {rekeySourceMap(Module._cache[filename], err);throw err; /* node-do-not-add-exception-line */}} else {module.load(filename);}threw = false;} finally {// ...}return module.exports;};
require.cache「当代码执行 require(lib) 时,会执行 lib 模块中的内容,并作为一份缓存,下次引用时不再执行模块中内容」 。
这里的缓存指的就是 require.cache,也就是上一段指的 Module._cache
// <node_internals>/internal/modules/cjs/loader.js:899require.cache = Module._cache;
这里有个小测试:? 有两个文件: index.js 与 utils.js 。utils.js 中有一个打印操作,当 index.js 引用 utils.js 多次时,utils.js 中的打印操作会执行几次 。代码示例如下 ?
「index.js」
// index.js// 此处引用两次require('./utils')require('./utils')
「utils.js」// utils.jsconsole.log('被执行了一次')
「答案是只执行了一次」,因此 require.cache,在 index.js 末尾打印 require,此时会发现一个模块缓存// index.jsrequire('./utils')require('./utils')console.log(require)
文章插图
那回到本章刚开始的问题:
? 如何不重启应用热加载模块呢? ?
答:「删掉 Module._cache」,但同时会引发问题,如这种 一行 delete require.cache 引发的内存泄漏血案[3]
所以说嘛,这种黑魔法大幅修改核心代码的东西开发环境玩一玩就可以了,千万不要跑到生产环境中去,毕竟黑魔法是不可控的 。
总结
- 模块中执行时会被 module wrapper 包裹,并注入全局变量 require 及 module 等
- module.exports 与 exports 的关系实际上是 exports = module.exports
- require 实际上是 module.require
- require.cache 会保证模块不会被执行多次
- 不要使用 delete require.cache 这种黑魔法
推荐阅读
- 中国第一个乒乓球大满贯是谁?
- 浪里来浪里去!网络协议如何成就网上冲浪?
- 阿尔忒弥斯计划和中国登月 阿耳忒弥斯登月计划
- 高中物理|2022湖南教师招聘高中物理实验:验证动量守恒定律
- 招聘|“灰色强奸”在职场中随处可见,或许你就也是帮凶!
- 三体中大宇宙归零成功了吗 三体4重启宇宙在线阅读
- 冬季如何预防癌症 常见4种癌症的预防方法
- 冬季宝宝发热怎么办 推荐三种中医疗法
- 老人冬天心血管疾病高发 该如何预防
- 汉中毛尖的功效与作用,茉莉毛尖属于什么茶茉莉花茶毛尖的功效与作用