外观
外观
耶温
2307字约8分钟
2024-05-11
Progressive Web App:渐进式 Web 应用,提升页面浏览体验。可以将一个网页单独安装在桌面,并且可以将资源和请求缓存保存在本地,可以再断网的情况下继续访问。
manifest:Web 应用程序清单在一个 JSON 文本文件中提供有关应用程序的信息(如名称,作者,图标和描述)。manifest 的目的是将 Web 应用程序安装到设备的主屏幕,为用户提供更快的访问和更丰富的体验
基本介绍:
manifest
是 PWA 技术集合中的一部分
manifest
可以让网站安装到设备的主屏幕,而不需要用户通过应用商店下载
manifest
在一个 JSON 文本文件中提供有关应用程序的信息(名称,作者,图标和描述等等)
传统的 web app 入口
Web app manifest:
使用步骤:
<link rel="manifest" href="manifest.json" />
manifest.json
常见配置清单
示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PWA测试</title>
<link rel="manifest" href="manifest.json" />
</head>
<body>
<h1>PWA测试</h1>
</body>
</html>
{
"lang": "zh-cn",
"name": "PWA测试",
"short_name": "PWA测试",
"description": "PWA测试",
"start_url": "/",
"background_color": "#2f3d58",
"theme_color": "#2f3d58",
"orientation": "any",
"display": "standalone",
"icons": [
{
"src": "/logo.png",
"sizes": "144x144"
}
]
}
manifest.json
中的icons属性记得配置,不然可能没有安装到桌面图标。
可以在启动台查看
基本介绍
http://localhost
service worker 和 web worker
var worker = new Worker('work.js')
self.postMessage(msg)
给主线程发消息worker.onmessage=function(msg){}
监听消息if('serviceWorker in navigator'){}
navigator.serviceWorker.register('./sw.js')
,返回一个 promise 对象<script>
//需要在localhost 或者 HTTPS中才能使用
// 网页加载完成时注册
window.addEventListener("load", () => {
// 能力检测
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("./sw.js").then((res) => {
console.log(res);
});
}
});
</script>
service worker 生命周期事件
self.skipWaiting()
方法跳过等待,返回一个 promise 对象self.clients.claim()
立即获得控制权self.addEventListener("install", (event) => {
console.log("install", event);
});
self.addEventListener("activate", (event) => {
console.log("activate", event);
});
self.addEventListener("fetch", (event) => {
console.log("fetch", event);
});
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);
});
在 service worker 如果想要发送请求,必需使用 fetch api
基本使用:
fetch("./manifest.json")
.then((res) => {
return res.json();
})
.then((data) => {
console.log(data);
});
cacheStorage 接口表示 Cache 对象的储存,配合 service worker 来实现资源的缓存
开启缓存:
<!-- index.html -->
<script>
// 网页加载完成时注册
window.addEventListener("load", async () => {
// 能力检测
if ("serviceWorker" in navigator) {
try {
const registration = await navigator.serviceWorker.register("/sw.js");
console.log("注册成功");
} catch (error) {
console.log("注册成功", error);
}
}
});
</script>
//sw.js
// 主要用来缓存内容
const CACHE_NAME = "cache_v1";
self.addEventListener("install", async (event) => {
// 开启一个cache 得到一个cache对象
const cache = await caches.open(CACHE_NAME);
// 等待cache把所有的资源存储
await cache.addAll(["/", "/img/icon.png", "/manifest.json", "/index.css"]);
// 会让service worker跳过等待,直接进入activate
// 等待skipWaiting结束才进入到activate
await self.skipWaiting();
});
// 主要清除旧的缓存
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();
});
// fetch事件 会在请求发送的时候触发
// 判断资源是否能够请求成功,如果能请求成功,就响应成功的结果,如果断网,请求失败了,读取cache缓存即可
self.addEventListener("fetch", (event) => {
// console.log('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;
}
}
Notification.requestPermission()
可以请求用户的授权new Notification('title',{body:'',icon:''})
可以显示通知self.registration.showNotification('你好',{body:'msg'})
// 通知消息
if (Notification.permission === "default") {
Notification.requestPermission();
}
if (navigator.onLine) {
new Notification("提示", {
body: "欢迎使用耶温记账本~,此应用为PWA应用支持离线使用~",
});
}