在开发者工具中的 Application tab 左边有 Manifest 选项 , 你可以验证你的 manifest JSON 文件 , 并提供了 “Add to homescreen” 。

文章插图
2020042301.png
2.3 第三步:创建一个 Service WorkerService Worker 是拦截和响应你的网络请求的编程接口 。这是一个位于你根目录的一个单独的 JAVAscript 文件 。
你的 js 文件(在示例代码中是 /js/main.js)可以检查是否支持 Service Worker , 并且注册:
if ('serviceWorker' in navigator) {// register service workernavigator.serviceWorker.register('/service-worker.js');}如果你不需要离线功能 , 可以简单的创建一个空的 /service-worker.js文件 —— 用户会被提示安装你的 app 。Service Worker 很复杂 , 你可以修改示例代码来达到自己的目的 。这是一个标准的 web worker , 浏览器用一个单独的线程来下载和执行它 。它没有调用 DOM 和其他页面 api 的能力 , 但他可以拦截网络请求 , 包括页面切换 , 静态资源下载 , ajax请求所引起的网络请求 。
这就是需要 HTTPS 的最主要的原因 。想象一下第三方代码可以拦截来自其他网站的 service worker , 将是一个灾难 。
service worker 主要有三个事件: install , activate 和 fetch 。
Install 事件这个事件在app被安装时触发 。它经常用来缓存必要的文件 。缓存通过 Cache API来实现 。
首先 , 我们来构造几个变量:
- 缓存名称(CACHE)和版本号(version) 。你的应用可以有多个缓存但是只能引用一个 。我们设置了版本号 , 这样当我们有重大更新时 , 我们可以更新缓存 , 而忽略旧的缓存 。
- 一个离线页面的URL(offlineURL) 。当离线时用户试图访问之前未缓存的页面时 , 这个页面会呈现给用户 。
- 一个拥有离线功能的页面必要文件的数组(installFilesEssential) 。这个数组应该包含静态资源 , 比如 css 和 JavaScript 文件 , 但我也把主页面(/)和图标文件写进去了 。如果主页面可以多个URL访问 , 你应该把他们都写进去 , 比如/和/index.html 。注意 , offlineURL也要被写入这个数组 。
- 可选的 , 描述文件数组(installFilesDesirable) 。这些文件都很会被下载 , 但如果下载失败不会中止安装 。
// configurationconstversion = '1.0.0',CACHE = version + '::PWAsite',offlineURL = '/offline/',installFilesEssential = ['/','/manifest.json','/css/styles.css','/js/main.js','/js/offlinepage.js','/images/logo/logo152.png'].concat(offlineURL),installFilesDesirable = ['/favicon.ico','/images/logo/logo016.png','/images/hero/power-pv.jpg','/images/hero/power-lo.jpg','/images/hero/power-hi.jpg'];installStaticFiles()方法添加文件到缓存 , 这个方法用到了基于 promise的 Cache API 。当必要的文件都被缓存后才会生成返回值 。// install static assetsfunction installStaticFiles() {return caches.open(CACHE).then(cache => {// cache desirable filescache.addAll(installFilesDesirable);// cache essential filesreturn cache.addAll(installFilesEssential);});}最后 , 我们添加install的事件监听函数 。waitUntil方法确保所有代码执行完毕后 , service worker 才会执行 install 。执行 installStaticFiles()方法 , 然后执行 self.skipWaiting()方法使service worker进入 active状态 。// application installationself.addEventListener('install', event => {console.log('service worker: install');// cache core filesevent.waitUntil(installStaticFiles().then(() => self.skipWaiting()));});Activate 事件当 install完成后 , service worker 进入active状态 , 这个事件立刻执行 。你可能不需要实现这个事件监听 , 但是示例代码在这里删除老旧的无用缓存文件:// clear old cachesfunction clearOldCaches() {return caches.keys().then(keylist => {return Promise.all(keylist.filter(key => key !== CACHE).map(key => caches.delete(key)));});}// application activatedself.addEventListener('activate', event => {console.log('service worker: activate');// delete old cachesevent.waitUntil(clearOldCaches().then(() => self.clients.claim()));});
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 如何快速处理mysql连接数占满的问题?
- Go的泛型真的要来了—如何使用以及它们是怎么工作的
- 把猫送人了猫会伤心吗?
- Mysql 单表适合的最大数据量是多少?如何优化其性能?
- 在 Excel 中如何正确输入身份证号?
- 网站推广如何应对劲风算法?劲风算法又是什么?
- PDF如何转Excel?PDF转Excel的操作方法!
- 如何在淘宝网开店步骤 淘宝开网店需要注意什么
- 如何识别洛神花加色素,洛神花茶的功效及其作用
- 淘宝怎样升级最新版本 淘宝如何快速升级
