在 HTML 中创建一个切换或复选框,您将控制状态。这个输入元素将控制离线模式是打开还是关闭。该输入的值必须发送给服务工作者,然后服务工作者可以决定在发出fetch 请求时做什么。
<input id="check-offline" type="checkbox" name="offline-mode">
<label for="check-offline">Offline mode</label>
在您的主线程中选择按钮并注册您的 Service Worker。每当工作人员成功注册时,将事件侦听器添加到您在此处创建的输入并侦听change。在事件侦听器的处理程序中,使用 worker 上的postMessage 函数将检查的值发送给 worker。
const offLineToggle = document.getElementById('check-offline');
navigator.serviceWorker.register('/path/to/service-worker.js').then(registration => {
const serviceWorker = registration.active;
if (serviceWorker !== null) {
offLineToggle.addEventListener('change', event => {
serviceWorker.postMessage({
name: 'offlineMode',
value: event.target.checked
});
});
}
});
然后在您的 Service Worker 脚本中创建一个对象(或变量)来存储当前设置。在 ServiceWorkerGlobalScope 中监听 message 事件。这是postMessage 函数的接收端。在这里您可以处理数据并更新离线模式的设置。
然后添加另一个事件侦听器并侦听fetch 事件,只要从主线程发出fetch 请求,就会触发该事件。在事件处理程序中检查离线模式是打开还是关闭并进行相应处理。
const settings = {
offlineMode: false
};
self.addEventListener('message', { data } => {
const { name, value } = data;
if (settings.hasOwnProperty(name)) {
settings[name] = value;
}
});
self.addEventListener('fetch', event => {
const { offlineMode } = settings;
if (offlineMode === true) {
// Force return data from cache.
} else {
// Get fresh data from the server.
}
});
这一切都是它如何工作的概述。阅读Using Service Workers article on MDN,了解如何访问缓存并控制发送到客户端的数据。