使用 Dexie.js 实现 API 数据缓存,减少网络请求

使用 Dexie.js 实现 API 数据缓存,减少网络请求

1. 为什么要使用 Dexie.js 进行 API 数据缓存?

在前端开发中,频繁的 API 请求会带来以下问题:

  • 性能问题:多次请求相同数据会增加网络带宽消耗,导致页面加载变慢。
  • 服务器压力:频繁请求相同的数据会增加后端服务器的负担。
  • 离线支持:如果用户的网络不稳定或处于离线状态,仍然需要访问最近获取的数据。

使用 Dexie.js(一个基于 IndexedDB 的轻量级封装库)可以高效地缓存 API 数据,减少不必要的请求,优化应用的性能。


2. Dexie.js 简介

Dexie.js 是一个基于 IndexedDB 的数据库库,提供了更简单的 API 来管理客户端存储。它具有:

  • 支持 Promise 和 async/await
  • 提供索引和查询优化
  • 支持事务
  • 自动版本管理

安装:

npm install dexie

3. API 数据缓存的基本思路

使用 Dexie.js 进行 API 缓存的大致流程如下:

  1. 创建数据库和表,定义存储数据的结构。
  2. 检查本地缓存,如果数据存在且不过期,直接返回。
  3. 如果本地没有数据或数据已过期,向 API 发起请求,并将数据存储到 IndexedDB 中。
  4. 提供缓存失效策略,例如基于时间的缓存(TTL, Time-to-Live)。

4. 实现 API 数据缓存

4.1 初始化 Dexie 数据库

import Dexie from 'dexie';// 创建数据库
const db = new Dexie("ApiCacheDB");// 定义数据表结构
db.version(1).stores({cache: 'key, timestamp',  // 以 key 作为主键,存储时间戳用于过期检查
});// 定义数据表类型
interface CacheEntry {key: string;data: any;timestamp: number;
}

4.2 读取缓存数据

const getCachedData = async (key: string, maxAge: number = 5 * 60 * 1000) => {const entry = await db.table("cache").get(key);if (entry) {const now = Date.now();if (now - entry.timestamp < maxAge) {console.log("Using cached data:", key);return entry.data;} else {console.log("Cache expired:", key);await db.table("cache").delete(key); // 移除过期数据}}return null;
};

4.3 存储 API 数据

const setCachedData = async (key: string, data: any) => {await db.table("cache").put({ key, data, timestamp: Date.now() });
};

4.4 使用缓存封装 API 请求

const fetchWithCache = async (key: string, url: string, maxAge: number = 5 * 60 * 1000) => {const cachedData = await getCachedData(key, maxAge);if (cachedData) return cachedData;try {const response = await fetch(url);const data = await response.json();await setCachedData(key, data);return data;} catch (error) {console.error("API request failed:", error);throw error;}
};

4.5 在 Vue 组件中使用

<script setup lang="ts">
import { ref, onMounted } from "vue";
import { fetchWithCache } from "@/utils/cache"; // 假设缓存逻辑封装在 utils/cache.tsconst posts = ref([]);onMounted(async () => {try {posts.value = await fetchWithCache("posts", "https://jsonplaceholder.typicode.com/posts");} catch (error) {console.error("Failed to load posts:", error);}
});
</script><template><div><h1>Posts</h1><ul><li v-for="post in posts" :key="post.id">{{ post.title }}</li></ul></div>
</template>

5. 进阶优化策略

5.1 增加缓存数据的自动清理机制

定期清理旧数据,防止 IndexedDB 过度膨胀:

const clearOldCache = async (maxAge: number = 24 * 60 * 60 * 1000) => {const now = Date.now();const oldEntries = await db.table("cache").where("timestamp").below(now - maxAge).toArray();for (const entry of oldEntries) {await db.table("cache").delete(entry.key);}
};

在应用启动时执行:

clearOldCache();

5.2 允许用户手动刷新数据

在 Vue 组件中增加手动刷新按钮:

<button @click="refreshData">刷新数据</button><script setup lang="ts">
const refreshData = async () => {await db.table("cache").delete("posts");posts.value = await fetchWithCache("posts", "https://jsonplaceholder.typicode.com/posts");
};
</script>

5.3 预缓存数据

在用户打开应用时,预先缓存一些常用数据:

onMounted(() => {fetchWithCache("posts", "https://jsonplaceholder.typicode.com/posts");
});

6. 结论

