JackAtlas

Command Palette

Search for a command to run...

第八章 构建更富弹性的应用 - 《Progressive Web Apps》读书笔记八
about 7 years ago
前端开发

第八章 构建更富弹性的应用 - 《Progressive Web Apps》读书笔记八

8.1 现代网站所面临的网络问题

  • lie-fi

    即使信号满格也无法下载任何东西。

  • 单点故障(SPOF)

    浏览器加载过程中,当解析器遇到脚本或 CSS 文件时,必须停止并执行文件,然后才能继续解析 HTML。若网页中引用的第三方网站出现加载时间过长或者宕机,那么网页应用将会收到影响。但第三方应用完全不受控制,可以用 Service Worker 来弹性处理这些问题。

8.2 Service Worker 的营救

在网速慢时返回 408 响应

function timeout(delay) {
  return new Promise((resolve, reject) => {
    setTimeout(function () {
      resolve(new Response('', {
        status: 408,
        statusText: 'Request timed out.'
      }))
    }, delay)
  })
}

self.addEventListener('fetch', function (event) {
  if (/googleapis/.test(event.request.url)) {
    event.respondWith(Promise.race([timeout(3000), fetch(event.request.url)]))
  } else {
    event.respondWith(fetch(event.request))
  }
})

8.3 使用 Workbox

使用 Workbox 处理网络超时

importScripts('workbox-sw.prod.js')

const workboxSW = new self.WorkboxSW()

workboxSW.router.registerRoute('https://fonts.googleapis.com/(.*)', // 选择缓存任何匹配“googleapis.com”域名的资源
  workboxSW.strategies.cacheFirst({ // 使用缓存优先策略来缓存资源
  cacheName: 'googleapis',
  networkTimeoutSeconds: 4 // 如果网络请求4s还没响应,降级至缓存版本
}))