问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

前端如何设置浏览器缓存

创作时间:
作者:
@小白创作中心

前端如何设置浏览器缓存

引用
1
来源
1.
https://docs.pingcode.com/baike/2236854

前端如何设置浏览器缓存这个问题的核心观点包括:缓存控制头部、缓存过期时间、使用service worker、ETag和Last-Modified头部、缓存策略选择、缓存清理机制。其中,缓存控制头部是最基础且最常用的方式之一,通过设置HTTP响应头部来控制资源的缓存策略。

浏览器缓存是前端优化的重要部分,通过合理的缓存策略,可以显著提高页面加载速度,降低服务器负载,提升用户体验。具体来说,缓存控制头部可以设置不同的缓存指令,如
Cache-Control

Expires
等,控制资源的缓存时长、是否可缓存以及缓存的具体行为。例如,
Cache-Control: max-age=3600
表示资源在客户端缓存一小时。

一、缓存控制头部

缓存控制头部是通过设置HTTP响应头部来控制资源的缓存行为。常见的头部包括
Cache-Control

Expires

Pragma
等。

1、Cache-Control

Cache-Control
头部是最常用的缓存控制头部,允许设置多种缓存指令。例如:

  • max-age:指定资源的最大缓存时间(以秒为单位),如
    Cache-Control: max-age=3600
    表示资源在客户端缓存一小时。

  • no-cache:强制每次请求都验证资源的有效性,即使缓存中有副本。

  • no-store:完全禁止缓存,浏览器和中间代理都不会保存资源副本。

  • public:资源可以被任何缓存保存。

  • private:资源只能被客户端缓存,不允许中间代理缓存。

2、Expires

Expires
头部用于指定资源的过期时间(HTTP/1.0),如
Expires: Wed, 21 Oct 2023 07:28:00 GMT
。虽然
Expires
在HTTP/1.1中被
Cache-Control

max-age
指令取代,但仍被一些旧版浏览器使用。

3、Pragma

Pragma
头部是HTTP/1.0中的缓存控制头部,常用的指令是
no-cache
,表示不缓存资源。一般用于向后兼容:

Pragma: no-cache

二、缓存过期时间

缓存过期时间决定了缓存资源的有效期,过期时间的设置可以通过
Cache-Control

Expires
头部来实现。

1、设置合理的过期时间

过期时间应根据资源的更新频率进行合理设置。对于频繁更新的资源,可以设置较短的过期时间;而对于不常更新的资源,可以设置较长的过期时间,以减少重复请求。

2、使用

max-age
指令

Cache-Control

max-age
指令提供了更精确的过期时间控制。相比
Expires
头部,
max-age
的优势在于它是相对时间,而不是绝对时间。例如:

Cache-Control: max-age=86400

表示资源在客户端缓存一天(86400秒)。

三、使用Service Worker

Service Worker 是一种特殊的Web Worker,运行在后台线程中,能够拦截和控制网络请求,从而实现更高级的缓存策略。

1、注册Service Worker

首先,需要在页面中注册Service Worker:

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/service-worker.js')
    .then(function(registration) {
      console.log('Service Worker registered with scope:', registration.scope);
    }).catch(function(error) {
      console.log('Service Worker registration failed:', error);
    });
}

2、编写Service Worker脚本


service-worker.js
中,可以使用
fetch
事件监听器来拦截网络请求,并实现缓存策略:

self.addEventListener('install', function(event) {
  event.waitUntil(
    caches.open('my-cache').then(function(cache) {
      return cache.addAll([
        '/',
        '/styles/main.css',
        '/scripts/main.js'
      ]);
    })
  );
});
self.addEventListener('fetch', function(event) {
  event.respondWith(
    caches.match(event.request).then(function(response) {
      return response || fetch(event.request).then(function(response) {
        return caches.open('my-cache').then(function(cache) {
          cache.put(event.request, response.clone());
          return response;
        });
      });
    })
  );
});

四、ETag和Last-Modified头部

ETag和Last-Modified头部用于实现缓存验证机制,通过对比资源的版本或修改时间来判断资源是否需要更新。

1、ETag头部

ETag(Entity Tag)是资源的唯一标识符,服务器生成并返回给客户端。客户端在后续请求中会携带该ETag,服务器通过对比ETag来判断资源是否发生变化。如果未变化,返回304状态码,告知客户端使用缓存副本。

2、Last-Modified头部

Last-Modified头部表示资源的最后修改时间,客户端在后续请求中会携带
If-Modified-Since
头部,服务器通过对比资源的最后修改时间来判断是否需要更新。如果未变化,返回304状态码。

五、缓存策略选择

不同的缓存策略适用于不同的场景,常见的缓存策略包括强缓存、协商缓存等。

1、强缓存

强缓存通过
Cache-Control

Expires
头部实现,在缓存有效期内,浏览器直接使用缓存副本,不向服务器发送请求。

2、协商缓存

协商缓存通过ETag和Last-Modified头部实现,浏览器每次请求都会向服务器验证资源是否发生变化,根据服务器返回的状态码决定是否使用缓存副本。

六、缓存清理机制

合理的缓存清理机制能够确保缓存的有效性和合理性,避免缓存过期或缓存污染。

1、手动清理缓存

在开发过程中,可以通过浏览器开发者工具手动清理缓存,确保每次请求都获取最新的资源。

2、自动清理缓存

通过设置合适的缓存过期时间,浏览器会自动清理过期的缓存资源,确保缓存的有效性。此外,可以通过Service Worker实现更高级的缓存清理机制,如定期清理过期缓存等。

通过以上内容,你可以系统地了解前端如何设置浏览器缓存,从而更好地优化前端性能,提升用户体验。合理使用缓存策略,能够显著减少服务器负载,加快页面加载速度,带来更流畅的用户体验。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号