解决静态资源文件js/css缓存问题(超详细总结版)

6 篇文章 1 订阅
订阅专栏

什么是静态资源文件

顾名思义,静态资源文件就是js、css、img等非服务器动态运行生成的文件,统称为静态
资源文件。

为什么要缓存静态资源文件

静态资源文件是基本不会改变的,没必要每次都从服务器中获取。也就是说,我们每次向
服务器发送请求得到的静态资源是相同的。所以我们可以把静态资源缓存再浏览器,也就
是客户端,来进行性能优化。

虽然绝大多数css和js文件都只有几百k,但有些时候会存在如字体文件等超过1MB的文件,加载时间会达到一秒以上,就会极大的影响网页的整体加载速度,这时候就必须要对静态资源文件进行缓存。

实现缓存的几种方法

一、修改html文件
第一种方法就是在html文件的最上面加上这样一行代码:

 <meta http-equiv="Cache-Control" content="max-age=7200" />

这句话的作用是修改服务器的响应该html文件的响应头,设置其中静态资源文件的缓存时间为7200秒。
说到这里首先要介绍一下服务器给浏览器的静态资源响应,按F12打开开发者调试工具,选择Network,如下图所示:
在这里插入图片描述
可以看到下面展示了许多js和css文件的加载信息,单击其中一条记录,可以看到他们的响应头信息。
在这里插入图片描述 可以看到,被红框圈上的部分,是和缓存有关的响应头信息。Cache-Control用于指定缓存机制,Expires用于声明缓存到期时间,Pragma则是为了兼容版本设置的,Http/1.1才可以识别Cache-Control,而Pragma对Http/1.0和Http1.1均生效。
因此我们之前做的操作就是修改这个响应头,让其由禁止缓存变为允许缓存。
然而我在做了这个操作之后并没用生效,响应头依旧没有改变。这是因为在页面进行设置的优先级是最低的,springboot内置的web服务器会将这个设置好的响应头进行覆盖。因此如果这个方法没有生效,我们就来使用第二种方法。
二、springboot配置
第二种方法原理相同,修改响应头。具体操作步骤见https://blog.csdn.net/m0_37845840/article/details/81382462,这篇文章介绍的很详细,简单来说分为修改响应头和设置版本号两部分。设置版本号是为了每次修改后的js和css文件都会被更新,也就是浏览器通过版本号来区分自己缓存的js与css文件是否为最新的版本。
然而发现,在springboot进行配置后,响应头并未发生任何变化,没有实现缓存。这里可能有两个原因,第一是本身项目的架构问题,在更高的层级配置了静态资源响应头信息,在当前项目内修改会被覆盖;第二是在nginx进行了配置,nginx的优先级比springboot高,因此设置的响应头信息也会被覆盖。所以我们需要进行第三种配置,在nginx进行设置。
三、修改nginx配置文件
这里首先说明一下为何nginx的优先级更高,nginx是一个实现反向代理和负载均衡的轻量级web服务器,许多项目都会使用到它来做代理。可以理解为它是所有web服务器的统一入口和出口,也就是说我们所有的数据都是从springboot中集成的web服务器出来后,再由nginx代理,作处理后响应给浏览器。如下图所示,nginx最后对响应头作处理,所以会对之前的所有处理进行覆盖。
在这里插入图片描述
找到nginx的配置文件nginx.conf,百度搜索相应操作系统命令即可,添加配置文件内容:

location ~* \.(woff)$ {
    proxy_pass http://kubernetes;
    expires 1d;
}

这里的woff可以替换为css|js,即匹配所有css和js文件,这里我需要缓存的为字体文件,后缀为woff。之前查找了很多资料,没有第一行proxy_pass,配置后会出现匹配到的静态资源文件报404,是因为没有设置正确的代理路径,参考自己nginx配置文件中其它部分设置正确的路径即可。这样设置之后,重启nginx,发现可以进行缓存了,如下图所示:
在这里插入图片描述
绿色框框圈的部分已经发生了改变,同时响应码由原来的200变为了304
下面两张图是缓存前后的差别:
在这里插入图片描述
在这里插入图片描述
大小由之前的6.9MB变为350B,时间也由8秒变为100ms。
可以说我们的目的达到了,加载静态资源文件的时间极大的缩短了。但还不够完美,因为多发了一次304请求。也就是说浏览器会再发一次304请求,去问服务器究竟要不要从缓存中获取静态资源文件,确认后再从浏览器的缓存中获取。也就是说这个请求对我们来说是完全多余的,可以进一步优化。
我们发现红框中的响应头Pragma:no-cache依旧存在,这里的no-cache并不是不缓存的意思:

