Javascript 将页面缓存存储到 IndexedDB

将页面缓存存储到 IndexedDB 是一个常见的方式,可以用来离线存储页面数据、提升加载速度。以下是实现步骤和代码示例:


实现步骤

  1. 创建 IndexedDB 数据库
    使用 Dexie.js 或原生 IndexedDB API 创建数据库和存储表。

  2. 存储页面缓存
    将页面相关的内容(如 HTML、CSS、JSON 数据等)以键值对形式存储到数据库中。

  3. 读取页面缓存
    页面加载时检查数据库是否有缓存数据,如果有,则优先使用缓存数据。

  4. 更新页面缓存
    每次从服务端获取新数据后,更新 IndexedDB 中的缓存。


代码示例

1. 创建数据库 (db.js)

使用 Dexie.js 创建数据库,方便管理。

import Dexie from 'dexie';// 创建数据库实例
const db = new Dexie("PageCacheDB");// 定义表结构
db.version(1).stores({pageCaches: "url,data,timestamp" // url 是主键,data 存储页面内容,timestamp 用于记录缓存时间
});export default db;

2. 编写缓存管理逻辑 (cacheService.js)

封装一组方法,用于存储、读取和更新缓存。

import db from './db';// 存储页面缓存
export const savePageCache = async (url, data) => {try {await db.pageCaches.put({url, // 唯一键data, // 页面内容(如 HTML 或 JSON)timestamp: Date.now() // 缓存时间});console.log(`缓存已存储: ${url}`);} catch (error) {console.error("存储缓存失败:", error);}
};// 获取页面缓存
export const getPageCache = async (url) => {try {const cache = await db.pageCaches.get(url);if (cache) {console.log(`缓存命中: ${url}`);return cache.data;} else {console.log(`缓存未命中: ${url}`);return null;}} catch (error) {console.error("读取缓存失败:", error);return null;}
};// 清理过期缓存(可选)
export const clearOldCaches = async (maxAge) => {try {const now = Date.now();const allCaches = await db.pageCaches.toArray();for (const cache of allCaches) {if (now - cache.timestamp > maxAge) {await db.pageCaches.delete(cache.url);console.log(`已清理过期缓存: ${cache.url}`);}}} catch (error) {console.error("清理缓存失败:", error);}
};

3. 使用缓存逻辑 (usePageCache.js)

封装一个 React Hook,用于在组件中自动管理页面缓存。

import { useEffect, useState } from 'react';
import { savePageCache, getPageCache } from './cacheService';const usePageCache = (url, fetchData) => {const [data, setData] = useState(null);const [loading, setLoading] = useState(true);useEffect(() => {const fetchAndCache = async () => {setLoading(true);// 尝试从缓存中读取const cachedData = await getPageCache(url);if (cachedData) {setData(cachedData);setLoading(false);}// 获取最新数据并更新缓存const freshData = await fetchData();setData(freshData);savePageCache(url, freshData);setLoading(false);};fetchAndCache();}, [url, fetchData]);return { data, loading };
};export default usePageCache;

4. 使用示例 (App.js)

在组件中使用缓存管理逻辑。

import React from 'react';
import usePageCache from './usePageCache';const App = () => {// 数据获取函数const fetchData = async () => {const response = await fetch("https://api.example.com/data");return response.json();};// 使用缓存 Hookconst { data, loading } = usePageCache("https://api.example.com/data", fetchData);if (loading) {return <div>加载中...</div>;}return (<div><h1>页面缓存示例</h1><pre>{JSON.stringify(data, null, 2)}</pre></div>);
};export default App;

附加功能

  1. 缓存过期策略

    • clearOldCaches 方法中设置缓存有效期,例如 7 天。
    • usePageCache 中检查 timestamp,决定是否更新缓存。
  2. 缓存清理按钮

    • 提供一个按钮,用于清理所有缓存。
const clearCache = async () => {await db.pageCaches.clear();console.log("所有缓存已清除");
};

总结

以上代码实现了:

  • 使用 IndexedDB 存储页面数据缓存。
  • 从缓存读取数据优先,缺失时再获取最新数据。
  • 自动更新缓存和处理过期策略。

你可以根据需求扩展功能,如添加缓存大小限制、分区管理等。

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

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

相关文章

【QT】已解决:Qt4.11.0无法使用MSVC编译器问题

目录 一、背景 1.本机环境 2.问题描述 3.问题解决前后对比图 二、详细操作 1.下载项目二所需qt环境 2.解决思路 3.安装VS2017 4.安装MSVC调试器 5.打开qtCreator查看编译器 5.编译运行项目二 三、参考 一、背景 1.本机环境 windows11 qtCreator4.11.0 minGW 64位…

C++ 模拟真人鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

从零开始:Spring Boot核心概念与架构解析

引言 在当今的Java开发领域&#xff0c;Spring Boot已经成为构建企业级应用的首选框架之一。它以其简洁、高效、易于上手的特点&#xff0c;极大地简化了Spring应用的开发过程。本文将从Spring Boot的核心概念入手&#xff0c;深入解析其架构设计和运行原理&#xff0c;帮助读…

【EdgeAI实战】(1)STM32 边缘 AI 生态系统

【EdgeAI实战】&#xff08;1&#xff09;STM32 边缘 AI 生态系统 【EdgeAI实战】&#xff08;1&#xff09;STM32 边缘 AI 生态系统 1. STM32 边缘人工智能1.1 X-CUBE-AI 扩展包1.2 STM32 AI Model Zoo1.3 ST AIoT Craft 2. STM32N6 AI 生态系统 (STM32N6-AI)2.1 STM32N6 AI 产…

SSE 实践:用 Vue 和 Spring Boot 实现实时数据传输

前言 大家好&#xff0c;我是雪荷。最近我在灵犀 BI 项目中引入了 SSE 技术&#xff0c;以保证图表的实时渲染&#xff0c;当图表渲染完毕服务端推送消息至浏览器端触发重新渲染。 什么是 SSE&#xff1f; SSE 全称为 Server-Send Events 意思是服务端推送事件。 SSE 相比于 …

关于机器学习的一份总结

在之前的文章中分别有详细的关于机器学习中某一学习算法的介绍&#xff0c;但缺少一个总体关于机器学习的总结&#xff0c;所以在这篇文中就是关于机器学习的一份总结。 在最近的日子中&#xff0c;人工智能日益火热起来&#xff0c;而机器学习是其中举足轻重的一部分&#xf…

浅谈计算机网络03 | 现代网络组成

现代网络组成 一 、网络生态体系1.1网络生态系统的多元主体1.2 网络接入设施的多样类型 二、现代网络的典型体系结构解析三、高速网络技术3.1 以太网技术3.2 Wi-Fi技术的深度剖析3.2.1 应用场景的多元覆盖3.2.2 标准升级与性能提升 3.3 4G/5G蜂窝网的技术演进3.3.1 蜂窝技术的代…

数据结构漫游记:队列的动态模拟实现(C语言)

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…

Ubuntu22.04安装paddle GPU版本

文章目录 确立版本安装CUDA与CUDNN安装paddle 确立版本 查看官网信息&#xff0c;确立服务版本&#xff1a;https://www.paddlepaddle.org.cn/documentation/docs/zh/2.6/install/pip/linux-pip.html 安装CUDA与CUDNN 通过nvidia-smi查看当前显卡驱动版本&#xff1a; 通过…

2024年度总结:从后端Java到全栈成长的蜕变

目录 前言1. 用数据与实践书写成长篇章2. 技术与生活的双重蜕变3. 技术的进阶与生活的绽放 前言 今年是我入行的第十年&#xff0c;也是记录在CSDN平台上的第五年。这五年来&#xff0c;我始终坚持记录成长的点滴&#xff0c;将个人事业与博客创作紧密相连。一路走来&#xff0…

麦田物语学习笔记:创建TransitionManager控制人物场景切换

基本流程 制作场景之间的切换 1.代码思路 (1)为了实现不同场景切换,并且保持当前的persistentScene一直存在,则需要一个Manager去控制场景的加载和卸载,并且在加载每一个场景之后,都要将当前的场景Set Active Scene,保证其为激活的场景,在卸载的时候也可以方便调用当前激活的场…

无人机高速无刷动力电机核心设计技术

一、技术概述 无刷电机优势&#xff1a; 高效率&#xff1a;无刷电机由于去除了电刷和换向器&#xff0c;减少了能量损失&#xff0c;因此具有更高的效率。 长寿命&#xff1a;电刷和换向器的磨损是导致传统有刷电机寿命较短的主要原因&#xff0c;而无刷电机则避免了这一问…

Linux C\C++方式下的文件I/O编程

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 Lin…

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)角点检测

角点检测&#xff08;Corner Detection&#xff09;是计算机视觉和图像处理中重要的步骤&#xff0c;主要用于提取图像中的关键特征&#xff0c;以便进行后续的任务&#xff0c;比如图像匹配、物体识别、运动跟踪等。下面介绍几种常用的角点检测方法及其应用。 1. Harris角点检…

QT开发-T113 Linux 主板QC配置套件

此篇文章用于记录在Linux主板上使用QT开发项目的套件配置步骤 进入QC软件&#xff0c;点击 Manage Kits… 选择项目对应的QT Version : 一般有一个项目对应的qmake 文件&#xff0c;选择导入即可 如果首次导入提示 qmake could not be added 需要先对项目进行命令行编译(具体命…

【云岚到家】-day03-门户缓存实现实战

【云岚到家】-day03-门户缓存实现实战 1.定时任务更新缓存 1.1 搭建XXL-JOB环境 1.1.1 分布式调度平台XXL-JOB介绍 对于开通区域列表的缓存数据需要由定时任务每天凌晨更新缓存&#xff0c;如何实现定时任务呢&#xff1f; 1.使用jdk提供的Timer定时器 示例代码如下&#xf…

SuperdEye:一款基于纯Go实现的间接系统调用执行工具

关于SuperdEye SuperdEye是一款基于纯Go实现的间接系统调用执行工具&#xff0c;该工具是TartarusGate 的修订版&#xff0c;可以利用Go来实现TartarusGate 方法进行间接系统调用。 该工具的目标是为了扫描挂钩的NTDLL并检索Syscall编号&#xff0c;然后使用它来执行间接系统调…

Python+ tkinter实现小学整数乘法和除法竖式演算式

Python tkinter实现小学整数乘法和除法竖式演算式 整数的乘法与除法是小学数学中的重要内容&#xff0c;它们是数学运算中的基础部分。 本文将使用python 和Python 的标准 GUI&#xff08;图形用户界面&#xff09;包tkinter&#xff0c;实现整数乘法与除法的竖式演示。供有兴趣…

线程池遇到未处理的异常会崩溃吗?

线程池中的 execute 和 submit 方法详解 目录 引言execute 方法 使用示例代码 submit 方法 2.1 提交 Callable 任务2.2 提交 Runnable 任务 遇到未处理异常 3.1 execute 方法遇到未处理异常3.2 submit 方法遇到未处理异常 小结 引言 在多线程编程中&#xff0c;线程池是提高性…

MongoDB基本操作

一、实验目的 1. 熟悉MongoDB的基本操作&#xff0c;包括CRUD&#xff08;增加、读取、更新、删除&#xff09;。 2. 理解MongoDB的文档型数据库特性和Shell的使用。 3. 培养学生通过命令行操作数据库的能力。 4. 强化数据库操作的实际应用能力。 二、实验环境准备 1.…