HTML5 离线存储(通常指 Application Cache)是早期用于实现 Web 应用离线访问的技术,但由于其设计缺陷已被废弃。现代 Web 开发中,取而代之的是更强大的 Service Worker + Cache API 方案(属于 Progressive Web Apps 技术栈)。下面详细解析两者:


一、已被废弃的 Application Cache (AppCache)

1. 基本原理
  • 通过一个 manifest 清单文件(如 app.manifest)声明需要缓存的资源。
  • 浏览器根据清单下载资源并存储在离线缓存中。
2. 使用步骤
<!-- 在 html 标签中声明 manifest 文件 -->
<html manifest="app.manifest">

app.manifest 文件示例

CACHE MANIFEST
# v1.0.0  → 版本号(更新缓存需修改此号)CACHE:    # 需要缓存的资源
/css/style.css
/js/app.js
/images/logo.png
/index.htmlNETWORK:  # 必须在线访问的资源(白名单)
/api/
/loginFALLBACK: # 离线时替代方案
/offline.html     # 所有失败请求的兜底页面
/images/ /images/offline.png # 特定路径的替代
3. 主要问题(被废弃原因)
  • 更新机制不透明:必须修改 manifest 文件(如版本号)才能触发更新。
  • 白名单机制死板NETWORKFALLBACK 规则难以维护。
  • 缓存污染风险:一旦缓存失败,可能导致整个应用无法使用。
  • 无细粒度控制:无法编程式管理缓存。
  • 并发问题:多标签页同时更新可能冲突。

⚠️ 现代浏览器已移除支持(Chrome 70+、Firefox 46+ 等弃用)。


二、现代方案:Service Worker + Cache API

核心优势
  • 完全可编程:通过 JavaScript 精细控制缓存逻辑。
  • 后台运行:独立于主线程,不阻塞页面渲染。
  • 拦截网络请求:可自定义缓存策略(如网络优先/缓存优先)。
