2020-09-04 02:18:32
使用 Service Worker 实现 H5 离线缓存的核心是通过后台脚本管理缓存资源,拦截网络请求并提供离线支持。以下是具体实现步骤和关键代码说明:
实现原理Service Worker 通过四个阶段实现离线缓存:
新建 sw.js,定义生命周期事件处理程序:
// 缓存名称const CACHE_NAME = 'my-cache-v1';// 需缓存的资源列表const urlsToCache = [ '/', '/index.html', '/styles.css', '/scripts.js', '/images/logo.png'];// 安装阶段:初始化缓存self.addEventListener('install', (event) => { event.waitUntil( caches.open(CACHE_NAME) .then((cache) => cache.addAll(urlsToCache)) );});// 激活阶段:清理旧缓存self.addEventListener('activate', (event) => { event.waitUntil( caches.keys().then((cacheNames) => { return Promise.all( cacheNames.map((cacheName) => { if (cacheName !== CACHE_NAME) { return caches.delete(cacheName); } }) ); }) );});// 拦截请求:优先返回缓存self.addEventListener('fetch', (event) => { event.respondWith( caches.match(event.request) .then((response) => { // 缓存命中则返回,否则发起网络请求 return response || fetch(event.request); }) );});2. 注册 Service Worker在 index.html 中注册脚本,确保作用域覆盖目标页面:
<script> if ('serviceWorker' in navigator) { window.addEventListener('load', () => { navigator.serviceWorker.register('/sw.js') .then((registration) => { console.log('ServiceWorker 注册成功:', registration.scope); }) .catch((error) => { console.log('ServiceWorker 注册失败:', error); }); }); }</script>关键代码解析通过上述步骤,可实现一个基础的 H5 离线缓存系统,显著提升用户体验和数据安全性。