Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >localStorage的黑科技-js和css缓存机制

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

作者头像
我是leon
发布于 2019-08-28 03:50:34
发布于 2019-08-28 03:50:34
4.4K0
举报
文章被收录于专栏:leon的专栏leon的专栏

一、发现黑科技的起因

今天在微信公众号看到一篇技术博文,想用印象笔记收藏,所以发送了文章链接到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缓存,起到的优化作用不大。

六、番外

有兴趣的童鞋,还可以看看知乎上大神们的讨论,静态资源(JS/CSS)存储在localStorage有什么缺点?为什么没有被广泛应用? - 互联网 - 知乎  另外,腾讯网的前端,在gitHub上有分享其MT 模块管理框架,可以看看具体的实现逻辑。  最后,上一个栗子 —— 线上实例demo:webapp模块化开发体系

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-01-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《前端工程化》-- 2. 脚手架/3. 构建
脚手架一词最早来源于建筑工程领域,是一种辅助工程建设的临时性设施。引申到软件开发领域,脚手架作为一种创建项目初始文件的工具被广泛地应用于新项目或者迭代初始阶段。
爱学习的程序媛
2022/04/07
1.2K0
《前端工程化》-- 2. 脚手架/3. 构建
Carson带你学Android:手把手构建WebView缓存机制及资源预加载方案
由于 File System是 H5 新加入的缓存机制,所以Android WebView暂时不支持
Carson.Ho
2022/03/24
2.5K0
Carson带你学Android:手把手构建WebView缓存机制及资源预加载方案
H5 缓存机制浅析 移动端 Web 加载性能优化
1 H5 缓存机制介绍 H5,即 HTML5,是新一代的 HTML 标准,加入很多新的特性。离线存储(也可称为缓存机制)是其中一个非常重要的特性。H5 引入的离线存储,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问。 H5 应用程序缓存为应用带来三个优势: 离线浏览 用户可在应用离线时使用它们 速度 已缓存资源加载得更快 减少服务器负载 浏览器将只从服务器下载更新过或更改过的资源。 根据标准,到目前为止,H5 一共有6种缓存机制,有些是之前已有,有些是 H5 才新加入的。 浏览器缓存机制
腾讯Bugly
2018/03/22
2.3K0
H5 缓存机制浅析 移动端 Web 加载性能优化
Vue 打包上线后的缓存问题
大家用vue脚手架搭建前端工程时,常被缓存问题所困扰,具体的表现就是,当程序版本升级时,用户因为缓存访问的还是老的页面,然后很多同学很暴力的直接在index.html中加入了这几行代码:
前端逗逗飞
2021/04/30
5.1K0
现代前端技术解析:前端跨站技术
随着前端技术栈在服务端和移动端上的尝试和日益成熟,前端工程师的追求绝不只是页面上的技术,如何实现跨服务端,如何扩展到移动端开发将变成主要讨论议题。
奋飛
2019/08/15
1.2K0
前端静态资源缓存策略
页面加载提速是战场,首当其冲要优化的就是 静态资源(js|css) 的加载速度。我们小组去年基于Vue开发了一个积分商城单页面应用。本文旨在与大家分享在单页应用中使用纯前端手段加速静态资源的获取,从而达到页面加速。
andychai
2018/10/19
3.4K0
前端静态资源缓存策略
第二章:项目环境搭建【基于Servlet+JSP的图书管理系统】
  通过IDEA创建maven项目。勾选脚手架工具。选择maven-archetype-webapp
用户4919348
2023/07/11
2220
第二章:项目环境搭建【基于Servlet+JSP的图书管理系统】
在阿里加班腻了,回到老家西安作为前端架构师,搞事情!
众所周知,当今中国,不考虑某些不和谐的东西,最赚钱的只有两个行业,那就是 IT,以及金融。
山月
2021/12/20
6740
在阿里加班腻了,回到老家西安作为前端架构师,搞事情!
【优化】vue项目缓存引发的白屏
近期vue项目在构建完成上线之后,每次往线上更新版本,总会收到一部分反馈——web页面白屏,需要清除缓存数据重新加载才能正常访问。
流眸
2020/12/15
3.3K0
Vue-cli4.5 脚手架学习/超详细
前言/脚手架的介绍与作用: Vue-cli脚手架官方中文文档:cli.vuejs.org/zh/guide/ 1. vue脚手架是什么? 它是一个专门为单页面(SPA)应用快速搭建繁杂的脚手架,它是基于webpack的基础开发出来的一款能够快速的帮助我们构建一个用来开发vue的项目目录、结构(vue和webpack的项目模板)。 vue脚手架通常使用在大型项目中,能够加快我们的开发速度。而小型项目不推荐使用脚手架,因为反而会拖慢我们项目的开发速度。 2. 为什么会有vue脚手架? 因为 we
玖柒的小窝
2021/10/09
8630
Vue-cli4.5 脚手架学习/超详细
浏览器缓存机制
简单的说,通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)。
周三不加班
2019/06/02
1.1K0
微前端在美团外卖的实践
微前端是微服务理念在前端的应用。之前美美给大家介绍过微前端在美团HR系统和美团闪购的实践文章。
前端劝退师
2020/03/17
1.1K0
一文彻底搞懂前端缓存机制
1)浏览器在加载资源时,先根据这个资源的一些http header判断它是否命中强缓存,强缓存如果命中,浏览器直接从自己的缓存中读取资源,不会发请求到服务器。比如某个css文件,如果浏览器在加载它所在的网页时,这个css文件的缓存配置命中了强缓存,浏览器就直接从缓存中加载这个css,连请求都不会发送到网页所在服务器;
hellocoder2029
2022/10/21
6550
跨年都在更新的 vite 到底有多香?
2020年太难了,终于等到元旦能放假休息几天,闲着没事逛微博,然后,收到了来自米国的礼物:Vite2.0;
西岭老湿
2021/02/07
3.5K0
跨年都在更新的 vite 到底有多香?
HTML5 - 应用程序缓存(Application Cache)
在HTML5之前,我们需要接入网络才能访问,这毫无疑问是网站多次请求服务器,造成速度变慢,对于PC用户,网络相对比较稳定,载入速度也不会差太多。但是移动端呢?移动端依赖无线信号、依赖信号塔、位置不固定、受附近建筑影响等。一系列导致网络的不稳定,我们不能改变用户,也不能放弃网络较慢的用户。 还有,在混合app领域,经常使用内置webview加载html页面,如果网速太慢,依然会造成上述问题。
1338335202用户
2022/12/19
1.5K0
HTML5 - 应用程序缓存(Application Cache)
移动 H5 首屏秒开优化方案探讨
导语 随着移动设备性能不断增强,web 页面的性能体验逐渐变得可以接受,又因为 web 开发模式的诸多好处(跨平台,动态更新,减体积,无限扩展),APP 客户端里出现越来越多内嵌 web 页面(为了配上当前流行的说法,以下把所有网页都称为 H5 页面,虽然可能跟 H5 没关系),很多 APP 把一些功能模块改成用 H5 实现。 虽然说 H5 页面性能变好了,但如果没针对性地做一些优化,体验还是很糟糕的,主要两部分体验: 页面启动白屏时间:打开一个 H5 页面需要做一系列处理,会有一段白屏时间,体验糟糕。 响
腾讯Bugly
2018/03/23
3.6K0
Vue-cli解析
前言 这段时间,算是空出手来写几篇文章了。由于很久都没有时间整理现在所用的东西了,所以,接下来会慢慢整理出一些文档来记录前段时间的工作和生活。 正文 首先,我们来说一下安装的东西吧!处于有头有尾的目的,还是几句话草草了事。步骤如下: 安装vue-cli 以webpack模版安装目录 这样之后,我们就可以使用IDE打开目录了。 此处注明我的vue-cli的版本2.9.2,以免之后改版之后,误导读者。 之后,附上自己的目录截图,并没有做改动,如图: 'use strict' constpath=requir
企鹅号小编
2018/01/26
1.1K0
9102年:手写一个Vue的脚手架 【极致优化版】
如果你对webpack不是很了解,请你关注我之前的文章,都是百星以上star的高质量文
Peter谭金杰
2019/08/02
9510
前端工程化-Feflow实践
前言 前端工程化是指将开发阶段的代码转变成生产环境的代码的一系列步骤。主要包括构建,分支管理,自动化测试,部署等步骤。本文将介绍团队在前端工程化的实践,主要采用feflow作为前端工作流,并结合Git工作流,将前端开发流程中的各个步骤进行流程化,从而提高开发效率。 Feflow 简介 Feflow是一个用于提升开发效率的前端工作流和规范工具,托管在Github上:Tencent/feflow,目前start 941,官网:https://feflowjs.com/zh/ 设计思想 Feflow 借鉴了 P
QQ音乐前端团队
2021/03/22
1.5K0
React脚手架
react脚手架: 用来帮助程序员快速创建一个基于react库的模板项目,包含了所有需要的配置(语法检查、jsx编译、devServer…),下载好了所有相关的依赖, react提供了一个用于创建react项目的脚手架库: create-react-app,项目的整体技术架构为: react + webpack + es6 + eslint,使用脚手架开发的项目的特点: 模块化, 组件化, 工程化。
小二丶
2023/11/27
4560
相关推荐
《前端工程化》-- 2. 脚手架/3. 构建
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档