功能介绍
在开始体验 swpp 前,我们先来了解一下 swpp 都有哪些功能。章节下的子目录是对各个功能的具体说明,可以先跳过回过头再看,但是一定要记得回来看!!!里面会说明功能使用时的注意事项。
本地缓存和增量更新
一般情况下,我们浏览网站需要从服务器拉取文件(包括但不限于:html、css、js),然后浏览器才能渲染出最终的结果。为了提高用户体验、降低服务器压力,诞生了 HTTP 缓存 (opens in a new tab),不过 HTTP 缓存仍有一定的局限性:体系较为复杂、需要服务器支持、通常难以及时更新等……
而通过 Service Worker 进行本地缓存就能解决上述的很多痛点:
- sw 的缓存体系非常简单,就是拦截用户请求然后使用 Cache API (opens in a new tab) 读写缓存。
- sw 完全不依赖服务器实现,只要提供给用户 sw 的 js 文件,DOM 中添加相关支持,即可体验完整的功能。
但是 Service Worker 整体有一定的复杂度,且使用简单的实现仍然无法解决无法及时更新缓存的问题,此时 swpp 就派上了用场。
swpp 通过增量更新,在构建网站时扫描需要缓存的内容,确定本次更新需要更新哪些缓存,客户端就可以主动使这些缓存失效,从而解决缓存无法及时更新的问题。
swpp 同时支持按时间过期和永久缓存两种缓存方式,两种方式都可以使用增量更新。
缓存大小限制和预缓存
预缓存是指在网站加载时,预先缓存一些用户可能使用的资源。该功能妥善使用的话可以优化用户体验,但是为了避免用户滥用,swpp 没有内置该功能。
swpp 目前没有内置对缓存大小限制和预缓存的支持代码,但是用户可以通过自己配置,轻松实现这一功能。
Request 篡改和 204 阻塞响应
启用 sw 后一个请求的流程为:DOM 端发送请求 -> SW 端拦截并处理请求 -> SW 端发送网络请求或直接返回。
swpp 允许用户在 SW 端修改请求的内容,相当于一个本地的加强版重定向,同时也可以选择直接在 SW 阻塞掉某个请求。
URL 竞速和备用 URL
对于 npm
cdnjs
或 github
之类平台上的资源,通常有多个 CDN 可用。
通过 URL 竞速,可以同时拉取这些 CDN 上的文件,然后取响应速度最快的一个作为最终结果。
而通过备用 URL,则可以优先访问原始的 URL,如果响应超时或失败,则同时拉取剩余 CDN 上的文件,然后取响应速度最快的一个作为最终结果。
逃生门
swpp 的缓存增量更新需要 DOM 端发送消息到 SW 端,如果 DOM 端实现错误导致无法发送消息且 DOM 端代码被永久缓存,那么靠普通手段是完全没有办法解决这个死循环的,逃生门的作用就是触发时强制更新缓存来解开这个死局。