首页 > 解决方案 > 为什么服务人员会自动下载新内容,但不更新?

问题描述

我以这种方式注册服务人员:

/* eslint-disable no-console */

import { register } from 'register-service-worker'

if (process.env.NODE_ENV === 'production') {
  register(`${process.env.BASE_URL}service-worker.js`, {
    ready() {
      console.log('App is being served from cache by a service worker.');
    },
    registered() {
      console.log('Service worker has been registered.');
    },
    cached() {
      console.log('Content has been cached for offline use.');
    },
    updatefound() {
      console.log('New content is downloading.');
    },
    updated() {
      console.log('New content is available; please refresh.');
    },
    offline() {
      console.log('No internet connection found. App is running in offline mode.');
    },
    error(error) {
      console.error('Error during service worker registration:', error);
    }
  });
}

当我vue-cli-service build --mode production然后我部署到服务器时,在线我可以正确地看到日志:

App is being served from cache by a service worker.
Service worker has been registered.
New content is downloading.
New content is available; please refresh.

似乎是自动下载内容,但从现在开始,它仍然总是显示New content is available; please refresh(实际上,内容并没有刷新)。好像不会自动刷新?只能下载吗?为什么?

我怎样才能刷新updated()

标签: vue.jsservice-workervue-cli

解决方案


您应该使用skipWaiting服务工作者对象的方法。

也许这可以帮助你:

updated(registration){
    const waitingServiceWorker = registration.waiting;

    if (waitingServiceWorker) {
      waitingServiceWorker.addEventListener('statechange', event => {
        if (event.target.state === 'activated') {
          window.location.reload();
        }
      });
      waitingServiceWorker.postMessage({ type: 'SKIP_WAITING' });
    }
}

此代码是否有效取决于您的service-worker.js内容。

但你应该使用的想法是一样的skip waiting


推荐阅读