从 10 多秒到 1.05 秒!前端性能优化实践( 五 )


那么,我们如何返回 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可以看到,如图:

从 10 多秒到 1.05 秒!前端性能优化实践

文章插图
 
可以看到,大概有 30G ,我的站点只用了 183MB ,完全够用了。
最后,来两张图:
从 10 多秒到 1.05 秒!前端性能优化实践

文章插图
 

从 10 多秒到 1.05 秒!前端性能优化实践

文章插图
 
由于,文章篇幅过长,后续还会继续总结 架构 方面的优化,例如:
  • bigpipe分块输出
  • bigrender分块渲染
  • ...
以及,渲染 方面的优化,例如:
  • requestAnimationFrame
  • well-change
  • 硬件加速 GPU
  • ...
以及,性能测试工具,例如:
  • PageSpeed
  • audits
  • ...
作者:子木
转发链接:segmentfault.com/a/1190000015052545




推荐阅读