关于更新发布CSS和JS文件的缓存问题

时间:2021-09-04 13:04:14

现如今,浏览器大战下,各个浏览器也是拼了命的提高性能,升级JS解析引擎,更好的处理浏览器的页面缓存,让用户的浏览体验更快,占用更小的PC资源。那么,问题就出现在JS和CSS缓存,甚至页面缓存上。至于浏览器对页面的缓存,我们一般通过在服务端发送页面的时候设置页面的生存期,一般几个小时就能缓解很大的服务器压力,并且,对浏览者来讲,本地页面晚更新几个小时可能问题也不大。但,问题是,如果页面发生了更新,但是该页面链接的JS和CSS文件却被浏览器缓存下来,只有待浏览器重启后才能被删除,甚至有些浏览器重启后也不主动删除JS和CSS的缓存文件。这样页面与JS和CSS文件就可能发生脱节了,从而出现某种异常现象,甚至页面崩溃。更坑爹的现象是,现在用户为了保存自己的工作(娱乐)状态,根本就长时间不关机,当然也不关闭浏览器。从而使得该问题变得更加严重。

这里提供一种简单并且常用的JS和CSS的缓存解决方案。我们看新浪微博的首页。

关于更新发布CSS和JS文件的缓存问题

新浪微博首页

该页面加载完毕后的头部代码如下(使用Fiirbug等Ajax调试工具打开):

关于更新发布CSS和JS文件的缓存问题

新浪微博HTML头部分代码

注意上面的每个JS文件和CSS文件都加上了一个时间戳作为版本号。

<script type=”text/javascript” src=”{JS文件连接地址}?version=XXXXXXXX”></script>


<link rel=”stylesheet” type=”text/css” href=”{CSS文件连接地址}?version=XXXXXXXX”>

因为浏览器缓存的时候是以URL作为存储单位(还记得POST页面的返回按钮的问题吧?),

从而当每次首页的文件发生更新的时候只需要更改上面的版本号,就能提醒浏览器重新下载该文件了。


我们的用户量大,修改js文件后,用户反馈登录出现问题。实际上刷新一下就没事了。就是因为用户的浏览器使用的还是本地缓存的js代码。
强制刷新一般就会重新去服务器获取新的js代码。但不能让用户每次都这样子去做。
于是我思考一个问题:

如果修改了js文件中的js代码,发布代码到线上后。用户的浏览器使用的还是原来js缓存。所以并不会马上生效。

如何才能让浏览器使用最新的js文件呢?

很多人想到的第一反应是,在<script type="text/javascript" src="/js/common.js" ></script>在后面加一个时间戳来解决。这样url地址每次变化,浏览器就会请求服务端的js,而不会使用缓存。

这样是解决了。但是会导致浏览器每次都要去请求服务端的js文件。占用带宽。作为技术,能不能有种更好的办法呢?既能避免用户的浏览器每次去请求服务端获取js文件。又能在发布新的js代码后,能够使用最新的js文件?

据说,在问号后面加版本号,现在很多网站都这么干。加个版本号能够解决问题吗?

加个版本号,js有个版本。如果每次发布新的js代码。后面就会附加新的版本号。然后用户加载html页面的时候。版本号附加在在
<script type="text/javascript" src="/js/common.js?v=99" ></script>
如果没有修改,那么版本号还是原来的,这样做到了:不发布代码的时候,浏览器使用的是本地缓存。因为版本号没有变化。
现在疑问是,js的版本号如何生成呢?
生成一个日期吗?
当天的日期比较好。
这样的确解决了问题。让用户可以使用。
只不过出现一个新的问题来临了。
js文件加上当天的发布日期作为版本号即可了。
有些人针对url后面带时间戳的做法,会导致浏览器每次请求都不会缓存,因为每次请求时间都会变化,url就变化了,于是浏览器认为是一个新的地址了。
有人针对这个问题的解决办法是:这里URI不是静态,可能会造成某些浏览器不会进行缓存,可以采用伪静态配合URL重写来解决
 

网上查询资料,纵观大家的解决思路总结如下:

1、修改js的文件名。我觉得这样很麻烦。造成版本系统的维护困难。不建议。除非是完全ftp。不过每次发布都修改文件名称。的确造成维护的时候很茫然,接手的人看到文件名称变化,会比较难维护

2、路径后面加时间戳或者随机数的方式。

一般都是在html模版中使用一个时间戳或者随机数函数生成一个值。

<script type="text/javascript" src="{{passport_host}}js/common.js?t={{date("Y-m-d")}}" ></script> 今天和明天的值不同了,重新请求服务器。

<script type="text/javascript" src="{{passport_host}}js/common.js?t={{time()}}" ></script> 使用时间戳,每刷新一次html,值都不同。随机数也是一样的

不推荐使用这种方式。

