【发布时间】:2019-04-22 23:16:26
【问题描述】:
最近,我采用了 Service Worker,通过缓存优先策略来加速初始 HTML 加载:
function cacheFirst () { /* ... */ }
self.addEventListener('fetch', (event) => {
const { request } = event
if (request.mode === 'navigate' && request.method === 'GET') {
event.respondWith(cacheFirst(event))
}
})
正如预期的那样运行良好且很酷。
但是,当我使用 Chrome 开发工具观察我的网站性能时,我发现一些非常烦人的事情:我对我的 restful api 服务器的所有请求都由一个小而明显的 service worker 开销。
我看到我所有的安静请求都首先发送给我的服务人员。并且因为这些请求不打算被缓存,fetch 事件处理程序只是忽略该事件(不调用event.respondWith)。然后由浏览器自己发出正常请求。
让我恼火的是,到服务人员的这个空往返大约需要 15-40 毫秒(在我的 Android 手机上高达 80-200 毫秒)。这对我来说很荒谬,我试图通过消除缓存结果的 304 响应来节省大约 15-40ms,但在请求动态数据时引入了 15-40ms 的延迟。
我尝试只为我不喜欢缓存的请求调用 event.respondWith(event.request),但与移除服务工作者相比,我仍然可以观察到一些开销。
function cacheFirst () { /* ... */ }
self.addEventListener('fetch', (event) => {
const { request } = event
if (request.mode === 'navigate' && request.method === 'GET') {
event.respondWith(cacheFirst(event))
} else {
event.respondWith(fetch(request))
}
})
我搜索了网络,并没有看到类似的关于这种性能缺陷的担忧(这让我想知道服务人员真的在现实世界中使用过)。
除了我的故事之外,我的问题是:我可以在请求 RESTful api 时绕过 service worker(我只是确定它不应该被缓存),同时仍然保留好处用于可缓存的资源。
【问题讨论】: