HTML5系列(7)-- Web Storage 实战指南
前端技术探索系列:HTML5 Web Storage 实战指南 🗄️
致读者:本地存储的新纪元 👋
前端开发者们,
今天我们将深入探讨 HTML5 中的 Web Storage 技术,这是一个强大的本地存储解决方案,让我们能够更高效地管理网页数据。
localStorage 详解 🚀
基础操作
// 存储数据
localStorage.setItem('username', 'Alice');
localStorage.setItem('preferences', JSON.stringify({theme: 'dark',fontSize: '16px'
}));// 读取数据
const username = localStorage.getItem('username');
const preferences = JSON.parse(localStorage.getItem('preferences'));// 删除数据
localStorage.removeItem('username');// 清空所有数据
localStorage.clear();
生命周期与限制 ⏳
- 永久存储,除非手动清除
- 存储限制通常为 5-10 MB
- 同源策略限制
sessionStorage 应用 🔄
会话级存储
// 存储临时会话数据
sessionStorage.setItem('currentPage', '1');
sessionStorage.setItem('searchHistory', JSON.stringify(['前端开发','HTML5','Web Storage'
]));// 页面刷新后数据仍然存在
const currentPage = sessionStorage.getItem('currentPage');
const searchHistory = JSON.parse(sessionStorage.getItem('searchHistory'));
与 localStorage 的关键区别
// localStorage 示例 - 跨标签页可访问
localStorage.setItem('globalCount', '1');// sessionStorage 示例 - 仅在当前标签页可用
sessionStorage.setItem('tabCount', '1');// 数据持久性测试
function testStoragePersistence() {console.log('localStorage:', localStorage.getItem('globalCount')); // 关闭浏览器后仍存在console.log('sessionStorage:', sessionStorage.getItem('tabCount')); // 关闭标签页后消失
}
数据管理最佳实践 💡
数据序列化
// 存储复杂数据结构
const userSettings = {theme: 'dark',notifications: {email: true,push: false},lastLogin: new Date()
};// 序列化存储
function saveSettings(settings) {try {localStorage.setItem('userSettings', JSON.stringify(settings));return true;} catch (e) {console.error('Storage failed:', e);return false;}
}// 反序列化读取
function loadSettings() {try {const settings = JSON.parse(localStorage.getItem('userSettings'));settings.lastLogin = new Date(settings.lastLogin); // 恢复日期对象return settings;} catch (e) {console.error('Loading failed:', e);return null;}
}
安全性考虑
// 敏感数据加密存储
class SecureStorage {static encrypt(data) {// 实际项目中应使用专业的加密库return btoa(JSON.stringify(data));}static decrypt(data) {try {return JSON.parse(atob(data));} catch (e) {console.error('Decryption failed');return null;}}static save(key, data) {localStorage.setItem(key, this.encrypt(data));}static load(key) {const data = localStorage.getItem(key);return data ? this.decrypt(data) : null;}
}
浏览器兼容性 🌐
| 特性 | Chrome | Firefox | Safari | Edge |
|---|---|---|---|---|
| localStorage | ✅ | ✅ | ✅ | ✅ |
| sessionStorage | ✅ | ✅ | ✅ | ✅ |
| 存储限制 | 10MB | 10MB | 5MB | 10MB |
实战项目:本地数据缓存系统 📦
class CacheManager {constructor(prefix = 'app_cache_') {this.prefix = prefix;this.defaultExpiry = 24 * 60 * 60 * 1000; // 24小时}// 存储带过期时间的数据setItem(key, value, expiryMs = this.defaultExpiry) {const item = {value: value,expiry: Date.now() + expiryMs,created: Date.now()};localStorage.setItem(this.prefix + key, JSON.stringify(item));}// 获取数据,自动处理过期逻辑getItem(key) {const item = localStorage.getItem(this.prefix + key);if (!item) return null;const data = JSON.parse(item);if (Date.now() > data.expiry) {this.removeItem(key);return null;}return data.value;}// 删除数据removeItem(key) {localStorage.removeItem(this.prefix + key);}// 获取所有缓存键getAllKeys() {return Object.keys(localStorage).filter(key => key.startsWith(this.prefix)).map(key => key.slice(this.prefix.length));}// 清理过期数据cleanup() {this.getAllKeys().forEach(key => {this.getItem(key); // 会自动检查和清理过期项});}
}// 使用示例
const cache = new CacheManager();// 存储数据
cache.setItem('user', { id: 1, name: 'Alice' });
cache.setItem('temp', { data: 'temporary' }, 5000); // 5秒后过期// 读取数据
const user = cache.getItem('user');
console.log(user); // { id: 1, name: 'Alice' }// 5秒后
setTimeout(() => {const temp = cache.getItem('temp');console.log(temp); // null(已过期)
}, 6000);
性能优化建议 ⚡
-
存储策略
- 避免存储过大数据
- 定期清理过期数据
- 使用前缀避免命名冲突
-
序列化优化
- 压缩大型数据
- 避免频繁序列化操作
- 考虑使用专门的序列化库
-
错误处理
- 捕获配额超限异常
- 实现降级存储方案
- 监控存储使用情况
调试工具推荐 🛠️
- Chrome DevTools Application 面板
- Firefox Storage Inspector
- Storage Manager API
- Web Storage Explorer 插件
写在最后 🌟
Web Storage 为现代 Web 应用提供了强大的本地存储能力。合理使用这些特性,可以显著提升应用性能和用户体验!
如果你觉得这篇文章有帮助,欢迎点赞收藏,也期待在评论区看到你的想法和建议!👇
终身学习,共同成长。
咱们下一期见
💻
相关文章:
HTML5系列(7)-- Web Storage 实战指南
前端技术探索系列:HTML5 Web Storage 实战指南 🗄️ 致读者:本地存储的新纪元 👋 前端开发者们, 今天我们将深入探讨 HTML5 中的 Web Storage 技术,这是一个强大的本地存储解决方案,让我们能…...
【在Linux世界中追寻伟大的One Piece】读者写者问题与读写锁
目录 1 -> 读者写者问题 1.1 -> 什么是读者写者问题 1.2 -> 读者写者与生产消费者的区别 1.3 -> 如何理解读者写者问题 2 -> 读写锁 2.1 -> 读写锁接口 3 -> 读者优先(Reader-Preference) 4 -> 写者优先(Writer-Preference) 1 -> 读者写者…...
用到动态库的程序运行过程
当我们写好了一段代码然后编译运行后会生成可执行文件,该文件会存在磁盘的当前目录下,而当我们开始运行这段程序时,操作系统(加载器)需要将其从磁盘加载进内存然后执行相关操作,而对于用到动态库的程序&…...
类型转换与IO流:C++世界的变形与交互之道
文章目录 前言🎄一、类型转换🎈1.1 隐式类型转换🎈1.2 显式类型转换🎁1. C 风格强制类型转换🎁2. C 类型转换操作符 🎈1.3 C 类型转换操作符详解🎁1. static_cast🎁2. dynamic_cast&…...
Pytorch使用手册- TorchVision目标检测微调Tutorial的使用指南(专题十二)
这篇教程的目标是对一个预训练的 Mask R-CNN 模型进行微调,应用于 Penn-Fudan 行人检测与分割数据集。该数据集包含 170 张图像,里面有 345 个行人实例,我们将通过这个教程来演示如何使用 torchvision 中的新特性,训练一个面向自定义数据集的目标检测和实例分割模型。 注意…...
人工智能机器学习算法分类全解析
目录 一、引言 二、机器学习算法分类概述 (一)基于学习方式的分类 1. 监督学习(Supervised Learning) 2. 无监督学习(Unsupervised Learning) 3. 强化学习(Reinforcement Learning…...
Linux 35.6 + JetPack v5.1.4@DeepStream安装
Linux 35.6 JetPack v5.1.4DeepStream安装 1. 源由2. 步骤Step 1 安装Jetpack 5.1.4 L4T 35.6Step 2 安装依赖组件Step 3 安装librdkafkaStep 4 安装 DeepStream SDKStep 5 测试 deepstream-appStep 6 运行 deepstream-app 3. 总结3.1 版本问题3.2 二进制help 4. 参考资料 1. …...
图数据库 | 11、图数据库架构设计——高性能图存储架构(下)
在上篇内容中,老夫着重讲了高性能图存储系统的特点,咱们继续往下讲重点——高性能存储架构的设计思路!! 2.高性能存储架构设计思路 首先呢,存储架构以及核心数据结构的设计思路通常围绕如下4个维度来进行:…...
【HTTP】HTTP协议
一个Web Server就是个服务器软件(程序),或者是运行这个服务器软件的硬件(计算机),其主要功能是通过HTTP协议与客户端进行通信,来接收,存储,处理来自客户端的HTTP请求&…...
大数据新视界 -- Hive 基于 MapReduce 的执行原理(上)(23 / 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
SpringBoot源码解析(六):打印Banner
SpringBoot源码系列文章 SpringBoot源码解析(一):SpringApplication构造方法 SpringBoot源码解析(二):引导上下文DefaultBootstrapContext SpringBoot源码解析(三):启动开始阶段 SpringBoot源码解析(四):解析应用参数args Sp…...
【计算机网络】实验6:IPV4地址的构造超网及IP数据报
实验 6:IPV4地址的构造超网及IP数据报 一、 实验目的 加深对IPV4地址的构造超网(无分类编制)的了解。 加深对IP数据包的发送和转发流程的了解。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、了解IPV4地址的构造超网…...
easy excel 生成excel 文件
导包 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.3</version> </dependency> 内容 List<类> limspjreport 值; String fileName sdf.format(new Date()) "-…...
Ajax:回忆与节点
一点回忆 面对我的Ajax学习,实现前后端交互,最开始我采用的使用网络寻找intellij IDEA Ultimate破解方法,然后最终成功,然后按照相关教程配置java ee项目,然后中间又去配置了Tomcat服务器,然后又去学习了一…...
Python+OpenCV系列:Python和OpenCV的结合和发展
PythonOpenCV系列:Python和OpenCV的结合和发展 **引言****Python语言的发展****1.1 Python的诞生与发展****1.2 Python的核心特性与优势****1.3 Python的应用领域** **OpenCV的发展****2.1 OpenCV的起源与发展****2.2 OpenCV的功能特性****2.3 OpenCV的应用场景** *…...
Ubuntu20.04 由源码编译安装opencv3.2 OpenCV
Ubuntu20.04 由源码编译安装opencv3.2.0 获取 opencv 及opencv_contrib源代码 创建目录以存放opencv及opencv_contrib源代码 mkdir ~/opencv3.2.0 cd ~/opencv3.2.0获取opencv源代码并切换到对应tag git clone https://github.com/opencv/opencv.git cd opencv git checkou…...
A058-基于Spring Boot的餐饮管理系统的设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看项目链接获取⬇️,记得注明来意哦~🌹 赠送计算机毕业设计600个选题ex…...
RDIFramework.NET CS敏捷开发框架 SOA服务三种访问(直连、WCF、WebAPI)方式
1、介绍 在软件开发领域,尤其是企业级应用开发中,灵活性、开放性、可扩展性往往是项目成功的关键因素。对于C/S项目,如何高效地与后端数据库进行交互,以及如何提供多样化的服务访问方式,是开发者需要深入考虑的问题。…...
Linux——命名管道及日志
linux——进程间通信及管道的应用场景-CSDN博客 文章目录 目录 文章目录 前言 一、命名管道是什么? 理解: 2、编写代码 makefile 管道封装成类,想用中管道时只需要调用实例化 读端 写端 日志 1、日志是什么? 2、日志有什么&#x…...
Flink 常见面试题
1、Flink 的四大特征(基石) checkpoin基于Chandy-Lamport算法实现了分布式一致性快照提供了一致性的语义 state丰富的StateAPI time实现了Watermark机制,乱序数据处理,迟到数据容忍 window开箱即用的滚动,滑动会话窗口…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
Python爬虫实战:研究Restkit库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...
Django RBAC项目后端实战 - 03 DRF权限控制实现
项目背景 在上一篇文章中,我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统,为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...
使用ch340继电器完成随机断电测试
前言 如图所示是市面上常见的OTA压测继电器,通过ch340串口模块完成对继电器的分路控制,这里我编写了一个脚本方便对4路继电器的控制,可以设置开启时间,关闭时间,复位等功能 软件界面 在设备管理器查看串口号后&…...
