首页 > 其他分享 >前端日常一问:说说你对浏览器缓存的理解,什么是强缓存和弱缓存,项目部署的时候需要注意的对缓存的处理

前端日常一问:说说你对浏览器缓存的理解,什么是强缓存和弱缓存,项目部署的时候需要注意的对缓存的处理

时间:2023-02-18 15:00:59浏览次数:33  
标签:Control 文件 缓存 浏览器 Cache 一问 缓存数据

前言

浏览器缓存是提高网站性能的重要手段之一,通过合理的缓存策略,可以降低服务器负担,减少网络请求次数,加快页面加载速度,提升用户体验。本文将介绍如何优化浏览器缓存策略,以提升网站性能。

一、浏览器缓存的原理

浏览器缓存是指在用户访问网站时,将部分数据存储在用户本地磁盘中,以便下次访问同一页面时能够直接从本地获取数据,从而避免重新发起请求。浏览器缓存可以分为强缓存和弱缓存两种。

1.强缓存

强缓存是指浏览器在本地缓存中查找数据,并根据 HTTP 头信息中的 Expires 和 Cache-Control 字段来判断是否可以使用缓存数据。如果缓存数据仍然有效,浏览器就可以直接使用缓存数据,无需重新发起请求。

Expires 字段是 HTTP/1.0 中定义的一个字段,用于指定缓存数据的过期时间,浏览器通过比较当前时间和过期时间来判断缓存数据是否仍然有效。例如,Expires: Thu, 19 Nov 2023 08:48:12 GMT 表示缓存数据将在 2023 年 11 月 19 日 08:48:12 过期。

Cache-Control 字段是 HTTP/1.1 中定义的一个字段,用于指定缓存数据的控制策略。常见的 Cache-Control 值包括 max-age、no-cache、no-store 等。max-age 指定缓存数据的有效时间,例如 Cache-Control: max-age=3600 表示缓存数据将在 3600 秒后过期。no-cache 表示缓存数据需要重新验证。no-store 表示禁用缓存。

2.弱缓存

弱缓存是指浏览器在本地缓存中查找数据,并根据 HTTP 头信息中的 Last-Modified 和 ETag 字段来判断是否可以使用缓存数据。如果缓存数据仍然有效,浏览器就可以直接使用缓存数据,无需重新发起请求。

Last-Modified 字段是指资源最后修改时间,浏览器通过比较 Last-Modified 和 If-Modified-Since 字段来判断缓存数据是否仍然有效。例如,Last-Modified: Thu, 19 Nov 2023 08:48:12 GMT 表示资源的最后修改时间是 2023 年 11 月 19 日 08:48:12。

ETag 字段是指资源的唯一标识符,浏览器通过比较 ETag和 If-None-Match 字段来判断缓存数据是否仍然有效。例如,ETag: "123456" 表示资源的唯一标识符是 "123456"。

强缓存和弱缓存的区别在于判断缓存数据是否仍然有效的方式不同,强缓存直接比较缓存数据的过期时间,而弱缓存则需要比较资源的最后修改时间或唯一标识符。

二、浏览器缓存的优化策略

为了优化浏览器缓存策略,我们可以采取以下几种策略。

1.设置合理的缓存时间

通过设置合理的缓存时间,可以让浏览器在一定时间内直接从本地缓存获取数据,避免重新发起请求。通常来说,静态资源(如图片、CSS、JS 文件等)的缓存时间可以设置较长,例如一年或更长时间。而动态页面(如 HTML 文件)的缓存时间应该较短,例如 1 小时或更短时间。

在设置缓存时间时,我们可以使用 HTTP 头信息中的 Expires 和 Cache-Control 字段来指定缓存时间。例如,设置静态资源的缓存时间为一年可以使用以下代码:

Expires: Thu, 31 Dec 2024 23:59:59 GMT
Cache-Control: max-age=31536000

其中 Expires 字段表示缓存数据的过期时间,Cache-Control 字段表示缓存数据的最长有效时间。由于不同浏览器对 Expires 和 Cache-Control 字段的解析方式不同,因此我们需要同时设置这两个字段。

2.使用版本号控制缓存

在项目开发过程中,如果我们修改了静态资源文件,例如 CSS 或 JS 文件,需要让浏览器重新下载这些文件,否则用户无法看到最新的界面效果。为了解决这个问题,我们可以使用版本号控制缓存,即在静态资源的 URL 后面添加版本号,例如:

https://example.com/static/css/style.css?v=1.0.0
https://example.com/static/js/main.js?v=1.0.0

每次修改静态资源文件时,只需要修改版本号即可,这样浏览器会认为这是一个新的资源,重新下载并缓存。

3.使用缓存优先策略

当浏览器发起请求时,如果缓存数据仍然有效,我们可以使用缓存优先策略,即让浏览器直接使用缓存数据,不再发起请求。这样可以避免不必要的网络请求,加快页面加载速度。

为了使用缓存优先策略,我们可以设置 HTTP 头信息中的 Expires、Cache-Control、Last-Modified 和 ETag 字段。例如,设置图片资源的缓存优先策略可以使用以下代码:

Expires: Thu, 31 Dec 2024 23:59:59 GMT
Cache-Control: max-age=31536000
Last-Modified: Fri, 18 Feb 2022 12:00:00 GMT
ETag: "123456"

其中 Expires 和 Cache-Control 字段用于设置缓存时间,Last-Modified 字段用于指定资源的最后修改时间,ETag 字段用于指定资源的唯一标识符。当浏览器发起请求时,如果缓存数据仍然有效,服务器会返回状态码 304 Not Modified,告诉浏览器直接使用缓存数据。

