全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

localStorage的黑科技-js和css缓存机制

一、发现黑科技的起因

今天在微信公众号看到一篇技术博文,想用印象笔记收藏,所以发送了文章链接到pc上。然后习惯性地打开控制台,看看源码,想了解下最近微信用了什么新技术。

呵呵,以下勾起了我侦探的欲望。页面加载后的异常点就是只加载了一个js,如下图所示:

我很诧异,为什么已经开启了Disable cache,js只加载了一个,而且体积这么小。接着,我按住Ctrl+O进行资源文件查找,发现我被“忽悠”了。其实根本就不止一个js文件。

脑袋里灵光一闪,不会是用localStorage做了缓存吧?!赶紧看了下localStronge,还真是。。。。

心里一阵澎湃,这不是我之前就想实现的加载性能优化的想法吗!乖乖,我孤陋寡闻了,已经有前端团队实现了代码。

二、谈谈文件加载方面的优化思路

通常,前端的资源文件加载优化,就是在文件不修改迭代的情况下,尽可能多地利用缓存,避免多次下载同样的文件。

一般的做法就是尽量延长资源的有效期,也就是设置 Cache-Control里的max-age,使页面资源请求的返回码为304,让浏览器直接使用本地缓存。

虽然pc端的协商缓存(304)很快,但手机端因为网络原因,协商缓存的效果就没pc端那么好了。而且,手机会经常清除本地缓存,所以文件缓存的时间也不会很长。

这个时候,localStorage就派上用场了。

localStorage相比cookie,可以缓存大体积的数据,而且是永久有效。所以,如果把js资源和css资源存储在localStorage中,则可以省去发送http请求所消耗的时间,大大提高用户的浏览体验。

三、用localStorage做资源缓存需要解决的问题

3.1 版本更新机制

只要一个项目还在迭代开发,就难以避免需要更新资源文件。

普通的资源请求,可以根据

文件名+md5 http://res.wx.qq.com/mmbizwap/zh_CN/htmledition/js/biz_wap/moon32ebc4.js

或者

在资源链接后面加上特定的后缀http://1.ss.faisys.com/js/comm/fai.min.js?v=201612051739

做标识来判断是否需要更新资源。

如果用localStorage做,则需要一套新的缓存更新机制。

3.2 搭建更新代码的脚手架

使用localStorage缓存,则需要一个新的脚手架来管理资源文件的读取和写入。

3.3 后台输出一份资源配置信息

因为需要前端做资源更新,所以后台要输出一份依据给前端做判断用,也就是需要一份资源配置信息。前端根据配置信息,进行匹配和比较,最终决定 使用localStorage缓存,还是重新发起请求,下载最新的资源文件。

3.4 存在XSS安全隐患

localStorage中的信息,客户端是可以任意修改的。如果哪个黑客想练手一下,可以任意注入js代码。那么,在页面刷新的时候,注入的代码也将会被执行。

四、微信的做法解析

4.1 版本标识

以__MOON__a/a_report.js为例,版本信息用key __MOON__a/a_report.js_ver存储,存储的value为//res.wx.qq.com/mmbizwap/zh_CN/htmledition/js/a/a_report32e586.js。

如果按普通加载方式,直接将该value取出来,设置到script节点的src属性,即可完成加载。

微信判断该版本是否最新,就是用该value值与后台输出的配置信息进行比较,最后得出是否更新的结果。

如果value值与配置信息一致,则使用缓存。否则,重新发起请求加载。

4.2 脚手架

可以看出,微信使用的是自己开发的脚手架moon.js,在这个网页中的实际文件名是moon32ebc4.js。

因为是混淆过变量名的文件,所以要看出具体代码的走向,有点费劲,这里就不做分析了。

4.3 资源配置信息

因为脚手架moon.js需要资源配置信息才能正常工作,所以配置信息一定会在moon.js之前输出。

依次查看moon.js之前的script标签,发现了window.moon_map这个json对象。

利用控制台输出该变量查看信息如下:

看到这里,可以明确一个点:这就是更新机制所必备的资源配置信息表了。

而且,可以看出,该配置信息json对象的key,就对应localStorage中的key。同理,value值也是一一对应。

4.4 XSS攻击

此处是为了验证微信的缓存机制是否存在XSS攻击,看到这里的童鞋可千万不要去做坏事。

我在一个js缓存代码中,插入alert("hehe");,看页面刷新的时候,是否会出现该弹窗,来验证是否存在攻击漏洞。