使用 Dexie.js 进行 API 缓存可以有效减少网络请求,提高应用的性能,同时还能在离线模式下提供更好的用户体验。关键策略包括:

  • 数据缓存检查:优先从 IndexedDB 读取数据,避免重复请求。
  • 数据缓存存储:存储最新 API 数据,并记录时间戳。
  • 缓存过期策略:定期清理过期数据,保证存储不会无限增长。
  • 手动刷新:允许用户手动刷新缓存数据。

这种方法适用于大多数 Vue/React/Node.js Web 应用,特别是对 API 访问频繁的场景,比如:

  • 新闻/博客列表
  • 用户资料
  • 商品信息

使用 Dexie.js 提供的 IndexedDB 作为存储,既能减少 API 负载,又能提升前端应用的响应速度,实现更好的用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/67480.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯真题 - 公因数匹配 - 题解

题目链接&#xff1a;https://www.lanqiao.cn/problems/3525/learning/ 个人评价&#xff1a;难度 2 星&#xff08;满星&#xff1a;5&#xff09; 前置知识&#xff1a;调和级数 整体思路 题目描述不严谨&#xff0c;没说在无解的情况下要输出什么&#xff08;比如 n n n …

R语言的文件操作

R语言的文件操作 引言 在数据科学和分析的过程中&#xff0c;文件操作是不可或缺的一部分。R语言作为一种强大的统计计算和图形作图的编程语言&#xff0c;提供了丰富的文件操作函数&#xff0c;使得用户能够方便地读取和保存数据。本文将详细介绍R语言中的文件操作&#xff…

RK3588平台开发系列讲解(NPU篇)NPU 驱动的组成

文章目录 一、NPU 驱动组成二、查询 NPU 驱动版本三、查询 rknn_server 版本四、查询 librknn_runtime 版本沉淀、分享、成长,让自己和他人都能有所收获!😄 一、NPU 驱动组成 NPU 驱动版本、rknn_server 版本、librknn_runtime 版本以及 RKNN Toolkit 版本的对应关系尤为重…

论文阅读:CosAE Learnable Fourier Series for Image Restoration

这是 2024 NeurIPS 上发表的一篇文章&#xff0c;介绍了一种新型的基于傅里叶级数的通用编码器。 Abstract 本文介绍了余弦自动编码器&#xff08;Cosine Autoencoder, CosAE&#xff09;&#xff0c;这是一种新颖的通用自动编码器&#xff0c;它将经典傅里叶级数与前馈神经网…

YOLOv11改进,YOLOv11检测头融合RepConv卷积,并添加小目标检测层(四头检测),适合目标检测、分割等任务

摘要 作者提出了一种简单而强大的卷积神经网络架构,其推理阶段采用与 VGG 类似的网络体结构,仅由一堆 3x3 卷积和 ReLU 组成,而训练阶段的模型具有多分支拓扑。这种训练阶段和推理阶段架构的解耦通过结构重参数化技术实现,因此我们将该模型命名为 RepVGG。 # 理论介绍 Re…

深度学习笔记——循环神经网络RNN

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍面试过程中可能遇到的循环神经网络RNN知识点。 文章目录 文本特征提取的方法1. 基础方法1.1 词袋模型&#xff08;Bag of Words, BOW&#xff09;工作原…

Selenium工具使用Python 语言实现下拉框定位操作

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 我们通常遇到的下拉框有显性的下拉框和隐性的下拉框&#xff1b;有的下拉框还可以进行单选或多选操作&#xff0c;在selenium中如何实现下拉框的定位通常使用selec…

Mysql--实战篇--连接池(连接池原理,HikariCP、C3P0、Druid和DBCP等)

连接池&#xff08;Connection Pool&#xff09;是数据库应用程序中的一种优化技术&#xff0c;用于管理和复用数据库连接。通过连接池&#xff0c;应用程序可以避免频繁创建和销毁数据库连接的开销&#xff0c;从而提高性能和资源利用率。在Java应用程序中&#xff0c;常用的M…

深度学习 Pytorch 张量(Tensor)的创建和常用方法

1 张量的基本创建及其类型 和Numpy中的array一样&#xff0c;张量的本质也是结构化地组织了大量的数据。 并且在实际操作中&#xff0c;张量的创建和基本功能也与其非常类似。 1.1 张量(Tensor)函数创建方法 张量的最基本创建方法和Numpy中创建Array的格式一致。 # Numpy创建…

使用 Continue 插件时,发现调用外部地址