no-cache 可以在本地缓存,可以在代理服务器缓存,但是这个缓存要服务器验证才可以使用 
no-store 彻底得禁用缓冲,本地和代理服务器都不缓冲,每次都从服务器获取

因此我们的304请求很可能是因为这个响应头造成的。我们要通过nginx去掉这个响应头。
nginx中清除响应头需要下载一个模块headers_more,这个模块可以实现响应头的清除功能。下载安装模块后需要对nginx重新编译才能生效。建议在运维的协助下完成。nginx中需要修改的配置如下:

location ~* \.(woff)$ {
    proxy_pass http://kubernetes;
    expires 1d;
    more_clear_headers Pragma;
}

将Pragma这个响应头清除,之后重启nginx,结果如下图所示:
在这里插入图片描述
状态码已经变为200了,同时后面的(from memory cache)表明是从缓存中获取的该静态资源文件。
在这里插入图片描述
可以看到,Size已经变为(from memory cache),时间为0ms,静态资源文件缓存配置完成。

注意事项

最后的nginx配置我没有配置版本号,因为我缓存的是字体文件,也就是说是永远不会改变的。然而我们如果缓存的是js和css文件,每隔几周可能都会进行修改,这时候不设置版本号就是存在风险的,可能你浏览器端存有旧的css文件没有过期,这时候又没有版本号作区分,可能会导致无法获取最新的css文件。因此建议添加版本号,具体配置在springboot配置的链接中有详细说明,参考配置即可。

