Vue PWA刷新后未获取新内容

9 javascript vue.js service-worker progressive-web-apps vuejs2

我是Vue的新手,并使用PWA Service-worker插件创建了一个项目。部署新版本的应用程序后,我会在控制台中收到以下消息:

失败

刷新页面(F5)后,这些消息仍然以相同的方式显示,并且该应用程序仍处于旧状态。我尽一切努力清除缓存,但仍然不会加载新内容。

创建项目后,我没有更改默认配置的任何内容,也没有添加任何与serviceworker交互的代码。怎么了?我想念什么吗?

小智 16

如我所知,这个问题实际上仅与PWA的初学者有关,他们不知道您可以(并且不需要)配置PWA来实现此目的。如果您现在感觉已解决(并使用VueJS),请记住:

要自动下载新内容,您需要配置PWA。就我而言(VueJS),这是通过vue.config.js在项目的根目录中创建一个文件来完成的(与处于同一级别package.json)。

在此文件中,您需要以下内容:

module.exports = {
    pwa: {
        workboxOptions: {
            skipWaiting: true
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果检测到,它将自动下载您的新内容。但是,该内容仍不会显示给您的客户端,因为它需要在下载内容后刷新。我通过添加window.location.reload(true)registerServiceWorker.js我的src/目录中来做到这一点:

updated () {
    console.log('New content is available: Please refresh.')
    window.location.reload(true)
},
Run Code Online (Sandbox Code Playgroud)

现在,如果Service Worker检测到新内容,它将自动下载并随后刷新页面。

  • 请记住,当工作箱插件模式设置为InjectManifest时,skipWaiting选项不可用。 (4认同)
  • 嗯,当添加 workboxOptions 和 window.location.reload 时,我的应用程序进入了重新加载页面的无限循环:( (4认同)
  • 不建议将skipWaiting 用于延迟加载:如果您的Web 应用程序延迟加载具有唯一版本(例如URL 中的哈希值)的资源,建议您避免使用跳过等待。 (2认同)
  • @TexasJetter 你找到解决方法了吗!它将会无休止地重新加载页面:( (2认同)

Aar*_*gle 5

我想出了一种不同的方法来解决这个问题,并且从我目前所看到的情况来看,它运行良好。

updated() {
      console.log('New content is available; please refresh.');
      caches.keys().then(function(names) {
        for (let name of names) caches.delete(name);
      });
    },
Run Code Online (Sandbox Code Playgroud)

这里发生的事情是,当更新的函数在 Service Worker 中被调用时,它会遍历并删除所有缓存。这意味着如果有更新,您的应用程序将启动较慢,但如果没有,它将为缓存的资产提供服务。我更喜欢这种方法,因为 Service Worker 可能很难理解,而且从我使用 skipWaiting() 阅读的内容来看,除非您知道它的作用及其副作用,否则不推荐使用。这也适用于 injectManifest 模式,这就是我目前使用它的方式。