菜?🥬就多练! - 每天思考一个NPM库(Day 2)

197 阅读2分钟

这是「🥬狗变形记」系列更新的第二天,今天给大家介绍一下让函数具有缓存功能的NPM库 - 「mem」

NPM:www.npmjs.com/package/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(),比如:

源码如下:

  • 缓存命中统计:使用stats-map库进行统计
  • 支持Promise:p-memorize库

一些思考:

  1. 工具库函数的实现往往是一个整体运行逻辑 + 各种options的条件判断或适配,我们在写代码的时候,想写出清晰的代码就可以考虑搭建这样的结构;

  2. 工具库开发可以围绕单元测试来进展,单元测试其实也就是对各种options的测试;

🌊总结:

💪持续阅读好的代码库,思考学习好的代码,把自己的成长分享出来。

😊如果有一点点对你学习、工作、思考的帮助,我也会觉得很开心~