0

我是渐进式网络应用程序的新手。我已经为我的 react PWA(渐进式 Web)应用程序完成了这个惊人的教程和设置。

现在这是我的serviceworker.js文件

const isLocalhost = Boolean(
  window.location.hostname === 'localhost' ||
    window.location.hostname === '[::1]' ||
    window.location.hostname.match(
      /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
    )
);

export default function register() {
  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
    const publicUrl = new URL(process.env.PUBLIC_URL, window.location);
    if (publicUrl.origin !== window.location.origin) {
      return;
    }

    window.addEventListener('load', () => {
      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;

      if (isLocalhost) {
        checkValidServiceWorker(swUrl);
        navigator.serviceWorker.ready.then(() => {
        });
      } else {
        registerValidSW(swUrl);
      }
    });
  }
}

function registerValidSW(swUrl) {
  navigator.serviceWorker
    .register(swUrl)
    .then(registration => {
      registration.onupdatefound = () => {
        const installingWorker = registration.installing;
        installingWorker.onstatechange = () => {
          if (installingWorker.state === 'installed') {
            if (navigator.serviceWorker.controller) {
              console.log('New content is available; please refresh.');
            } else {
              console.log('Content is cached for offline use.');
            }
          }
        };
      };
    })
    .catch(error => {
      console.error('Error during service worker registration:', error);
    });
}

function checkValidServiceWorker(swUrl) {
  fetch(swUrl)
    .then(response => {
      if (
        response.status === 404 ||
        response.headers.get('content-type').indexOf('javascript') === -1
      ) {
        navigator.serviceWorker.ready.then(registration => {
          registration.unregister().then(() => {
            window.location.reload();
          });
        });
      } else {
        registerValidSW(swUrl);
      }
    })
    .catch(() => {
      console.log(
        'No internet connection found. App is running in offline mode.'
      );
    });
}

export function unregister() {
  if ('serviceWorker' in navigator) {
    navigator.serviceWorker.ready.then(registration => {
      registration.unregister();
    });
  }
}

但无法理解它是如何工作的?任何人都可以帮忙在这里注册,取消注册和其他功能吗?

请帮忙!!!

4

1 回答 1

2

根据文档

服务工作者是一种网络工作者。它本质上是一个 JavaScript 文件,与主浏览器线程分开运行,拦截网络请求,缓存或从缓存中检索资源,并传递推送消息。

从上面的示例代码中,您正在使用 react 框架来构建 PWA create-react-app。它将通过允许开发人员在很少或没有构建配置的情况下构建 React 应用程序来消除所有这些。

使用React构建实时 PWA

Service Worker 代码基本上为 React 应用注册了一个 Service Worker 。我们首先检查应用程序是否通过 const 值从 localhost 提供服务,该isLocalhostconst 值将返回真值或假值。register()只有当它处于生产模式并且浏览器支持 Service Worker 时,该功能才有助于将 Service Worker 注册到 React 应用程序。

registerValidSW()函数将注册有效的服务工作者并在安装时负责状态。将checkValidServiceWorker()检查是否可以找到服务人员。这将确保 service worker 存在,并且我们确实得到了一个 JS 文件。

unregister()功能有助于注销服务工作者。

于 2018-10-04T12:00:01.713 回答