前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
开发者导航
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
开发者导航
  • React专栏

    • React组合式开发实战

      • 前端开发的四个时代
      • 企业管理系统的前世今生
      • 可视化页面搭建工具
      • 实战篇 01:开发前准备
      • 实战篇 02:项目脚手架
      • 实战篇 03:页面布局方案
      • 实战篇 04:权限管理机制
      • 实战篇 05:菜单匹配逻辑
      • 实战篇 06:消息通知设计
      • 实战篇 07:多语言支持
      • 继往开来:可视化页面搭建工具
    • React Hooks与Immutable实战

    • React SSR服务端渲染与同构实践

    • IM聊天系统前端开发实践

    • 微前端开发实战

    • React进阶实践

  • Vue专栏

  • 移动端专栏

  • Node专栏

  • 前端工程化专栏

  • 算法专栏

  • Typescript专栏

  • 其他专栏

完整面试题地址:
作者:程序员poetry
扫码关注作者公众号:「前端进阶之旅」 每天分享技术干货
前端进阶之旅公众号二维码

到这里,相信大家已经能够熟练运用缓存来加速甚至避免网络请求,然而浏览器为每个应用所分配的存储空间是有限的,因此我们往往需要删除部分缓存来释放存储空间,至于需要删除哪些缓存,这正是本章需要讲解的内容。

由于 CacheStorage 是针对请求/响应类型对象的存储方案,它适用于网址可寻址(比如脚本、样式、图片、HTML 等)资源,基于此我们将使用 IndexedDB 来存储并处理缓存的过期信息,下文中所使用的类 DB 为 IndexedDB API 的简单封装,具体代码可在示例中获得,为节省篇幅,此处不再列出。

# 常见算法

# FIFO

该算法的核心思想是:如果一个数据最先加入缓存中,那么在存储空间不足时应该删除加入时间较久远的数据。

代码实现如下:

class CacheExpirationDB extends DB {
  constructor(cacheName, maxAgeSeconds) {
    super('CacheExpiration', 1, event => {
      const db = event.target.result;
      const objStore = db.createObjectStore('CacheExpiration', { keyPath: 'id' });
      objStore.createIndex('timestamp', 'timestamp', { unique: false });
    });
    this._cacheName = cacheName;
    this._maxAgeSeconds = maxAgeSeconds;
  }

  /**
   * 去除 `url` 中的 `hash`(比如将:`/detail/12#hash` 转换为 `/detail/12`)
   */
  _normalizeURL(baseUrl) {
    const url = new URL(baseUrl, location);
    url.hash = '';
    return url.pathname;
  }

  /**
   * 根据 url 生成记录 id
   */
  _getId(url) {
    return `${this._cacheName}|${this._normalizeURL(url)}`;
  }

  async set(url, timestamp) {
    const expireEntries = await this.expireEntries(timestamp);
    await this.write('put', 'CacheExpiration', {
      id: this._getId(url),
      cacheName: this._cacheName,
      url: this._normalizeURL(url),
      timestamp
    });
    return expireEntries;
  }

  async expireEntries(timestamp) {
    const minTimestamp = timestamp - this._maxAgeSeconds;
    const entriesToDelete = await this._transaction(
      'CacheExpiration', 
fe
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
开发者导航
  • React专栏

    • React组合式开发实战

      • 前端开发的四个时代
      • 企业管理系统的前世今生
      • 可视化页面搭建工具
      • 实战篇 01:开发前准备
      • 实战篇 02:项目脚手架
      • 实战篇 03:页面布局方案
      • 实战篇 04:权限管理机制
      • 实战篇 05:菜单匹配逻辑
      • 实战篇 06:消息通知设计
      • 实战篇 07:多语言支持
      • 继往开来:可视化页面搭建工具
    • React Hooks与Immutable实战

    • React SSR服务端渲染与同构实践

    • IM聊天系统前端开发实践

    • 微前端开发实战

    • React进阶实践

  • Vue专栏

  • 移动端专栏

  • Node专栏

  • 前端工程化专栏

  • 算法专栏

  • Typescript专栏

  • 其他专栏