刷新页面后,结果如下图:

可以看出,微信也没有解决这类问题。所以,这种缓存机制,还是有先天不足的。

4.5 测试微信的更新机制

修改localStorage中 key __MOON__a/a_report.js_ver对应的value值,让微信的脚手架moon.js更新__MOON__a/a_report.js,刷掉我刚才主动插入的代码。

这里,我修改文件名为***587.js(原来的文件名为***586.js)。接着F5刷新页面。

结果为:report.js代码更新了,版本号也恢复回 ***586.js

五、结论

localStorage缓存有其用武之地,但不是万能的。需要注意以上提及的坑。

可以应用的场景我归纳为以下几点:

1. 非首屏渲染需要的css文件,可以做LS缓存。

首屏渲染需要的css,需要按常规方式输出,因为SEO需要,不然爬虫爬取页面的时候,页面效果会很不好。而非首屏的css,则可以用LS缓存,减少资源下载时间。

2. 展示类、动画类等非业务主要逻辑的代码,可以做LS缓存。

这样,可以一定程度上避免业务层的安全漏洞。当然,前端再怎么做防护都是一层薄纸。重要的,还是后台接口要做好安全保护。

3. 移动端可以做LS缓存。PC端做LS缓存,起到的优化作用不大。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# localstorage缓存  # localstorage  # 使用jquery读取html5 localstorage的值的方法  # JavaScript使用localStorage存储数据  # JS 中LocalStorage和SessionStorage的使用  # JS中LocalStorage与SessionStorage五种循序渐进的使用方法  # JS中利用localStorage防止页面动态添加数据刷新后数据丢失  # JS实现本地存储信息的方法(基于localStorage与userData)  # JavaScript中localStorage对象存储方式实例分析  # 移动端使用localStorage缓存Js和css文的方法(web开发)  # 详解JavaScript中localStorage使用要点  # Javascript 计算字符串在localStorage中所占字节数  # JS localStorage实现本地缓存的方法  # JS+HTML5本地存储Localstorage实现注册登录及验证功能示例  # 加载  # 资源配置  # 可以看出  # 则可  # 可以任意  # 如下图  # 是否存在  # 则需  # 的是  # 都是  # 迭代  # 我在  # 好了  # 看了  # 在这个  # 是有  # 还在  # 将会  # 这就是  # 孤陋寡闻 


相关文章: 建站主机数据库如何配置才能提升网站性能?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  如何选择可靠的免备案建站服务器?  高防服务器租用如何选择配置与防御等级?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  中山网站制作网页,中山新生登记系统登记流程?  定制建站流程解析:需求评估与SEO优化功能开发指南  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  制作网站的基本流程,设计网站的软件是什么?  定制建站哪家更专业可靠?推荐榜单揭晓  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  历史网站制作软件,华为如何找回被删除的网站?  平台云上自主建站:模板化设计与智能工具打造高效网站  如何通过虚拟主机快速完成网站搭建?  如何有效防御Web建站篡改攻击?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  做企业网站制作流程,企业网站制作基本流程有哪些?  用v-html解决Vue.js渲染中html标签不被解析的问题  建站之星安装需要哪些步骤及注意事项?  如何解决ASP生成WAP建站中文乱码问题?  如何安全更换建站之星模板并保留数据?  如何选择域名并搭建高效网站?  浅谈Javascript中的Label语句  如何撰写建站申请书?关键要点有哪些?  如何在搬瓦工VPS快速搭建网站?  ,巨量百应是干嘛的?  网站图片在线制作软件,怎么在图片上做链接?  贸易公司网站制作流程,出口贸易网站设计怎么做?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  宝塔面板如何快速创建新站点?  为什么Go需要go mod文件_Go go mod文件作用说明  模具网站制作流程,如何找模具客户?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  如何在服务器上配置二级域名建站?  香港服务器如何优化才能显著提升网站加载速度?  兔展官网 在线制作,怎样制作微信请帖?  建站主机空间推荐 高性价比配置与快速部署方案解析  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  建站之星×万网:智能建站系统+自助建站平台一键生成  建站主机CVM配置优化、SEO策略与性能提升指南  如何在自有机房高效搭建专业网站?  如何配置FTP站点权限与安全设置?  油猴 教程,油猴搜脚本为什么会网页无法显示?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  定制建站是什么?如何实现个性化需求?  网站制作公司排行榜,四大门户网站排名?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。