1. 实现步骤
(1) 注册 Service Worker
<!-- 在页面中注册 -->
<script>
if ('serviceWorker' in navigator) {navigator.serviceWorker.register('/sw.js').then(reg => console.log('SW 注册成功')).catch(err => console.error('SW 注册失败', err));
}
</script>
(2) 编写 Service Worker 脚本 (sw.js)
// 定义缓存名称(版本更新时修改此名)
const CACHE_NAME = 'my-app-v1';// 需要预缓存的资源
const PRE_CACHE = ['/','/index.html','/css/main.css','/js/app.js','/images/hero.jpg'
];// 安装阶段:预缓存关键资源
self.addEventListener('install', event => {event.waitUntil(caches.open(CACHE_NAME).then(cache => cache.addAll(PRE_CACHE)));
});// 激活阶段:清理旧缓存
self.addEventListener('activate', event => {event.waitUntil(caches.keys().then(cacheNames => {return Promise.all(cacheNames.map(name => {if (name !== CACHE_NAME) return caches.delete(name);}));}));
});// 拦截请求:自定义缓存策略
self.addEventListener('fetch', event => {event.respondWith(// 策略1:缓存优先(适用于静态资源)caches.match(event.request).then(cachedResponse => {if (cachedResponse) return cachedResponse;// 策略2:网络请求并缓存(适用于动态内容)return fetch(event.request).then(response => {// 只缓存成功响应if (!response || response.status !== 200) return response;const responseToCache = response.clone();caches.open(CACHE_NAME).then(cache => cache.put(event.request, responseToCache));return response;});}));
});
2. 关键特性
功能实现方式
预缓存install 事件中使用 cache.addAll()
动态缓存fetch 事件中通过 cache.put() 缓存网络响应
缓存策略可自由实现:缓存优先/网络优先/增量更新等
缓存清理activate 事件中删除旧缓存
离线回退fetch 事件中返回兜底内容(如离线页面)
3. 常用缓存策略
// 1. 缓存优先(适合静态资源)
caches.match(request).then(cached => cached || fetch(request))// 2. 网络优先(适合频繁更新数据)
fetch(request).catch(() => caches.match(request))// 3. 增量更新(先返回缓存,再更新缓存)
event.respondWith(caches.match(request));
event.waitUntil(fetch(request).then(response => cache.put(request, response))
);
4. 调试与更新
  • 调试:Chrome DevTools → Application → Service Workers
  • 更新机制
    1. 修改 Service Worker 文件(即使1字节变化)
    2. 新 SW 安装后处于 waiting 状态
    3. 通过 skipWaiting() 强制激活或关闭所有页面后生效

三、最佳实践

  1. 仅缓存必要资源:避免占用过多存储空间。
  2. 设置缓存过期:定期清理旧缓存。
  3. 提供离线回退:如返回离线页面或默认图片。
  4. 结合 IndexedDB:存储结构化数据(如用户设置)。
  5. 使用 Workbox:Google 官方库,简化 Service Worker 开发:
import {precacheAndRoute} from 'workbox-precaching';
precacheAndRoute([...]); // 自动生成缓存清单

四、浏览器兼容性

  • Service Worker:Chrome 40+、Firefox 44+、Edge 17+、Safari 11.1+
  • Cache API:同 Service Worker 支持范围
  • 安全要求:必须使用 HTTPS(本地开发允许 localhost

总结对比

特性Application Cache (废弃)Service Worker + Cache API
控制粒度声明式(manifest文件)编程式(JavaScript)
更新机制手动修改 manifest文件内容变化自动更新
请求拦截❌ 不支持✅ 完全控制网络请求
后台同步❌ 不支持✅ 支持后台同步(Background Sync)
缓存策略灵活性极低极高(可自定义逻辑)
现代浏览器支持已废弃广泛支持

💡 现代 Web 离线存储应优先使用 Service Worker,它提供了更强大、灵活的离线能力,是 PWA(渐进式 Web 应用)的核心技术之一。

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

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

相关文章

JavaScript 性能优化实战:深入性能瓶颈,精炼优化技巧与最佳实践

前言 现代前端开发&#xff0c;不仅要“能跑”&#xff0c;更要“跑得快”。在用户体验为王的时代&#xff0c;JavaScript 性能优化已经成为前端工程师的必修课。 为什么要关注 JavaScript 性能 加载缓慢 → 用户流失卡顿滞后 → 交互体验崩溃资源浪费 → 设备电量与内存被吞…

文心4.5开源背后的战略棋局:百度为何选择All in开放?

文章目录引言&#xff1a;一场颠覆AI行业格局的孤注国内开源模型的崛起与威胁国际竞争格局的重塑1.技术维度&#xff1a;开源是突破模型性能瓶颈的“加速器”1.1 闭源模型的“内卷化”困境1.2 文心4.5的开源技术架构&#xff1a;从“黑箱”到“乐高”1.2.1文心4.5的技术创新1.2…

SAP学习笔记 - 开发46 - RAP开发 Managed App Metadata Extension 2 - Booking_M,BookSuppl_M

上一章讲了 RAP开发中&#xff0c;New Service Definition&#xff0c;Metadata Extension&#xff0c;在Metadata 文件中 复习了 lineItem&#xff0c;selectionField&#xff0c;Search&#xff0c;ObjectModel&#xff0c;Value Help&#xff0c;headerInfo 等内容。 SAP学…

# Win11开机卡死?无法进入登录界面?3招强制进安全模式,快速修复系统

Win11开机卡死&#xff1f;无法进入登录界面&#xff1f;3招强制进安全模式&#xff0c;快速修复系统一、问题描述&#xff1a; 当你的win11电脑开机后卡在图片界面就死机&#xff0c;无法进入登录界面&#xff0c;不显示windows徽标&#xff0c;不能正常启动&#xff0c;可能的…

快捷支付与网关支付:两种主流支付方式的深度解析

在当今数字化支付时代&#xff0c;快捷支付和网关支付作为两种主流的电子支付方式&#xff0c;为消费者和商家提供了多样化的支付选择。本文将深入探讨这两种支付方式的区别、适用场景及各自的优劣势&#xff0c;帮助您更好地理解现代支付生态。一、快捷支付&#xff1a;便捷高…

【WRFDA数据教程第一期】LITTLE_R 格式详细介绍

目录LITTLE_R 格式概述LITTLE_R 的结构1-Header Record 详解&#xff1a;观测的“身份证”2-Data Record&#xff1a;观测数据本体3-Ending Record&#xff1a;终止标志4-Tail Integers&#xff1a;尾部校验字段另-Missing Values&#xff08;缺测值处理&#xff09;Mandatory,…

一文读懂循环神经网络—从零实现长短期记忆网络(LSTM)

目录 一、遗忘门&#xff08;Forget Gate&#xff09;&#xff1a;决定 “该忘记什么” 二、输入门&#xff08;Input Gate&#xff09;&#xff1a;决定 “该记住什么新信息” 三、输出门&#xff08;Output Gate&#xff09;&#xff1a;决定 “该输出什么” 四、候选记忆…

FreeRTOS之链表关键数据结构和函数操作接口-1

FreeRTOS之链表操作相关接口1 FreeRTOS源码下载地址2 任务控制块TCB2.1 任务控制块TCB2.1.1 任务控制块的关键成员2.1.2 TCB 的核心作用2.2 ListItem_t2.3 List_t3 函数接口3.1 vListInitialise3.2 vListInitialiseItem1 FreeRTOS源码下载地址 https://www.freertos.org/ 2 …

OpenVela之 Arch Timer 驱动框架使用指南

一、概述 在嵌入式系统开发中&#xff0c;定时器是实现任务调度、精确延时等功能的核心组件。Arch Timer 作为基于 Timer Driver 实现的间隔定时器&#xff0c;在系统调度中扮演着重要角色。本文将全面介绍 Arch Timer 驱动框架&#xff0c;从基本概念到实际应用&#xff0c;帮…

AAC编解码

AAC&#xff08;Advanced Audio Coding&#xff0c;高级音频编码&#xff09;是一种基于心理声学原理的有损音频编解码技术&#xff0c;广泛应用于流媒体、数字广播、移动音频等场景。其编解码流程围绕 “保留人耳可感知信息、去除冗余” 设计&#xff0c;分为编码&#xff08;…

STM32 | HC-SR04 超声波传感器测距

模块&#xff1a;HC-SR04感应角度&#xff1a;不大于15度 探测距离&#xff1a;2cm-450cm 高精度&#xff1a;可达0.3cmTrig&#xff1a;触发信号&#xff0c;接收MCU发送的控制脉冲&#xff0c;MCU对应GPIO 设置为输出Echo&#xff1a;反馈信号&#xff0c;向MCU发送数据…

【RTSP从零实践】12、TCP传输H264格式RTP包(RTP_over_TCP)的RTSP服务器(附带源码)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

【unitrix】 6.1 类型化整数特征(t_int.rs)

一、源码 这段代码定义了一个 Rust 特征&#xff08;trait&#xff09;TInt 和一些实现&#xff0c;用于表示类型化的整数。 use crate::number::{Null, B, Bit, TNumber};/// 类型化整数标记特征 /// /// 要求&#xff1a; /// - 实现 TNumber /// - 可复制 (Copy) /// - 默认…

速通LVS

一、LVS的使用lvs部署命令介绍lvs软件相关信息&#xff1a;程序包&#xff1a;ipvsadm Unit File: ipvsadm.service 主程序&#xff1a;/usr/sbin/ipvsadm 规则保存工具&#xff1a;/usr/sbin/ipvsadm-save 规则重载工具&#xff1a;/usr/sbin/ipvsadm-restore 配置文件&#x…

Nginx,MD5和Knife4j

一、 Nginx: 项目网关与流量调度核心原理反向代理 (Reverse Proxy):在Web架构中&#xff0c;Nginx作为系统的统一入口&#xff08;API网关&#xff09;&#xff0c;接收所有外部客户端请求。它通过解析请求的URL路径&#xff08;location指令&#xff09;&#xff0c;判断请求的…

多态,内部类(匿名内部类),常用API(1)

多态 什么是多态&#xff1f; 同一个对象在不同时刻表现出来的不同形态&#xff08;多种形态&#xff09; 例&#xff1a;Cat extends Animal 第一种形态&#xff1a;Cat c1 new Cat(); //c1是只猫 第二种形态&#xff1a;Animal c2 new Cat(); //c2是个动物 &#xff08…

Qt小组件 - 7 SQL Thread Qt访问数据库ORM

简介网上关于Qt访问数据库的资料大多使用QSqlDatabase模块。虽然这在C中尚可接受&#xff0c;但在Python中使用就显得过于繁琐了——不仅要手动编写SQL语句&#xff0c;还与Python追求简洁的理念背道而驰。在这里写一个基于sqlalchemy的示例&#xff0c;也可以使用其他的ORM库 …

使用Gin框架构建高并发教练预约微服务:架构设计与实战解析

项目概述 技术栈 Web框架&#xff1a;Gin&#xff08;高性能HTTP框架&#xff09;数据存储&#xff1a;Redis&#xff08;内存数据库&#xff0c;用于高并发读写&#xff09; 项目结构 coach-booking-service ├── main.go # 程序入口&#xff0c;路由初始化&am…

深入拆解Spring第二大核心思想:AOP

什么是AOP Aspect Oriented Programming&#xff08;面向切面编程&#xff09; 什么是面向切面编程呢? 切⾯就是指某⼀类特定问题, 所以AOP也可以理解为面向特定方法编程. 什么是面向特定方法编程呢? 比如对于"登录校验", 就是⼀类特定问题. 登录校验拦截器, 就是…

linux服务器stress-ng的使用

安装方法 • Ubuntu/Debian&#xff1a;sudo apt update && sudo apt install stress-ng -y• CentOS/RHEL&#xff08;需EPEL源&#xff09;&#xff1a;sudo yum install epel-release -ysudo yum install stress-ng -y• 源码编译&#xff08;适合定制化需求&#x…