Bootstrap

如何解决前端上线之后,用户所在页面不刷新也会自动更新

当前所在页面不刷新会出现其他页面已经更新但当前页面没有更新的情况。这种情况下,通常需要通过前端代码来处理。

一种解决办法是在前端代码中,添加一个定时器,定期去检查后台服务是否有更新。如果检测到新版本,可以使用 JavaScript 程序重新加载相应的资源,让用户可以获得新内容。

方法一

1、添加一个定时器

javascript

setInterval(() => {
  // 在这里编写检测更新的逻辑
}, 3000); // 检测时间为 3 秒一次

2、发送请求后端 API 获取当前应用程序最新版本号或时间戳

fetch('/api/app/latest')
.then(response => response.json())
.then(data => {
  // 与当前应用程序版本进行比较
});

3、如果检测到新版本,则启动强制刷新机制

if (newVersion > currentVersion) {
  window.location.reload(true);
}

以上方法的原理是使用 JavaScript 不断轮询服务器,以便获取新内容并强制刷新页面。虽然这个方法可以解决一部分问题,但却需要定时地向服务器发送请求,增加了客户端和服务器之间的通信量,无疑也对性能影响较大。因此,在完成前端上线之前,开发者们应该充分考虑到这一点,并且在可行范围内尽可能减少刷新次数。

方法二

除了轮询检查和强制刷新页面的方法,还有一些比较流行的技术可以实现前端自动更新,其中最常用的是Service Worker。

Service Worker 是运行在浏览器中的独立后台线程,可以控制 Web 页面、拦截和处理网络请求,并具有离线缓存等高级功能。Service Worker 机制可以让您将应用程序缓存到本地,然后在需要时从缓存中提供资源,以便快速加载您的应用程序(即使在离线情况下也能够正常工作),同时也有利于达到自动更新页面的目的。

以下是使用 Service Worker 实现前端自动更新的大致步骤:

1、注册并安装 Service Worker

在您的 HTML 页面中注册 Service Worker。
javascript
if ('serviceWorker' in navigator) {
    window.addEventListener('load', function() {
        navigator.serviceWorker.register('/sw.js').then(function(registration) {
            console.log('ServiceWorker registration successful with scope: ', registration.scope);
        }, function(err) {
            console.log('ServiceWorker registration failed: ', err);
        });
    });
}

上述代码会在页面加载完之后注册一个 Service Worker,并且保证 Service Worker 切换时再次加载该页面。

创建一个 Service Worker 文件:sw.js,并且在文件里创建好生命周期函数,在 install 和 activate 事件里,缓存静态资源。
javascript
const CACHE_NAME = 'static-cache-v1';

self.addEventListener('install', event => {
   event.waitUntil(
       caches.open(CACHE_NAME)
           .then(cache => cache.addAll([
               '/index.html',
               '/css/style.css',
               '/js/main.js'
           ]))
           .then(() => self.skipWaiting())
   );
});

self.addEventListener('activate', event => {
   const currentCaches = [CACHE_NAME];

   event.waitUntil(
       caches.keys().then(cacheNames => {
           return cacheNames.filter(cacheName => !currentCaches.includes(cacheName));
       }).then(cachesToDelete => {
           return Promise.all(cachesToDelete.map(cacheToDelete => {
               return caches.delete(cacheToDelete);
           }));
       }).then(() => self.clients.claim())
   );
});

以上代码将在安装事件中开启了一个缓存,里面包含了应用程序的主要静态资源。在激活事件中,将该缓存设置为首页缓存,并清除旧版本缓存。

到此为止,您已经成功注册和安装了 Service Worker。Service Worker 可以掌握更多精细的控制和应用场景,建议参阅官方文档查看更多详细资料。

以上包括处理 install 和 activate 事件,在 install 事件中缓存静态文件和第三方资产,保证页面可以离线运行,在 activate 事件中清除旧的缓存文件中遗留的不必要的文件而防止它们长时间存在。

2、添加 fetch 事件,并处理所有请求,从缓存中提供资产。

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

这些代码片段只是示例,需要视具体情况作出相应的修改和优化。利用 Service Worker 实现自动更新不仅可以提高用户体验,同时也有助于我们在开发 Web 应用程序时能够使用最新的技术和功能。

;