https://us.i.posthog.com/e/?ip1&_1737025525924&ver1.163.0&compressiongzip-js 看是一个帮助改善产品的网址。估计类似某推广流量监控的插件工具吧。网上没用查到其他说明&#xff0c;可能国内使用不多的原因。 但是发送的数据看不出来是个什么内容。 我用来搜…

【PyQt】图像处理系统

[toc]pyqt实现图像处理系统 图像处理系统 1.创建阴影去除ui文件 2.阴影去除代码 1.创建阴影去除ui文件 UI文件效果图&#xff1a; 1.1QT Desiger设置组件 1.两个Pushbutton按钮 2.两个label来显示图像 3.Text Browser来显示输出信息 1.2布局的设置 1.先不使用任何La…

【Idea】编译Spring源码 read timeout 问题

Idea现在是大家工作中用的比较多的开发工具&#xff0c;尤其是做java开发的&#xff0c;那么做java开发&#xff0c;了解spring框架源码是提高自己技能水平的一个方式&#xff0c;所以会从spring 官网下载源码&#xff0c;导入到 Idea 工具并编译&#xff0c;但是发现build的时…

全类别机器人传感器模块推荐

视觉感知 双目视觉模块&#xff1a;常见分辨率1280720&#xff0c;帧率30fps-60fps&#xff0c;水平视场角60-90&#xff0c;垂直视场角40-60&#xff0c;通过USB接口传数据。用于机器人导航、避障等&#xff0c;基于三角测量原理获取三维信息&#xff0c;定位更精准。单目摄像…

Linux 音视频入门到实战专栏(视频篇)视频编解码 MPP

文章目录 一、MPP 介绍二、获取和编译RKMPP库三、视频解码四、视频编码 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; &#x1f4e2;本篇将介绍如何调用alsa api来进行音频数据的播放和录制。 一、MPP 介绍 瑞芯微提供的媒体处理软件平台…

爬虫后的数据处理与使用(使用篇--实现分类预测)

&#xff08;&#xff09;紧接上文&#xff0c;在完成基本的数据处理后&#xff0c;接下来就是正常的使用了。当然怎么用&#xff0c;确实需要好好思考一下~ 上文&#xff1a;爬虫后的数据处理与使用&#xff08;处理篇&#xff09; 前言&#xff1a; 一般来说&#xff0c;我…

RabbitMQ--延迟队列

&#xff08;一&#xff09;延迟队列 1.概念 延迟队列是一种特殊的队列&#xff0c;消息被发送后&#xff0c;消费者并不会立刻拿到消息&#xff0c;而是等待一段时间后&#xff0c;消费者才可以从这个队列中拿到消息进行消费 2.应用场景 延迟队列的应用场景很多&#xff0c;…

flutter开发-figma交互设计图可以转换为flutter源代码-如何将设计图转换为flutter源代码-优雅草央千澈

flutter开发-figma交互设计图可以转换为flutter源代码-如何将设计图转换为flutter源代码-优雅草央千澈 开发背景 可能大家听过过蓝湖可以转ui设计图为vue.js&#xff0c;react native代码&#xff0c;那么请问听说过将figma的设计图转换为flutter源代码吗?本文优雅草央千澈带…

当设置dialog中有el-table时,并设置el-table区域的滚动,看到el-table中多了一条横线

问题&#xff1a;当设置dialog中有el-table时&#xff0c;并设置el-table区域的滚动&#xff0c;看到el-table中多了一条横线&#xff1b; 原因&#xff1a;el-table有一个before的伪元素作为表格的下边框下&#xff0c;初始的时候已设置&#xff0c;在滚动的时候并没有重新设置…

SQL-杂记1

PIVOT的使用: 行转列IIF()的使用:IIF( boolean_expression, true_value, false_value)多个字段使用MX()函数 SELECTD.ID,字段1,字段2,字段3,字段4,字段5,X.MinDateValue FROM 表名 D WITH(NOLOCK) OUTER APPLY (SELECT MIN(DateValue) AS MinDateValueFROM (VALUES (字段1),(字…

代理模式实现

一、概念&#xff1a;代理模式属于结构型设计模式。客户端不能直接访问一个对象&#xff0c;可以通过代理的第三者来间接访问该对象&#xff0c;代理对象控制着对于原对象的访问&#xff0c;并允许在客户端访问对象的前后进行一些扩展和处理&#xff1b;这种设置模式称为代理模…