4.使用缓存拆分策略

当一个页面包含多个静态资源文件时,如果每个文件的缓存时间都设置为较长时间,会导致用户在访问其他页面时,浏览器仍然从本地缓存获取旧的静态资源文件。为了解决这个问题,我们可以使用缓存拆分策略,即将不同类型的静态资源文件分别设置不同的缓存时间,例如:

CSS 文件:缓存时间为 1 年
JS 文件:缓存时间为 1 小时
图片文件:缓存时间为 1 天

通过这种方式,可以让浏览器更加智能地管理缓存,避免使用过期的静态资源文件。

三、项目部署时的缓存处理

在项目部署时,为了避免浏览器缓存出现问题,我们需要做好缓存处理工作。下面是一些常见的缓存处理方式。

1.文件版本号控制

在文件修改时,我们需要更新文件的版本号,例如添加时间戳或 hash 值,来强制浏览器重新下载最新的文件。这种方式适用于所有类型的文件,例如 HTML、CSS、JS、图片等。

2.静态文件存储在 CDN

将静态文件存储在 CDN 上,可以让用户更快地下载文件,并且减轻服务器的压力。CDN 服务器会自动缓存静态文件,根据文件的访问频率和缓存时间来判断是否需要更新缓存数据。

3.缓存配置

在服务器上配置缓存规则,例如设置缓存时间、缓存类型等,可以让浏览器更加智能地管理缓存。在配置缓存规则时,我们需要根据不同类型的文件设置不同的缓存时间,避免过期数据的出现。

4.缓存清除

在项目上线后,如果文件发生了变化,我们需要手动清除浏览器缓存,以便让用户看到最新的页面效果。在清除缓存时,我们可以使用浏览器的清除功能或使用第三方插件实现自动缓存清除等方式,避免用户手动清除缓存时出现问题。

结语

浏览器缓存是前端开发中非常重要的一个概念,良好的缓存处理可以有效提升网站的性能,减少带宽的消耗,提升用户的体验。在实际开发中,我们需要对不同类型的资源设置不同的缓存策略,并且结合项目部署的需要,合理地配置缓存规则和清除缓存的方式。同时,我们还需要对缓存失效和更新等问题进行充分的测试和验证,以确保用户可以正常访问我们的网站,获取最佳的使用体验。

标签:Control,文件,缓存,浏览器,Cache,一问,缓存数据
From: https://www.cnblogs.com/mmsxs/p/17132619.html

相关文章

  • [记]egui使用wasm至浏览器中运行
    使用eframe框架可以很方便的创建native应用或者是web应用;可以参照模板 eframe_template ;拉取代码后可以直接指令 cargo run编译运行,如下;  hint#[c......
  • 解决浏览器跨域问题
    解决浏览器跨域问题前后端分离的项目中,由于前端所运行的域名地址与后端常常不一致,在发送ajax时,我们常常会碰到跨域问题。这是浏览器制定的安全策略,浏览器跨域名请求数据......
  • arch wine wechat | arch linux wine 微信打不开闪退,内置浏览器无法使用,小程序白屏
    deepin-wine-wechat3.8.1.26-1 或deepin-wine-wechat其他版本(特指archlinux,其他linux也可参照)可能出现微信打不开闪退,内置浏览器无法使用,小程序白屏等情况。这些情况......
  • 自命为缓存之王的Caffeine(6)
    您好,我是湘王,这是我的51CTO博客,欢迎您来,欢迎您再来~之前用Caffeine替代Redis的时候,发现先保存KV,再获取key,过期时间为3秒。但即使过了3秒,还是能获取到保存的数据。这是为什么......
  • 自命为缓存之王的Caffeine(6)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   之前用Caffeine替代Redis的时候,发现先保存KV,再获取key,过期时间为3秒。但即使过了3秒,还是能获取到保存的数据。这......
  • 还有好用、速度快的国产浏览器吗?这些浏览器值得一试
    市面上的浏览器百花齐放,每款浏览器都有自己的特色。大家都知道谷歌是全球用户量最多的浏览器,但是在国内账户同步就比较困难。因此,一些朋友更倾向于使用国产浏览器。那么,有......
  • 使用springboot cache + redis缓存时使用gzip压缩以提升性能
    背景在高并发的场景中,我们通常会使用缓存提升性能。在使用springbootcache时,我们通常会使用基于JSON的序列化与反序列化。JSON具有可读性强,结构简单的特点,使用灵活。但......
  • app实现外部浏览器打开链接
    需求:安卓和IOS开发的混合app。前端使用vue,vant2,安卓使用java,ios使用的object-c。实现效果:点击按钮,下载PDF附件,app跳转到手机外部浏览器,下载附件......1,安卓端代码:public......
  • vue基于微前端qiankun的多页签缓存方案实践
    一、多页签是什么?常见的浏览器多页签、编辑器多页签,从产品角度来说,就是为了能够实现用户访问可记录,快速定位工作区等作用;那对于单页应用,可以通过实现多页签,对用户的访问记......
  • 打开微信公众号H5页面显示“无法打开页面”问题(微信浏览器打开H5页面)
    公司最近遇到一个离谱问题在湖北的使用安卓手机的用户访问公众号会显示“无法打开页面”,不论是流量还是WiFi都是一样的问题,但是在苹果手机上是可以正常访问的,最骚的是其......