将值从 Service Worker 传递到 HTML

问题描述 投票:0回答:1

我正在尝试改进我最近制作的渐进式网络应用程序。为了在开发时节省一点时间并降低出错的风险,我想自动显示版本号,而不是手动将其复制到 HTML 中。

版本号定义为 Service Worker 中的缓存名称:

const cacheName = '1.6.2';

Service Worker 是通过在每个 HTML 页面的头部调用的 register.js 来注册的。

<script src="register.js" defer></script>

然后在正文末尾的脚本中我有:

document.getElementById('versionNo').innerHTML = cacheName;

在 HTML 中:

<span id="version">Version: <span id="versionNo"></span></span>

然而,这会将版本号留空,并且 javascript 控制台报告“jquery.js:2 Uncaught ReferenceError: cacheName is not Defined”。是我的想法有问题还是这根本不可能?

javascript html progressive-web-apps service-worker
1个回答
-2
投票

这可能有帮助:

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Service Worker Date Example</title>
</head>
<body>
  <h1>Service Worker Date Example</h1>
  <p>Current Time from Service Worker: <span id="time-display">Waiting for update...</span></p>
  
  <script type="module" src="/main.js"></script>
</body>
</html>

main.js

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

        navigator.serviceWorker.addEventListener('message', (event) => {
            if (event.data && event.data.type === 'CURRENT_TIME') {
                const currentTime = event.data.time;
                document.getElementById('time-display').textContent = currentTime;
            }
        });
    });
}

sw.js

setInterval(() => {
    const currentTime = new Date();
    self.clients.matchAll().then((clients) => {
        clients.forEach((client) => {
            client.postMessage({
                type: "CURRENT_TIME",
                time: currentTime.toString(),
            });
        });
    });
}, 5000);
© www.soinside.com 2019 - 2024. All rights reserved.