H5 离线存储-使用 serverWorker 实现
H5 离线存储-使用 serverWorker 实现
离线存储所用技术
serverWorker
serviceWorker 生命周期
install 事件会在 serviceWorker 注册成功时候触发,主要用于缓存资源
activate 事件会在 serviceWorker 激活的时候触发,主要用于删除旧的资源
fetch 事件会在发送请求的时候触发,主要用于操作缓存或者读取网络资源
注意:
如果 sw.js 发生了改变,install 事件会重新触发
activate 事件会在 install 事件后触发,但是如果现在已经存在 serviceWorker,就会处于等待状态直到 serviceWorker 终止
可以通过
self.skipWaiting()方法跳过等待,返回一个 promise 对象可以通过
event.WautUntil()方法扩的参数是一个 promise 对象,会在 promise 结束后才会结束当前生命周期函数,防止浏览器在一步操作之前就停止了生命周期serviceWorker 激活后,会在下一次刷新页面的时候生效,可以通过
self.clients.claim()立即活的控制权
//在index.html 注册serverWorker方法
// 网页加载完成时注册
window.addEventListener("load", () => {
// 能力检测
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("./sw.js").then((res) => {
console.log(res);
});
}
});
//serverWorker 相关事件
self.addEventListener("install", (event) => {
console.log("install", event);
//skipWaiting 会让serviceworker跳过等待,直接进入activate
//waitUntil 等待skipWaiting结束才进入到activate
event.waitUntil(self.skipWaiting());
});
self.addEventListener("activate", (event) => {
console.log("activate", event);
// 表示service worker激活后,立即活的控制权
event.waitUntil(self.clients.claim());
});
//fetch事件会在请求发送的时候触发
self.addEventListener("fetch", (event) => {
console.log("fetch", event);
});
cache storage
cacheStorage 接口表示 Cache 对象的储存,配合 service worker 来实现资源的缓存
- cache api 类似于数据库的操作
- caches.open(cacheName).then(res=>{}),用于打开缓存,返回 一个匹配 cacheName 的 cache 对象的 Promise,类似于连接数据库
- caches.key() 返回一个 promise 对象,包括所有的缓存 key
- caches.delete(key) 根据 key 删除对应的缓存
- cache 对象常用方法:
- cache 接口为缓存的 Request/Response 对象对提供存储机制
- cache.put(req,res)把请求当成 key,并且把对应的响应存储起来
- cache.add(url)根据 url 发起请求,并且吧响应结果储存起来
- cache.addAll(urls) 抓取一个 url 数组,并且把结果都储存起来
- cache.match(req) 获取 req 对应的 response
实现离线存储
注册 serverWorker
// 网页加载完成时注册
window.addEventListener("load", async () => {
// 能力检测
if ("serviceWorker" in navigator) {
try {
const registration = await navigator.serviceWorker.register(
"./assets/sw.js"
);
console.log("注册成功");
} catch (error) {
console.log("注册失败", error);
}
}
});
</script>
注意:
- 需要在网页加载完成是注册,防止与其他资源竞争,影响网页的正常使用。
- serverWorker 只能适用于 HTTPS 中或者 localhost
设置缓存内容
在 serverWorker 的 install 事件中设置缓存内容
//sw.js 内容
//设置缓存名字 用于版本比较删除之前的cache
const CACHE_NAME = "cache_name_v1";
self.addEventListener("install", async (event) => {
// 开启一个cache 得到一个cache对象
const cache = await caches.open(CACHE_NAME);
// 等待cache把所有的资源存储
await cache.addAll([
"/",
"/manifest.json",
"/img/icon.png",
"/css/index.css",
"/js/index.js",
]);
// 等待skipWaiting结束才进入到activate
await self.skipWaiting();
});
清除旧的缓存
在 activate 中检测储存版本是否一致,不一致删除旧的缓存
//sw.js 内容
// 主要清除旧的缓存
self.addEventListener("activate", async (event) => {
const keys = await caches.keys();
// 判断key 删除旧的资源
keys.forEach((key) => {
if (key !== CACHE_NAME) {
caches.delete(key);
}
});
// 表示service worker激活后,立即活的控制权
await self.clients.claim();
});
离线读取 cache
fetch 事件 会在请求发送的时候触发,在 fetch 事件中,判断资源是否能够请求成功,如果能请求成功,就响应成功的结果,如果断网,请求失败了,读取 cache 缓存即可
//sw.js 内容
self.addEventListener("fetch", (event) => {
const req = event.request;
event.respondWith(networkFirst(req));
});
// 网络优先
async function networkFirst(req) {
try {
// 优先网络读取最新的资源
const fresh = await fetch(req);
return fresh;
} catch (e) {
// 去缓存中读取
const cache = await caches.open(CACHE_NAME);
const cached = await cache.match(req);
return cached;
}
}
注意
- 缓存内容可以在浏览器开发者工具->application->缓存 中查看当前设置缓存
H5 离线存储-使用 serverWorker 实现的更多相关文章
- H5离线存储
如何使用 首先,我们建立一个html文件,类似这样: <!DOCTYPE html> <html lang="en" manifest="manifes ...
- H5离线存储-manifest
起源 html5之前的网页,都是无连接,必须联网才能访问,这其实也是web的特色,这其实对于PC是时代问题并不大,但到了移动互联网时代,设备终端位置不再固定,依赖无线信号,网络的可靠性变得降低,比如坐 ...
- h5 离线存储
- Atitit.h5 web webview性能提升解决方案-----fileStrore缓存离线存储+http方案
Atitit.h5 web webview性能提升解决方案-----fileStrore缓存离线存储+http方案 1. 业务场景 android+webview h5 css背景图性能提升1 2. ...
- AppCache 离线存储 应用程序缓存 API 及注意事项
使用ApplicationCache接口实现离线缓存 原文:http://www.mb5u.com/HTML5/html5_96464.html 推荐:html5 application cache遇 ...
- H5离线缓存技术Application Cache
H5离线缓存技术Application Cache 1.离线缓存技术:是浏览器本身的一种机制 HTML5引入Application Cache(应用程序缓存)技术,离线存储可以将站点的一些文件存储在本 ...
- H5 离线缓存的用法
H5离线缓存基础系列 1.什么是离线缓存 离线缓存:离线缓存可以将站点的一些文件缓存到本地,它是浏览器自己的一种机制,将需要的文件缓存下来,以便后期即使没有连接网络,被缓存的页面也可以展示. 2. ...
- H5本地存储(转)
H5本地存储 一.本地存储由来的背景 众所周知Html4时代Cookie的大小.格式.存储数据格式等限制,网站应用如果想在浏览器端存储用户的部分信息,那么只能借助于Cookie.但是 ...
- 吓哭原生App的HTML5离线存储技术,却出乎意料的容易!【低调转载】
吓哭原生App的HTML5离线存储技术,却出乎意料的容易![WeX5低调转载] 2015-11-16 lakb248 起步软件 近几天,WeX5小编编跟部分移动应用从业人士聊了聊,很多已经准备好全面拥 ...
随机推荐
- js 最简单的发布订阅模式
let _subscriber: any; function autorun(subscriber: Function) { _subscriber = subscriber; _subscriber ...
- NGK Baccarat流动性挖矿打造DeFi新风口
2020年,DEFI成为了区块链领域最热门的概念之一.它就像乐高积木,将原来的金融模块,以不同的智能合约来实现.智能合约又以全新的方式将不同的金融功能拼接在一起,以创造出全新的金融产品. NGK.IO ...
- 你真的知道typeof null的结果为什么是‘object‘吗?
到目前为止,ECMAScript 标准中定义了8种数据类型,它们分别是Undefined.Null.Number.Boolean.String.Symbol.BigInt.Object. 为了判断变量 ...
- 创建gitHub账户并配置秘钥
1. 登录注册地址 https://github.com/ 2.点击注册 Sign up 3.输入邮箱 密码 进行注册 4.注册成功后,登录邮箱验证 .然后通过邮箱和密码登录gitHub.设置 set ...
- DOM及相关操作
1.背景介绍 什么是DOM?简单地说,DOM是一套对文档的内容进行抽象和概念化的方法, 在现实世界里,人们对所谓的'世界对象模型'都不会陌生,例如,当用'汽车'.'房子'和'树'等名词来 ...
- java基础学习——Swing图形化用户界面编程
原文链接:https://blog.csdn.net/yiziweiyang/article/details/52317240 链接有详细解释,也有例子,以下是个人参照例子实验的代码. package ...
- JS中try catch的用法
在js中也可以使用try/catch语法,把可能发生异常的代码使用try包裹起来,然后在catch中对异常进行处理,处理后就不会影响后面代码的执行. const a = null try { cons ...
- 死磕Spring之IoC篇 - Bean 的创建过程
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...
- MySQL 异常有这一篇就够了!
摘要:在本文中,总结了开发过程中最为常见的几种 MySQL 抛出的异常以及如何解决,包括高版本驱动的问题.时区配置问题.SSL 连接问题等,是一篇经验总结贴. 前言 在本文中,总结了开发过程中最为常见 ...
- 在Linux中安装MariaDB并添加远程访问
在Linux中安装MariaDB并添加远程访问 最近学习到了数据库部分,因为有一台台式机一台笔记本换着用,就没有把数据库安装在本机,本来打算用之前买的虚拟空间的数据库的,结果速度太慢用起来太难受了,就 ...