那么,我们如何返回 request 呢,下面 就是一个例子 :
self.addEventListener('fetch', function(event) { event.respondWith( caches.match(event.request) .then(function(response) { // Cache hit - return response if (response) { return response; } return fetch(event.request); } ) );});
上面的代码里我们定义了 fetch 事件,在 event.respondWith 里,我们传入了一个由 caches.match产生的 promise.caches.match 查找 request 中被 service worker 缓存命中的 response 。
如果我们有一个命中的 response ,我们返回被缓存的值,否则我们返回一个实时从网络请求 fetch 的结果 。
6、sw-toolbox
当然,我也可以使用第三方库,例如:lishaoy.net 使用了 sw-toolbox 。
sw-toolbox 使用非常简单,下面 就是 lishaoy.net 的一个例子 :
"serviceWorker" in navigator ? navigator.serviceWorker.register('/sw.js').then(function () { navigator.serviceWorker.controller ? console.log("Assets cached by the controlling service worker.") : console.log("Please reload this page to allow the service worker to handle network operations.") }).catch(function (e) { console.log("ERROR: " + e) }) : console.log("Service workers are not supported in the current browser.")
以上是 注册 一个 service woker 。
"use strict";(function () { var cacheVersion = "20180527"; var staticImageCacheName = "image" + cacheVersion; var staticAssetsCacheName = "assets" + cacheVersion; var contentCacheName = "content" + cacheVersion; var vendorCacheName = "vendor" + cacheVersion; var maxEntries = 100; self.importScripts("/lib/sw-toolbox/sw-toolbox.js"); self.toolbox.options.debug = false; self.toolbox.options.networkTimeoutSeconds = 3; self.toolbox.router.get("/images/(.*)", self.toolbox.cacheFirst, { cache: { name: staticImageCacheName, maxEntries: maxEntries } }); self.toolbox.router.get('/js/(.*)', self.toolbox.cacheFirst, { cache: { name: staticAssetsCacheName, maxEntries: maxEntries } }); self.toolbox.router.get('/css/(.*)', self.toolbox.cacheFirst, { cache: { name: staticAssetsCacheName, maxEntries: maxEntries } ...... self.addEventListener("install", function (event) { return event.waitUntil(self.skipWaiting()) }); self.addEventListener("activate", function (event) { return event.waitUntil(self.clients.claim()) })})();
就这样搞定了 (具体的用法可以去 https://googlechromelabs.github.io/sw-toolbox/api.html#main 查看) 。
有的同学就问, service worker 这么好用,这个缓存空间到底是多大?其实,在Chrome可以看到,如图:
文章插图
可以看到,大概有 30G ,我的站点只用了 183MB ,完全够用了。
最后,来两张图:
文章插图
文章插图
由于,文章篇幅过长,后续还会继续总结 架构 方面的优化,例如:
- bigpipe分块输出
- bigrender分块渲染
- ...
- requestAnimationFrame
- well-change
- 硬件加速 GPU
- ...
- PageSpeed
- audits
- ...
转发链接:segmentfault.com/a/1190000015052545
推荐阅读
- 从模拟接口到8K传输 显卡接口这些年变得太多
- 显示器高刷屏比低刷屏到底强多少?看这一目了然
- 因为迟到被扣工资合理吗 公务员上班迟到会怎样处理
- 吃什么去火 13种中草药去火有神效
- 导游|小饭店老板/导游皆沦为2022十大最困难职业,前三名你肯定想不到
- 芯片|芯片产能短期难以恢复:ASML称到2023年仍将紧张
- 电话|男子裸聊险被骗4800元:报警后接到缅甸来电破口大骂
- 巧克力|女生花5万买巧克力送校友被网暴 本人回应:从未后悔、清者自清
- 《王者荣耀》到贵7大概多少钱?
- 鸡子酒的功效与作用