热腾网

 找回密码
 加入热腾

QQ登录

只需一步,快速开始

搜索
热腾网 首页 行业关系 阿里巴巴 查看内容

前端浏览器缓存及代码部署

2017-10-16 14:04| 发布者: 热腾网| 查看: 1166| 评论: 0

摘要: 原标题:前端浏览器缓存及代码部署 前言 最近手上刚刚拆掉石膏,去楼下房友帮忙。楼下房友领导来自阿里,前端用的是阿里的ant-design,设计将设计图上传到蓝湖,聊天工具也采用阿里的钉钉。有时间我 ...

原标题:前端浏览器缓存及代码部署

前言

最近手上刚刚拆掉石膏,去楼下房友帮忙。楼下房友领导来自阿里,前端用的是阿里的ant-design,设计将设计图上传到蓝湖,聊天工具也采用阿里的钉钉。有时间我也多多去楼下房友交流学习,多交流,就会有提升。最近也比较忙,好久没有更新博客了。闲言少叙,今天主要谈谈前端性能优化之浏览器缓存。

浏览器缓存

我前面写过浏览器缓存的文章,也写过html5离线缓存,关于这些缓存,我们很容易搞不清,例如:200 OK (FROM MemoryCache、FROM DiskCache) 及 304 NOT MODIFIED 还有 application cache (离线缓存)等等。

200 from memory cache 不访问服务器,直接读缓存,从内存中读取缓存。此时的数据时缓存到内存中的,当kill进程后,也就是浏览器关闭以后,数据将不存在。但是这种方式只能缓存派生资源

200 from disk cache 不访问服务器,直接读缓存,从磁盘中读取缓存,当kill进程时,数据还是存在。这种方式也只能缓存派生资源

304 Not Modified 访问服务器,发现数据没有更新,服务器返回此状态码。然后从缓存中读取数据。

三级缓存原理

先去内存看,如果有,直接加载

如果内存没有,择取硬盘获取,如果有直接加载

如果硬盘也没有,那么就进行网络请求

加载到的资源缓存到硬盘和内存

一般浏览图片,如下流程:

访问-> 200 -> 退出浏览器

再进来-> 200(from disk cache) -> 刷新 -> 200(from memory cache)

application cache和上面缓存有点区别,是离线缓存,就是资源可以从硬盘上读取而不用联网,即使断网,用户也可以浏览。

设置浏览器缓存

304是协商缓存还是要和服务器通信一次,要想断绝服务器通信,就要强制浏览器使用本地缓存(cache-control/expires),

一般有如下几种方式设置浏览器缓存。

1、通过HTTP的META设置expires和cache-control

<meta http-equiv="Cache-Control" content="max-age=7200" /> <meta http-equiv="Expires" content="Sun Oct 15 2017 20:39:53 GMT+0800 (CST)" />

这样写的话仅对该网页有效,对网页中的图片或其他请求无效。

2、apache服务器配置图片,css,js,flash的缓存

这个主要通过服务器的配置来实现这个技术,如果使用apache服务器的话,可以使用mod_expires模块来实现:

编译mod_expires模块:

Cd /root/httpd-2.2.3/modules/metadata/usr/local/apache/bin/apxs -i -a -c mod_expires.c //编译

先打开httpd.conf文件,然后查找expires这个模块,找到后,删除左边的#号,表示打这个模块,并重启apache服务器

编辑httpd.conf配置:添加下面内容

3、php等设置

缓存情况下前端代码部署

问题一:有了缓存,如何进行前端代码更新呢?

我们可以在资源文件或者图片后面添加版本号,如下图。

问题二:但是所有文件都加了版本号之后,我们只更改了一个文件,其他文件的缓存不是浪费了吗?

解决这个问题,我们可以用 数据摘要要算法,对文件求摘要信息,摘要信息与文件内容一一对应。如下图:

这样就解决了这个问题。

问题三:新的问题又来了,文件发布怎么办?

1、先部署页面,再部署资源:在二者部署的时间间隔内,如果有用户访问页面,就会在新的页面结构中加载旧的资源,并且把这个旧版本的资源当做新版本缓存起来,其结果就是:用户访问到了一个样式错乱的页面,除非手动刷新,否则在资源缓存过期之前,页面会一直执行错误。

2、先部署资源,再部署页面:在部署时间间隔之内,有旧版本资源本地缓存的用户访问网站,由于请求的页面是旧版本的,资源引用没有改变,浏览器将直接使用本地缓存,这种情况下页面展现正常;但没有本地缓存或者缓存过期的用户访问网站,就会出现旧版本页面加载新版本资源的情况,导致页面执行错误,但当页面完成部署,这部分用户再次访问页面又会恢复正常了。

好的,上面一坨分析想说的就是:先部署谁都不成!都会导致部署过程中发生页面错乱的问题。所以,访问量不大的项目,可以让研发同学苦逼一把,等到半夜偷偷上线,先上静态资源,再部署页面,看起来问题少一些。

如何解决这些问题呢?

这个问题,起源于资源的 覆盖式发布,用 待发布资源 覆盖 已发布资源,就有这种问题。解决它也好办,就是实现 非覆盖式发布,如下图:

看上图,用文件的摘要信息来对资源文件进行重命名,把摘要信息放到资源文件发布路径中,这样,内容有修改的资源就变成了一个新的文件发布到线上,不会覆盖已有的资源文件。上线过程中,先全量部署静态资源,再灰度部署页面,整个问题就比较完美的解决了。

总结如下:

1、 配置超长时间的本地缓存 —— 节省带宽,提高性能

2、采用内容摘要作为缓存更新依据 —— 精确的缓存控制

3、 静态资源CDN部署 —— 优化网络请求

4、更资源发布路径实现非覆盖式发布 —— 平滑升级


杯具

无语

很好

蛋定

愤怒

最新评论

热腾网X

未实名认证用户将不可发帖!

即日起,未实名认证用户将不可发帖,注册后,发帖请遵守当地法律法规。 【点击进行实名认证】...

点击查看详情