因为这样的方式导致的问题是,每次刷新html,时间戳都是变化的,url就总是唯一的,于是浏览器总是去请求服务端获取js文件,不会使用浏览器本地的缓存。占用带宽,影响速度

3、路径后面加js的版本号。这样是业界比较成熟的做法。

关键是这个版本号,怎么做版本? 难道真的纳入版本系统里面去?不是的。我突然灵感来,想到一种程序员自己控制的办法。

自己主动加时间,如果本次发布,修改了哪几个js文件。那么就在后面加上一个时间点:年月日

如果一天会发布多次对js文件的修改,那么程序员还要精确点。年月日时分秒即可。

如下:

<script type="text/javascript" src="/js/common.js?time=20150518" ></script>

我去看了一下淘宝,发现也是这样一种方式额,不知道对不对?

如下:

关于更新发布CSS和JS文件的缓存问题

15年8月12日补充:

公司有好几千万注册会员,于是第三方应用使用我们网站会员帐号实现在第三方网站登录,需要设计oauth2.0授权的平台,于是需要参考微博的oauth*。

无意中发现他们的css也是使用年月日来控制

aaarticlea/png;base64,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WBHffAQAAAALYP8nP0lL/pikO+/c9+ST9PbbU5dSrly58dnPXnvwQfrqq9ONDwByQqYOAACwdxx49FH6lre430i679Chm557bt+jj9K3vCV9yXPnrn/kI9effnr6MQJAVsjUAQAA9g6lXN7fau3/9KeDoef7Dh8+8OyzygMPZMnX6YkTVzc3b3znO1MOEwAyQaYOAACwp+w7fHjfBz7ATlEOHtz/sY8d+I//kdTrqYsro9GNo0evP/EE/clPphYjAGSCTB0AAGAlKHfccWBra//Jk+Sf/bPUmempU9fuvffGSy/NIDAAEEGmDgAAsEKUcvnAU09ludlUuXLlxvHjuNMUYI6QqQMAAKycHDebnjt37f77r58+PZO4ACACmToAAMCKynizqXLlCn388aubm3Q0mllsAECQqQMAAKyy7DebKqPR9c1N3GkKMEvI1AEAAFade7PpviefTL3ZlJ46dW1zE3eaAswGMnUAAAAghJB9hw4deOqpfZ//vPxmU+XSpRvHj187fhzFdYBpQ6YOAAAAoX0f+MBNzz2nfPKTKTebvvTStXvvxZ2mAFOFTB0AAADi9v+rf+XebCqZx73T9NqDD+JOU4ApQaYOAAAAHO7NpvuffTblZtNz565vbl5/+ulZxQWwQpCpAwAAgFDGm03piRNXP/zhG9/5zswCA1gFyNQBAAAgRZabTZVLl24cPXptext3mgIUBZk6AAAAZJLpZlPLunbvvTe+9rUZxgWwZyFTBwAAgBy8m02PHBHNoFy5cuOzn7324IP01VdnGRjA3oNMHQAAAPJRDh7c/9BD+599lvzmbwpnOnfu2v33405TgEkgUwcAAIBxKHfcceCxxyQ3mypXrtATJ65ubuJOU4DxIFMHAACA8Xk3mz76qOhmU2U0unH06PUnnsCdpgB5IVMHAACASe07fPim555THnhAdLMpPXXq2ubmjZdemnFgAEsNmToAAAAUY//HPia52VS5dOnG8ePXjh/HnaYAGSFTBwAAgMKk32z60kvX7r//+unTs40LYCkhUwcAAICCyW82Va5coY8/fnVzk45Gs48NYIlMMVO3m4rStKfX/uQcU1MURVEUzXTmHQsAAMBeI7/ZVBmNrm9uXn/6adxpCiBSWKbumFosMV+rqEU1zm2fy9Ry/HFQavUopSMjY5x2Ezk9AABATvsOHz5w8qToZlN6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" alt="" />

进一步思考:

这种加时间方法是可行。。不是系统生成的时间,不是所有js文件都加。

是不是可以进一步考虑一种办法,用程序来进行开关呢?

自己勾选。如果这个文件修改了。那么就设置为更新。模版中判断,就根据这个开关,把时间戳自动打上去?

不过这样子觉得没必要。因为还没到那么重大。其实初期,完全可以程序手动把日期打上去即可了。

该了什么js文件,就给哪个js文件加,这样已经是折衷了。就跟改代码一样。代码都要修改的,这点改也没多少工作量。

总结思路:

js文件的内容修改了,可以加个t参数表明一下日期,用这个日期来作为版本号,看到日期也能知道是哪天发布的。

没有修改js文件根本就不用修改日期。

实践:

<script type="text/javascript" src="{{passport_host}}js/common.js?t=20150622" ></script>

如果下一次修改了这个js文件,那么发布的时候,就修改日期

<script type="text/javascript" src="{{passport_host}}js/common.js?t=20150628" ></script>

没有修改的js文件,保留原来的值不动即可。