这是「🥬狗变形记」系列更新的第二天,今天给大家介绍一下让函数具有缓存功能的NPM库 - 「mem」:
先来看一看文档里的介绍:
mem库希望通过缓存策略来实现函数的记忆功能,从而优化函数执行的次数
阅读一个仓库,最重要的当然是了解这个库的Features,在阅读了mem库的文档以后,我整理出了如下的Features:
-
设置过期时间
-
缓存策略
-
缓存类
-
清空缓存
-
支持promise
-
缓存命中统计
可以看到,核心的功能是比较丰富的,其中一些也具备比较大的使用灵活性、扩展性,比如缓存策略,但我们暂时先不看怎么一个一个实现它们,先来看一看源码里的整体执行流程:
将一个函数memorized化处理的过程如图:
对照源码我们来看一下:
我们接着关注最核心的memorize化处理流程:
代码是比较清晰,那我们接着就往下看...
核心Features的实现
- 缓存策略
此处主要涉及的就是缓存key的计算,以及缓存类的设置两部分,对应源码中cacheKey和cache:
cacheKey :
可以按照不同的需要去采用不同的策略
-
- 处理多个原始值:用数组的join方法拼接在一起;
- 处理对象:JSON.stringify 或 serialize-javascript(补充JSON)
补充:
serialize-javascript库
-
- 是对JSON的补足,包括function、date、set、map、正则表达式;
- 支持html字符转义,也就是xss过滤,转义可直接作为html内容插入;
- 支持反序列化;
cache:
可以理解为抽象成实现了如下方法的对象:has(key), get(key), .set(key, value), .delete(key), clear(),比如:
-
-
Map / 普通对象
-
quick-lru
-
-
清空缓存
源码如下:
- 缓存命中统计:使用stats-map库进行统计
- 支持Promise:p-memorize库
一些思考:
-
工具库函数的实现往往是一个整体运行逻辑 + 各种options的条件判断或适配,我们在写代码的时候,想写出清晰的代码就可以考虑搭建这样的结构;
-
工具库开发可以围绕单元测试来进展,单元测试其实也就是对各种options的测试;
🌊总结:
💪持续阅读好的代码库,思考学习好的代码,把自己的成长分享出来。
😊如果有一点点对你学习、工作、思考的帮助,我也会觉得很开心~