Huxpro / huxpro.github.io

My Blog / Jekyll Themes / PWA
http://huangxuan.me
Apache License 2.0
7.05k stars 5.33k forks source link

Service Worker 判断页面更新的机制 #411

Open Xheldon opened 2 years ago

Xheldon commented 2 years ago

看到 sw.js 里面有这么一个逻辑:

function revalidateContent(cachedResp, fetchedResp) {
  // revalidate when both promise resolved
  return Promise.all([cachedResp, fetchedResp])
    .then(([cached, fetched]) => {
      const cachedVer = cached.headers.get('last-modified')
      const fetchedVer = fetched.headers.get('last-modified')
      console.log(`"${cachedVer}" vs. "${fetchedVer}"`);
      if (cachedVer !== fetchedVer) {
        sendMessageToClientsAsync({
          'command': 'UPDATE_FOUND',
          'url': fetched.url
        })
      }
    })
    .catch(err => console.log(err))
}

是使用资源的 last-modified 是否有变化来决定是否通知用户页面有更新,但是这里有个问题是,假设我只是修改了 about 页面,当我打开首页的时候,也会收到页面更新的通知;然后,我再打开 about 页面,依然会收到页面更新的通知。

更糟的是,只要我更新了任意一个 page 或者 post,打开任意一个页面的时候,都会提醒我需要更新页面,点了更新之后,再打开其他页面,还是会让我更新页面。

那么:

  1. 此处的逻辑是否符合预期?
  2. 有什么办法调整成我更新一个 post 后,只在 index 或者 page1 or page2 提醒更新呢?
  3. 有什么办法调整成我更新一个 page 后,只更新首页呢?
  4. 有什么办法调整成我更新任意内容后,通知更新后,只需要点击一次 更新 即可,之后后续再打开任意页面都不会再提醒有更新呢?

另外: 我是使用了 build 后的位于 _site 下的文件放在了 GithubPages,没有直接将源码暴露出来,二者在两个仓不同的仓库中,每次 源码 build 后会 -force 更新 GithubPages 的内容:https://github.com/Xheldon/x_blog

@Huxpro

谢谢!

Xheldon commented 2 years ago

研究了下,我现在改成了通过判断 res 的 content-length 来决定是否需要更新当前页面,一般情况下修改一个页面其 content-lenght 是会变化的,其他页面即使是重新 build 一遍,只要内容没变 content-lenght 就不变,那么就不会被弹更新通知。

不知这个思路有什么问题没?