Nginx控制前端静态资源缓存
甘蓝的专栏
09-18 5412
背景 项目中使用Nginx代理前端代码,每次前端代码修改完成后,浏览器有时候并不会生效。 原因是很多浏览器做了缓存,导致没有使用最新的前端代码。 解决 通过HTTP Header中的Cache-control字段(no-cache)来控制是否开启缓存。 相关可选项如下: no-cache:客户端可以缓存,但是每次使用缓存资源都必须发请求验证其有效性。如果没有变化返回304,如果发生变化,那理论上就是200。 no-store:禁止缓存,不使用任何缓存 修改前的配置: # 原有静态资源配置
html 图片缓存时间,css,js,图片资源都应该明确的指定一个缓存时间
weixin_33252423的博客
06-07 869
设置静态内容缓存时间,指标解释:css,js,图片资源都应该明确的指定一个缓存时间。指标解释:css,js,图片资源都应该明确的指定一个缓存时间。评估标准:如果有静态文件的过期时间设置小于30天,将会得到警告。nginx做为web服务器的情况下,我们有时候需要让浏览器缓存(BrowserCaching) 是为了加速浏览并节约网络资源,浏览器在用户磁盘上对最近请求过的文档进行存储。nginx可以通过...
一个可以将静态资源jscss缓存到本地localStorage的小工具
08-11
一个可以将静态资源(jscss)缓存到本地localStorage的小工具
前端性能优化(三)——浏览器九大缓存方法
最新发布
2401_84094725的博客
04-15 414
整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》PDF完整点击这里领取题:常用算法》PDF完整点击这里领取**[外链图片转存中…(img-5WiWWGF6-1713160366656)][外链图片转存中…(img-gWW3SeoM-1713160366657)]
JSCSS文件按需缓存
tangyuewei.com
05-14 787
用户反馈网站出现问题,修改js文件上线后,刷新页面后js并未加载修改后的js,使用的还是本地缓存js代码。强制刷新一般就会重新去服务器获取新的js代码。但不能让用户每次都这样子去做。 如何才能让浏览器使用最新的js文件呢? 在后面加一个本号 <script type="text/javascript" src="../js/common.js?v=1" ></script> 修改js文件名 <script type="text/javascript" s.
Chrome或Firefox浏览器静态资源文件缓存时长是多久!
热门推荐
北亮的专栏
12-07 1万+
先放上结论吧,Chrome和Firefox对jscss之类的文件,在内存中的缓存时长,是: (访问时间 - 该文件的最后修改时间) ÷ 10 假设文件 a.js 最后编辑时间是 2018年12月1号 10点0分0秒; Chrome的第一次访问时间是 2018年12月1号 12点0分0秒; 第一次访问与文件编辑时间相差2小时,即7200秒,那么缓存时长就是720秒 即结论如下: 1、在 201...
JavaScript浏览器缓存的几种方式!
start1018的博客
03-29 1815
每个域名端口下都会存在一份独立的 sessionStorage 数据,它是有过期时间的,当你关闭当前页面(包含浏览器选项卡)时,sessionStorage 缓存会被销毁。每个域名端口下都会存在一份独立的 localStorage 数据,它是没有过期时间的,只要你不手动清除,那么它会永远都在。cookie 是一些缓存数据,主要存储在你的电脑中。默认情况下,没有设置过期时间,当浏览器关闭时 cookie 就会被删除(关闭当前选项卡不会删除)。相当于把旧的 cookie 进行了删除,在创建新的 cookie。
【前端面试之缓存js本地缓存浏览器缓存、服务器缓存
阿卡内的博客
08-05 4499
js本地缓存浏览器缓存、服务器缓存
js动态添加本号解决浏览器缓存问题
DN金猿的博客
03-14 1938
但是,这样有一个问题,就是当程序猿更新了网页内容后,因为浏览器缓存的存在,可能没有办法显示出更新后的内容。今天我就遇到了这样的问题,做了一个小游戏的网页,用到了大量的图片和音频,测试时更新的js不能立刻反馈,总是需要清除缓存后刷新才能看到更新。谷歌浏览器对document.write()发出了警告,查看了谷歌浏览器的警告页,了解到了使用document.write()方式链接js文件会导致加载变慢,对网速不好的用户体验会变差,不过谷歌举的例子是使用2g的用户。添加一段代码,动态添加时间戳。
前端项目上线后,浏览器缓存未刷新问题
weixin_42936434的博客
03-07 5288
http的缓存机制是一种优化策略。但也会出现文件变动后浏览器没有更新的问题。综上,入口文件缓存或采用协商缓存,其他静态资源使用强缓存,url拼接hash值或者打包时给文件名加上hash值。
Tomcat无法加载cssjs静态资源文件解决思路
09-15
Tomcat无法加载cssjs静态资源文件的情况想必从事相关行业的工作人员都有遇到过吧,接下来为大家介绍下详细解决方法,感兴趣的朋友可以参考下
HTML页面自动清理jscss文件缓存(自动添加本号)
12-13
在web项目开发过程中,我们经常会引用cssjs文件,更新文件后常出现缓存问题(明明更改了代码,在浏览器上访问的时候却没有发生变化),这种情况我们通常采用以下两种解决方案: 1、手动清除浏览器缓存 2、添加本...
利用 filter 机制给静态资源 url 加上时间戳,来防止jscss文件缓存问题
10-22
主要介绍了利用 filter 机制给静态资源 url 加上时间戳,来防止jscss文件缓存问题的相关资料,需要的朋友可以参考下
Spring Boot Web 静态文件缓存处理的方法
08-27
本篇文章主要介绍了Spring Boot Web 静态文件缓存处理的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
一键解决web开发用户浏览器静态资源缓存问题的工具
08-25
处理web静态资源文件在客户端浏览器缓存的工具,java编写的小程序工具。 主要处理jscss文件,将指定目录下所有匹配的jscss文件添加特定的本号作为文件名,并处理指定目录下所有html文件中对该jscss的引用。 ...
工程化——前端静态资源缓存策略
weixin_34255793的博客
03-01 246
增量更新是目前大部分团队采用的缓存更新方案,能让用户在无感知的情况获取最新内容。具体实现方式通常是(一般我们通过构建工具来实现,比如webpack): 构建产出文件hash(如:index.d94f83fac22c203b788c.css) 更新html文件静态资源的引用URL 由于其他资源是由html文件直接或间接引用才可以被加载...
nginx配置静态文件expires时间 cache-control
摘取天上星
06-07 1万+
对于站点中不经常修改的静态内容(如图片,JSCSS),可以在服务器中设置expires过期时间,控制浏览器缓存,达到有效减小带宽流量,降低服务器压力的目的。 以Nginx服务器为例:  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { #过期时间为30天, #图片文件不怎么更新,过期可以设大一点, #如果频繁更新,则可以设置得小一点。 expire
Chrome或Firefox浏览器静态资源文件缓存时长是多久
qq_35640866的博客
12-26 481
注意:加了这个标头后,浏览器在请求这个站点的js/css/图片资源时,每次都会重新发起HTTP连接请求,虽然请求的Header里会带上 If-Modified-Since,但是HTTP连接本身也是很耗资源的,所以要根据场景来选择性添加,问题解决很简单,在IIS的站点=》HTTP响应标头里,添加一个Header:Cache-Control,值为no-cache,1、在 2018年12月1号 12点0分1秒到 12点11分59秒,这12分钟内,浏览器不会发起http请求;
如何解决html+js+css缓存问题
06-10
HTML、JSCSS缓存问题可以通过以下几种方式来解决: 1. 文件本控制:给每个文件添加本号,每次文件更新时修改本号,这样浏览器会重新请求最新的文件。 2. 强制缓存和协商缓存:可以通过设置HTTP响应头来控制浏览器缓存行为。强制缓存通过设置Cache-Control和Expires头来告诉浏览器在一定时间内不需要重新请求资源,而协商缓存通过设置Last-Modified和ETag头来告诉浏览器是否需要重新请求资源。 3. CDN缓存:使用CDN可以通过将静态文件缓存在CDN服务器上来减少原始服务器的压力。CDN服务器通常会自动处理缓存问题,不需要手动设置。 4. 修改文件名:如果文件名中包含哈希值或时间戳,可以保证每次文件更新时文件名都会改变,这样即使缓存未过期也会重新请求最新的文件。 以上几种方法可以结合使用来解决HTML、JSCSS缓存问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 解决静态资源文件js/css缓存问题(超详细总结版) 17846
  • 使用postman发送post请求,却报错不支持get请求的原因 10722
  • springSecurity+oauth2实现权限认证系统(资源服务器与授权服务器分离,client信息入库,token存入redis持久化) 9337
  • MYSQL使用GROUP BY获取每组创建时间最大的一条数据 6261
  • tomcat部署war包时,访问路径如何取消包名前缀 5183

分类专栏

  • redis 7篇
  • springboot 5篇
  • java注解 1篇
  • redis源码 2篇
  • mybatis 2篇
  • jetcache 4篇
  • 缓存 6篇
  • http&https 2篇
  • nginx 5篇
  • Restful 1篇
  • springSecurity 2篇
  • oauth2 1篇
  • cookie 1篇
  • windows 1篇
  • leetcode 1篇
  • json 1篇
  • layui 1篇
  • MYSQL 3篇
  • tomcat 1篇

最新评论

  • 两个SpringSecurity本地项目登录冲突问题(Cookie不区分端口号)

    huang_hai_an: 请教下初了这种还有其他方法吗

  • MYSQL使用GROUP BY获取每组创建时间最大的一条数据

    weixin_50217553: 谢谢博主,limit加上后就好了

  • springSecurity+oauth2实现权限认证系统(资源服务器与授权服务器分离,client信息入库,token存入redis持久化)

    hnmwykka: 2022升级 Spring Security+OAuth2 精讲 打造企业级认证与授权【完整版11章】 下载地址:https://download.csdn.net/download/hnmwykka/86750369

  • springSecurity+oauth2实现权限认证系统(资源服务器与授权服务器分离,client信息入库,token存入redis持久化)

    VermouthSp: 现在好像授权注册的密码不加密都无法通过验证,现在都是加密后进行对比了

  • 使用postman发送post请求,却报错不支持get请求的原因

    banana_ligong: 解决了问题,谢谢大佬

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 基于Redis实现延时队列——Redisson延时队列解析
  • 单元测试报告与覆盖率报告——mac电脑下Jenkins集成Junit和Jacoco
  • 字节码增强——使用javassist生成一个类的复制类并添加字段和注解
2021年9篇
2020年22篇
2019年5篇

目录

目录

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司湖州企业网站改版公司阜新阿里店铺托管推荐合肥企业网站改版公司娄底关键词按天收费报价飞来峡网络营销报价巴中网站关键词优化公司贺州企业网站设计娄底网站优化软件推荐飞来峡百度标王报价平顶山营销网站价格辽阳企业网站建设推荐黄冈网站建设推荐荆州营销网站推荐鹰潭关键词按天扣费推荐坑梓网站优化多少钱广州如何制作网站价格漳州SEO按天收费汉中seo网站推广公司泸州百度标王推荐霍邱建设网站百色百姓网标王推广推荐罗湖企业网站建设报价池州网页制作哪家好观澜网站优化按天计费价格贵阳企业网站制作推荐关键词按天收费多少钱湘西企业网站改版报价白银seo网站优化黔南网络营销公司垦利品牌网站设计歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化