Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
Xheldon opened this issue Sep 28, 2021 · 1 comment
Open

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

Xheldon opened this issue Sep 28, 2021 · 1 comment

Comments

@Xheldon
Copy link

Xheldon commented Sep 28, 2021

看到 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
Copy link
Author

Xheldon commented Sep 28, 2021

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant