当前位置: 首页 > news >正文

webpack源码分析——makeCacheable函数和weakMap的缓存应用场景

一、makeCacheable 函数

函数功能

该函数是将一个不带缓存的函数 realFn 转换成一个带缓存的版本。这样可以提高性能,因为相同的输入值不需要每次都重新计算,而是可以从缓存中直接获取结果。

二、函数分析

  1. 使用 WeakMap 弱引用特性创建缓存

const cache = new WeakMap();

  1. getCache 函数
const getCache = associatedObjectForCache => {const entry = cache.get(associatedObjectForCache);if (entry !== undefined) return entry;const map = new Map();cache.set(associatedObjectForCache, map);return map;
};

getCache 函数用于获取或创建与给定对象关联的缓存。如果这个对象已经有了一个缓存映射,它将返回这个映射;否则,它会创建一个新的 Map 对象,将其与对象关联,并返回它。

  1. 缓存化函数
const fn = (str, associatedObjectForCache) => {if (!associatedObjectForCache) return realFn(str);const cache = getCache(associatedObjectForCache);const entry = cache.get(str);if (entry !== undefined) return entry;const result = realFn(str);cache.set(str, result);return result;
};

fn 是一个包装过的函数,它接受一个字符串 str 和一个可选的关联对象 associatedObjectForCache。如果没有提供关联对象,fn 将直接调用 realFn 函数。如果提供了关联对象,fn 将尝试从缓存中获取结果,如果缓存中没有结果,它将调用 realFn 并将结果存储在缓存中。

  1. 绑定缓存
fn.bindCache = associatedObjectForCache => {const cache = getCache(associatedObjectForCache);return str => {const entry = cache.get(str);if (entry !== undefined) return entry;const result = realFn(str);cache.set(str, result);return result;};
};

fn.bindCache 方法允许创建一个新的函数,这个函数总是使用associatedObjectForCache缓存结果。这样可以为特定的对象创建一个专用的缓存函数。

##三、源码

const makeCacheable = realFn => {const cache = new WeakMap();const getCache = associatedObjectForCache => {const entry = cache.get(associatedObjectForCache);if (entry !== undefined) return entry;const map = new Map();cache.set(associatedObjectForCache, map);return map;};const fn = (str, associatedObjectForCache) => {if (!associatedObjectForCache) return realFn(str);const cache = getCache(associatedObjectForCache);const entry = cache.get(str);if (entry !== undefined) return entry;const result = realFn(str);cache.set(str, result);return result;};fn.bindCache = associatedObjectForCache => {const cache = getCache(associatedObjectForCache);return str => {const entry = cache.get(str);if (entry !== undefined) return entry;const result = realFn(str);cache.set(str, result);return result;};};return fn;
};

四 函数用途

makeCacheable 函数可以用于性能优化,特别是在处理重复调用且计算成本较高的函数时。例如,在Web开发中,对于解析URL或处理文件路径等操作,使用缓存可以显著减少重复计算的开销,从而提高应用程序的响应速度和效率。通过将缓存绑定到特定的对象,可以确保缓存的生命周期与对象的生命周期相匹配,这有助于避免内存泄漏问题。

相关文章:

  • 自动化测试 —— Pytest fixture及conftest详解
  • CentOS常用功能命令集合
  • 怎样去保证 Redis 缓存与数据库双写一致性?
  • Debian GNU/Linux 安装docker与docker compose
  • 将yolov5s部署到安卓上实战经验总结
  • 【研发日记】Matlab/Simulink技能解锁(五)——Simulink布线技巧
  • 大话设计模式之原型模式
  • DevSecOps平台架构系列-微软云Azure DevSecOps平台架构
  • 主流后端开发语言:JAVA、C、C++、GO、PYTHON对比
  • 如何系统的学习 C#
  • C#使用iText7画发票PDF——字体与自定义颜色
  • 上位机图像处理和嵌入式模块部署(qmacvisual透视变换)
  • 优雅的使用ChromeDriver
  • 论文《Exploring to Prompt for Vision-Language Models》阅读
  • Linux小程序: 手写自己的shell
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 《Java编程思想》读书笔记-对象导论
  • CSS3 变换
  • js继承的实现方法
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Koa2 之文件上传下载
  • mockjs让前端开发独立于后端
  • PV统计优化设计
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Vue.js源码(2):初探List Rendering
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 后端_ThinkPHP5
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 巧用 TypeScript (一)
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 小试R空间处理新库sf
  • 学习Vue.js的五个小例子
  • 异常机制详解
  • 译自由幺半群
  • 原生 js 实现移动端 Touch 滑动反弹
  • 积累各种好的链接
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $refs 、$nextTic、动态组件、name的使用
  • (c语言)strcpy函数用法
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (libusb) usb口自动刷新
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (六)vue-router+UI组件库
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (译)2019年前端性能优化清单 — 下篇
  • .NET6实现破解Modbus poll点表配置文件
  • .Net面试题4
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • @拔赤:Web前端开发十日谈
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [ACM] hdu 1201 18岁生日
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子