前端部署后提示用户刷新页面

实现这个需求有很多方式,我这里推荐一个本人认为最佳的一个方案,无需循环调用接口,纯前端就可以实现,也非常欢迎大家评论这个方案的优劣

1. 注册 Service Worker

首先,在你的前端代码中注册 Service Worker。可以在你的主 JavaScript 文件(例如 index.jsmain.js)中添加以下代码:

复制代码
if ('serviceWorker' in navigator) {
  window.addEventListener('load', () => {
    navigator.serviceWorker.register('/service-worker.js').then(registration => {
      console.log('Service Worker 注册成功:', registration);

      // 监听更新事件
      registration.onupdatefound = () => {
        const installingWorker = registration.installing;
        installingWorker.onstatechange = () => {
          if (installingWorker.state === 'installed') {
            if (navigator.serviceWorker.controller) {
              // 新的 Service Worker 已安装并控制页面,通知用户刷新
              console.log('新的内容可用,请刷新。');
              alert('新的版本可用,请刷新浏览器获取最新更新。');
            } else {
              console.log('内容缓存以供离线使用。');
            }
          }
        };
      };
    }).catch(error => {
      console.error('Service Worker 注册失败:', error);
    });
  });
}
2. 创建 Service Worker 文件

在你的项目根目录下创建一个名为 service-worker.js 的文件:

复制代码
const CACHE_NAME = 'my-site-cache-v1';
const urlsToCache = [
  '/',
  '/styles/main.css',
  '/script/main.js',
  // 添加其他需要缓存的资源
];

self.addEventListener('install', event => {
  event.waitUntil(
    caches.open(CACHE_NAME)
      .then(cache => {
        console.log('Opened cache');
        return cache.addAll(urlsToCache);
      })
  );
});

self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request)
      .then(response => {
        if (response) {
          return response;
        }
        return fetch(event.request);
      })
  );
});

self.addEventListener('activate', event => {
  const cacheWhitelist = [CACHE_NAME];
  event.waitUntil(
    caches.keys().then(cacheNames => {
      return Promise.all(
        cacheNames.map(cacheName => {
          if (cacheWhitelist.indexOf(cacheName) === -1) {
            return caches.delete(cacheName);
          }
        })
      );
    })
  );
});
3. 更新 Service Worker

当你对前端代码进行更新时,只需更新 service-worker.js 文件的内容(例如,改变缓存名称 CACHE_NAME 或添加新的文件到 urlsToCache)。浏览器会检测到 service-worker.js 文件的变化,并触发 updatefound 事件。

这样,当用户刷新页面时,新的前端代码会被加载,并且缓存也会被更新到最新版本。通过 Service Worker,你可以确保用户始终使用最新的前端代码,同时提供离线支持和更快的加载速度。

解释Service Worker:Service Worker 是一种在后台运行的脚本,允许你在没有打开网页的情况下对网络请求进行拦截和缓存管理。使用 Service Worker 可以实现离线支持、后台同步、推送通知等功能。在这里,我们利用 Service Worker 来检测前端代码的更新并通知用户刷新浏览器以获取最新的代码。

相关推荐
代码搬运媛6 小时前
Jest 测试框架详解与实现指南
前端
counterxing7 小时前
我把 Codex 里的 Skills 做成了一个 MCP,还支持分享
前端·agent·ai编程
wangqiaowq7 小时前
windows下nginx的安装
linux·服务器·前端
之歆8 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
发现一只大呆瓜8 小时前
Vite凭什么这么快?3分钟带你彻底搞懂 Vite 热更新的幕后黑手
前端·面试·vite
Maimai108088 小时前
React如何用 @microsoft/fetch-event-source 落地 SSE:比原生 EventSource 更灵活的实时推送方案
前端·javascript·react.js·microsoft·前端框架·reactjs·webassembly
kyriewen10 小时前
产品经理把PRD写成“天书”,我用AI半小时重写了一遍,他当场愣住
前端·ai编程·cursor
humcomm10 小时前
元框架的工作原理详解
前端·前端框架
canonical_entropy11 小时前
Attractor Before Harness: AI 大规模开发的方法论
前端·aigc·ai编程
zhangxingchao11 小时前
多 Agent 架构到底怎么选?从 Claude Agent Teams、Cognition/Devin 到工程落地原则
前端·人工智能·后端