迎关注我的头条号:Wooola,专注于Java、Golang、微服务架构,致力于每天分享原创文章、快乐编码和开源技术。
最近发版前端项目,用户经常反馈新添加功能在线上环境不好用,常出现新老页面并存的状况。经前端同事排查法发现,实际上只需要重新刷新一下页面就没事了。但是每次去通知用户肯定不现实,所以需要对前端的js和css等文件采取一定的缓存失效的措施,强制浏览器重新去服务器获取新的js代码以及css文件。
楼主经过实际的项目情况反馈,总结以下两点切实可行的办法,分享给大家,希望对大家有帮助。
时间版本号
如果每次发布,针对修改过的js或者css文件路径加上时间的版本号,一般以年月日拼写。
<script type="text/javascript" src="lib/common.js?v=20190719"></script> <link rel="stylesheet" type="text/css" href="assets/css/ie/ie8.css?v=20190719" />
如果发生紧急情况,需要在一天当中对某些css或者js文件多次发版,可以把时间精确到时分秒。
目前楼主主推采用加版本号的方式,因为文件太多,只能做增量修改。好处是没有做任何修改js或者css文件可以不用加版本号。
采用随机数
document.write('<script src=\".lib/common.js?r=' + Math.random() + "\"" + '><\/script>');
一般不建议用随机数的方式,因为每次刷新页面,随机数都会变化,那么浏览器认为一个新的url需要重新请求服务端获取js或css文件,不会在使用浏览器本地缓存。同时占用网络带宽,影响服务器响应速度。
可以利用 gulp-rev或者webpack
entry: { main: './src/common.js', slove: './src/ie8.js' }, output: { filename: '[name].[hash].js', path: path.resolve(__dirname, 'dist') }
例如百度搜索首页,就是利用hash给js和css文件重命名。
. 前端缓存概述
前端缓存主要是分为HTTP缓存和浏览器缓存。其中HTTP缓存是在HTTP请求传输时用到的缓存,主要在服务器代码上设置;而浏览器缓存则主要由前端开发在前端js上进行设置。下面会分别具体描述。
2. 前端缓存分类
2.1 HTTP缓存
整体流程
HTTP缓存都是从第二次请求开始的。
第一次请求资源时,服务器返回资源,并在respone header头中回传资源的缓存参数;第二次请求时,浏览器判断这些请求参数,击中强缓存就直接200,否则就把请求参数加到request header头中传给服务器,看是否击中协商缓存,击中则返回304,否则服务器会返回新的资源。
HTTP缓存分为强缓存和协议缓存,它们的区别如下:
200 from disk or 200 from memory
强缓存的200也有两种情况:200 from disk和200 from memory。现在我没有找到明确的文档来描述这种区别的发生条件。知乎这个问题中提到了一些情景,可以自行取用。
2.1.1 强缓存
2.1.2 协商缓存
协商缓存都是成对出现的。
2.1.3 最佳优化策略——消灭304
最佳优化策略:因为协商缓存本身也有http请求的损耗,所以最佳优化策略是要尽可能的将静态文件存储为较长的时间,多利用强缓存而不是协商缓存,即消灭304。
但是给文件设置一个很长的Cacha-Control也会带来其他的问题,最主要的问题是静态内容更新时,用户不能及时获得更新的内容。这时候就要使用hash的方法对文件进行命名,通过每次更新不同的静态文件名来消除强缓存的影响。
Hash命名:
2.2 浏览器缓存
2.2.1 本地存储小容量
Cookie主要用于用户信息的存储,Cookie的内容可以自动在请求的时候被传递给服务器。
LocalStorage的数据将一直保存在浏览器内,直到用户清除浏览器缓存数据为止。
SessionStorage的其他属性同LocalStorage,只不过它的生命周期同标签页的生命周期,当标签页被关闭时,SessionStorage也会被清除。
2.2.2 本地存储大容量
WebSql和IndexDB主要用在前端有大容量存储需求的页面上,例如,在线编辑浏览器或者网页邮箱。
2.2.3 应用缓存与PWA
应用缓存全称为Offline Web Application,它的缓存内容被存在浏览器的Application Cache中。它也是一个被W3C标准废弃的功能,主要是通过manifest文件来标注要被缓存的静态文件清单。但是在缓存静态文件的同时,也会默认缓存html文件。这导致页面的更新只能通过manifest文件中的版本号来决定。而且,即使我们更新了version,用户的第一次访问还是会访问到老的页面,只有下一次再访问才能访问到新的页面。所以,应用缓存只适合那种常年不变化的静态网站。如此的不方便,也是被废弃的重要原因。
PWA全称是渐进式网络应用,主要目标是实现web网站的APP式功能和展示。尽管PWA也有manifest文件,但是与应用缓存却完全不同。不同于manifest简单的将文件通过是否缓存进行分类,PWA用manifest构建了自己的APP骨架。另外,PWA用Service Worker来控制缓存的使用。这一块的内容较多,在这里就不详细展开了。
2.2.4 往返缓存
往返缓存又称为BFCache,是浏览器在前进后退按钮上为了提升历史页面的渲染速度的一种策略。BFCache会缓存所有的DOM结构,但是问题在于,一些页面开始时进行的上报或者请求可能会被影响。这个问题现在主要会出现在微信h5的开发中。
总结:本文梳理了前端所有可能涉及的缓存,希望能从整体层面建立起系统的缓存知识体系。描述都比较简略,起到抛砖引玉之用。如有错误,还望见谅。
.14号上午11点,MIUI 7已全面支持开放升级。支持的机型有:小米手机2/2S、小米手机3、小米手机4、小米Note/顶配版、红米手机系列、红米Note 系列,下面让我们一起来看下如何进行升级呢?
1、不双清卡刷
这个非常简单,只要下载好对应机型的卡刷包放在手机存储在系统更新里面选择刷机包即可,以下是详细的图文教程:
根据自己机型下载好官方卡刷包,下载地址:http://www.miui.com/download.html
下载好后把刷机包放在手机内置存储或者SD卡内,打开“系统升级”,点击升级界面右上角的三点。如下图:
在弹出的菜单选择“手动选择安装包”,然后会跳到文件管理器,选择存包的位置选择刷机包就可以了,这里会提示重启,点重启就OK。接下来就让ROM飞一会吧,手机会自动安装刷机包,安装完后会自动重启进系统。
小结:这就是不双清卡刷的方法,但是要注意的是,只有安装比手机当前系统版本高的刷机包才不用双清,如果是降级或者系统有问题的还是看看双清的刷机方法吧。另外,红米系列选择刷机包后直接提示重启,然后在Rec里面自动完成刷机包的安装,小米系列(1,2,3,4)是在系统更新内完成安装然后直接重启进系统的,那是因为小米系列支持双系统。(红米手机1不适用)
2、双清卡刷:
这个也不难,和上面刷机过程差不多,只是方法不一样
双清前要先备份好个人数据,不如然清除后就没有了。首先给卡刷包改名,改成“update.zip”,记住后缀是".zip",改完名后放在手机“内置”存储,然后关机,手机在关机状态下同时按住"音量加"和"电源键"进入Rec(恢复模式),官方Rec操作方法:音量加减是选择键,电源键是确认。中间的图就是Rec主界面,这里选择简体中文(看得懂英文也可以选英文啦),选择清除数据。如下图所示:
这里我们只说双清,双清就是清除”系统缓存“和”用户数据“两项,选择进去确定清除就OK,两项操作方法一样的,清除这两项之后回到主菜单,选择"将update.zip安装至系统",这也就是刚刚要给刷机包改名的原因了,这里只能识别叫做"update.zip"的包。如下图:
选择"将update.zip安装至系统"后还会有一个确认提示,这里选择确认就OK。接下来又是ROM飞的时候了,待进度条走到100会自动重启进入系统。
小结:这就是双清卡刷了,双清时要注意其他的项目不能清除,否则之前放在存储里面的刷机包也会被清掉。
3、MiFlash线刷:
这个超级简单,但是需要一台电脑。要准备的东西有:
Miflash刷机工具,下载地址:http://www.xiaomi.cn/content-19-10672-1.html
官方线刷包,下载地址:http://rom.xiaomi.cn 或:http://www.miui.com/shuaji-393.html
下载好刷机工具后先安装到系统,如下图(步骤按图片顺序):
这是安装完成后的提示,直接点击结束:
打开Miflash,然后要到手机端操作了,手机关机状态下同时按住"音量减"加"电源键",会出现一只米兔和Fastboot字样,这里就进入到Fastboot模式了,接着手机用数据线连接到电脑,电脑端Miflash中点击”刷新“按钮,就会看到有一个设备在列表里面了,如下图:
把下载好的线刷包解压出来,解压后我们得到一个这样的文件夹,刷机包名字根据机型来定的,反正都是一串英文。如下图:
接着点击"浏览"按钮,选择解压好的刷机包路径:
选择好后是是这个样子的:
点击刷机就可以了,刷机期间手机端的Fastboot不会有反应,但是电脑端有进度条和时间显示,刷完一样自动重启进系统,刷机过程不能拔数据线,刷好之后是这样的:
*请认真填写需求信息,我们会在24小时内与您取得联系。