当前位置: 首页 > news >正文

前端开发数据缓存方案详解

一般我们为了解决以下问题,考虑通过缓存数据来提升整体应用性能,包含:

  • 频繁的网络请求会影响应用性能。

  • 离线状态下无法访问数据。

  • 大量数据的本地存储和快速检索需求。

常见的前端数据缓存方案有:

  • localstorage

  • indexedDB

  • service worker

1. localstorage

localStorage是 HTML5 引入的一种 Web 存储方式,它允许在浏览器中以键值对的形式存储数据。localstorage的数据存储是持久化的,即使浏览器关闭后数据也不会丢失,除非手动删除。

面试经常会被问到,用户信息存储在哪里呀?这样我们也能体会得到,localstorage的作用就是暂存一些关键数据在本地,为下次访问与使用做前置准备。

1.1. 基本用法

// 存储数据
localStorage.setItem('username', 'Alice');// 获取数据
const username = localStorage.getItem('username');
console.log(username); // 输出: Alice// 删除特定数据
localStorage.removeItem('username');// 清除所有数据
localStorage.clear();

1.2. 主要特征

  • 每个域名最多可以存储5MB左右的数据。

  • 数据以纯文本形式存储,主要用于存储简单的字符串类型的数据。

  • 数据没有过期时间,所以需要自己实现过期时间处理或者借助后端实现。

  • 数据在同域下共享。

1.3. 实际应用

1.3.1 用户偏好设置

存储用户偏好设置、主题选择等需要持久化的简单数据。

// 保存用户选择的主题
function saveThemePreference(theme) {localStorage.setItem('theme', theme);applyTheme(theme);
}// 应用用户选择的主题
function applyTheme(theme) {if (theme === 'dark') {document.body.classList.add('dark-theme');} else {document.body.classList.remove('dark-theme');}
}// 页面加载时,检查并应用存储的主题
window.onload = function() {const savedTheme = localStorage.getItem('theme');if (savedTheme) {applyTheme(savedTheme);}
};// 示例:用户选择主题
document.getElementById('themeToggle').addEventListener('click', function() {const currentTheme = document.body.classList.contains('dark-theme') ? 'light' : 'dark';saveThemePreference(currentTheme);
});

1.3.2. 表单数据缓存

存储表单数据,防止页面刷新后数据丢失。

// 实时保存表单数据
document.getElementById('userForm').addEventListener('input', function() {const formData = {name: document.getElementById('name').value,email: document.getElementById('email').value};localStorage.setItem('formData', JSON.stringify(formData));
});// 页面加载时,恢复表单数据
window.onload = function() {const savedFormData = localStorage.getItem('formData');if (savedFormData) {const formData = JSON.parse(savedFormData);document.getElementById('name').value = formData.name || '';document.getElementById('email').value = formData.email || '';}
};// 示例:用户提交表单时清除保存的数据
document.getElementById('userForm').addEventListener('submit', function() {localStorage.removeItem('formData');
});

1.3.3. 筛选数据缓存

缓存少量且不频繁变动的静态数据。

// 检查缓存是否存在静态数据
function loadCategories() {const categories = localStorage.getItem('categories');if (categories) {renderCategories(JSON.parse(categories));} else {fetchCategoriesFromServer();}
}// 从服务器获取数据并缓存
function fetchCategoriesFromServer() {fetch('/api/categories').then(response => response.json()).then(data => {localStorage.setItem('categories', JSON.stringify(data));renderCategories(data);}).catch(error => {console.error('Error fetching categories:', error);});
}// 将数据渲染到页面
function renderCategories(categories) {const categoryList = document.getElementById('categoryList');categories.forEach(category => {const listItem = document.createElement('li');listItem.textContent = category.name;categoryList.appendChild(listItem);});
}// 页面加载时调用函数
window.onload = function() {loadCategories();
};

2. indexedDB

IndexedDB 用于在用户的浏览器中存储大量的结构化数据。它是基于事务的数据库系统,可以存储大量的对象,并支持索引、检索、事务等功能。需要注意的是,IndexedDB 数据库属于非关系型数据库。

IndexedDB 是一个事务型的非关系型数据库。它是浏览器提供的本地数据库,可以被网页脚本创建和操作,允许存贮大量数据,提供查找接口,能建立索引,用于在客户端存储大量的结构化数据,也包括文件/二进制大型对象。

2.1. 基本用法

2.1.1. 打开数据库

var request = indexedDB.open('myDatabase', 1);request.onupgradeneeded = function(event) {var db = event.target.result;db.createObjectStore("myObjectStore", { keyPath: 'id' });
};request.onsuccess = function(event) {var db = event.target.result;console.log('Database opened succes

文章转载自:
http://academize.hdqtgc.cn
http://aok.hdqtgc.cn
http://chiropractor.hdqtgc.cn
http://benchman.hdqtgc.cn
http://bucaramanga.hdqtgc.cn
http://babylon.hdqtgc.cn
http://chalkware.hdqtgc.cn
http://canalled.hdqtgc.cn
http://belshazzar.hdqtgc.cn
http://bedecked.hdqtgc.cn
http://alamein.hdqtgc.cn
http://baccalaureate.hdqtgc.cn
http://catalase.hdqtgc.cn
http://aerobics.hdqtgc.cn
http://beetling.hdqtgc.cn
http://archenteric.hdqtgc.cn
http://chernobyl.hdqtgc.cn
http://censorial.hdqtgc.cn
http://atria.hdqtgc.cn
http://carob.hdqtgc.cn
http://appurtenant.hdqtgc.cn
http://cataclasm.hdqtgc.cn
http://boldly.hdqtgc.cn
http://blending.hdqtgc.cn
http://antimonate.hdqtgc.cn
http://buttony.hdqtgc.cn
http://abstentious.hdqtgc.cn
http://brittonic.hdqtgc.cn
http://bicomponent.hdqtgc.cn
http://bidding.hdqtgc.cn
http://www.dtcms.com/a/281587.html

相关文章:

  • Spring Boot全局异常处理:打造坚如磐石的应用防线
  • C++ - 仿 RabbitMQ 实现消息队列--muduo快速上手
  • 【每日刷题】螺旋矩阵
  • 【Python】定时器快速实现
  • 并发编程-volatile
  • Python学习之路(十二)-开发和优化处理大数据量接口
  • git基础命令
  • Redis学习系列之——Redis Stack 拓展功能
  • 为什么市场上电池供电的LoRa DTU比较少?
  • redisson tryLock
  • React源码5 三大核心模块之一:render,renderRoot
  • MMYSQL刷题
  • 北京-4年功能测试2年空窗-报培训班学测开-第五十一天
  • Typecho插件开发:优化文章摘要处理短代码问题
  • 【跟我学YOLO】(2)YOLO12 环境配置与基本应用
  • PID(进程标识符,Process Identifier)是什么?
  • Markdown编辑器--editor.md的用法
  • GTSuite许可管理
  • 学习日志10 python
  • 【鲲苍提效】全面洞察用户体验,助力打造高性能前端应用
  • JAVA青企码协会模式系统源码支持微信公众号+微信小程序+H5+APP
  • vlan作业
  • CommunityToolkit.Mvvm IOC 示例
  • 【Java】JUC并发(线程的方法、多线程的同步并发)
  • 定时器更新中断与串口中断
  • ArrayList列表解析
  • GCC属性修饰符__attribute__((unused))用途
  • 2025国自然青基、面上资助率,或创新低!
  • IPSec和HTTPS对比(一)
  • Java使用itextpdf7生成pdf文档