📜  注册服务工作者 - Javascript (1)

📅  最后修改于: 2023-12-03 15:40:44.378000             🧑  作者: Mango

注册服务工作者 - Javascript

在Web开发中,服务工作者是一个标准化的API,用于事物的离线首次策略以及页面资源的缓存。服务工作者紧密地结合了Javascript和网络中的HTTPS,可以在应用程序离线时提供无缝体验。

注册服务工作者

为了注册一个服务工作者,我们需要创建一个用于此任务的Javascript文件,该文件可以位于应用程序的根目录中或任何其他具有所需范围的地方。

以下是一个基本的服务工作者注册文件的示例:

if ('serviceWorker' in navigator) {
  window.addEventListener('load', () => {
    navigator.serviceWorker.register('/service-worker.js')
      .then(registration => {
        console.log('Service worker registered:', registration);
      })
      .catch(error => {
        console.log('Service worker registration failed:', error);
      });
  });
}

在此示例中,我们首先检查服务工作者API是否受支持。如果受支持,我们便等待页面加载完成,以确保在注册服务工作者之前页面资源的正确加载。接下来,我们使用navigator.serviceWorker.register()方法注册我们的服务工作者。注册成功后,我们就可以使用registration对象在Javascript中访问服务工作者了。

缓存资源

注册服务工作者后,我们可以通过服务工作者API将特定文件缓存在用户的浏览器中。这是通过使用Cache API来完成的,如下所示:

const CACHE_NAME = 'my-cache';

self.addEventListener('install', event => {
  console.log('Installing service worker...');

  event.waitUntil(
    caches.open(CACHE_NAME)
      .then(cache => {
        console.log('Cache opened successfully');
        return cache.addAll([
          '/index.html',
          '/script.js',
          '/styles.css'
        ]);
      })
  );
});

在上面的示例中,我们首先定义一个缓存名称,然后通过侦听服务工作者API的install事件来执行缓存操作。我们使用caches.open()方法打开缓存,并使用cache.addAll()方法将所需的文件添加到缓存中。

现在,当用户访问我们的应用程序时,资源将首先从缓存中加载,而不是从网络中加载。

激活和更新服务工作者

为了激活和更新服务工作者,我们需要使用self.addEventListener()方法并侦听与服务工作者的生命周期相关的事件。下面的代码片段演示了如何激活和更新服务工作者:

const CACHE_NAME = 'my-cache';

self.addEventListener('activate', event => {
  console.log('Activating service worker...');

  event.waitUntil(
    caches.keys()
      .then(keyList => {
        return Promise.all(
          keyList.map(key => {
            if (key !== CACHE_NAME) {
              return caches.delete(key);
            }
          })
        );
      })
  );

  self.clients.claim();
});

self.addEventListener('fetch', event => {
  console.log('Fetching:', event.request.url);

  event.respondWith(
    caches.match(event.request)
      .then(response => {
        if (response) {
          console.log('Found response in cache:', response);
          return response;
        }

        console.log('Making network request for:', event.request.url);
        return fetch(event.request)
          .then(response => {
            console.log('Adding response to cache:', response);
            caches.open(CACHE_NAME)
              .then(cache => cache.put(event.request, response));

            return response.clone();
          });
      })
  );
});

在上面的代码中,我们使用activate事件来清除旧缓存,并使用self.clients.claim()方法宣称我们的服务工作者正在控制页面。在fetch事件中,我们使用caches.match()方法来检查请求是否存在于缓存中。如果是,我们从缓存中获取响应并返回。否则,我们会发起网络请求并将响应添加到缓存中。

结论

在本文中,我们介绍了如何在Javascript中注册服务工作者以实现Web应用程序的离线首次策略和资源缓存。我们了解了如何使用服务工作者API缓存文件并在页面加载时从缓存中加载资源。我们还介绍了如何激活和更新服务工作者。