HTML5 離線存儲

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…