当前位置: 首页 > news >正文

Service Worker和HTTP缓存

很多人,包括我自己,初看Service Worker多一个Cache Storage的时候,就感觉跟HTTP长缓存没什么区别。
例如大家讲的最多的Service Worker能让网页离线使用,但熟悉HTTP缓存的朋友,会发现,把整站所有资源设置为长缓存(不带校验),也可以实现离线使用。

那么,Service Worker在缓存方面和HTTP缓存比较,有什么好处呢?

带着这个疑问,我翻阅了一些大神博客
JakeArchibald的《Caching best practices & max-age gotchas》
李熠的《设计一个无懈可击的浏览器缓存方案:关于思路,细节,ServiceWorker,以及HTTP/2》

根据实际项目经验,总结出以下。

Service worker除了针对PWA(推送和消息)以外,对普通web来说,在缓存方面,能比http缓存带来一些额外的好处。
可以理解为,SW就是浏览器把缓存管理开放一层接口给开发者。

1、改写默认行为。

例如,浏览器默认在刷新时,会对所有资源都重新发起请求,即使缓存还是有效期内,而使用了SW,就可以改写这个行为,直接返回缓存。

2、缓存和更新并存。

要让网页离线使用,就需要整站使用长缓存,包括HTML。而HTML使用了长缓存,就无法及时更新(浏览器没有开放接口直接删除某个html缓存)。而使用SW就可以,每次先使用缓存部分,然后再发起SW js的请求,这个请求我们可以实施变更,修改HTML版本,重新缓存一份。那么用户下次打开就可以看到新版本了。

3、无侵入式。

无侵入式版本控制。最优的版本控制,一般是HTML中记录所有js css的文件名(HASH),然后按需发起请求。每个资源都长缓存。而这个过程,就需要改变了项目结构,至少多一个js或者一段js控制版本号,发起请求时还需要url中注入冬天的文件名。使用了SW,就可以把这部分非业务逻辑整合到sw js中。
无侵入式请求统计。例如缓存比例统计、图片404统计。

4、额外缓存。

HTTP缓存空间有限,容易被冲掉。虽然部分浏览器实现SW的存储也有淘汰机制,但多一层缓存,命中的概率就要更高了。

5、离线处理。

当监测到离线,而且又没有缓存某个图片时,可以做特殊处理,返回离线的提示。又或者做一个纯前端的404/断网页面。类似Chrome的小恐龙页面。

6、预加载资源。

这个类似prefetch标签。

7、前置处理。

例如校验html/JS是否被运营商劫持?js文件到了UI进程执行后,就无法删除恶意代码,而在SW中,我们可以当作文本一样,轻松解决。当然,在HTTPS环境下出现劫持的概率是极低的。

相关文章:

  • java安全性的一种简单思路
  • ubuntu安装chrome
  • 【机器学习】--贝叶斯网络
  • Handler消息机制
  • 数字货币交易系统火爆的背后是政策的大力支持
  • dnspython模块常见用法
  • hadoop 的组建概述
  • RxJava -- fromArray 和 Just 以及 interval
  • ifup em2启动网卡时报错:connection activation failed
  • BOOST.ASIO源码剖析(一)
  • iis web.config 配置示例
  • 不要仅为85%的用户设计:关注无障碍设计
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • Oracle安装时,已有oracle用户,将用户添加到oinstall和dba用户组
  • freenom域名解析与次级域名
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • eclipse(luna)创建web工程
  • Flannel解读
  • gcc介绍及安装
  • interface和setter,getter
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • java第三方包学习之lombok
  • JS实现简单的MVC模式开发小游戏
  • learning koa2.x
  • Linux gpio口使用方法
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • React 快速上手 - 07 前端路由 react-router
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 树莓派 - 使用须知
  • 赢得Docker挑战最佳实践
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • Python 之网络式编程
  • 交换综合实验一
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #前后端分离# 头条发布系统
  • (八)Spring源码解析:Spring MVC
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (四) Graphivz 颜色选择
  • (四) 虚拟摄像头vivi体验
  • (一)WLAN定义和基本架构转
  • (转)EOS中账户、钱包和密钥的关系
  • (转)h264中avc和flv数据的解析
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET Framework与.NET Framework SDK有什么不同?
  • .Net MVC + EF搭建学生管理系统
  • .net下的富文本编辑器FCKeditor的配置方法
  • .Net中的设计模式——Factory Method模式
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [Android Pro] AndroidX重构和映射
  • [Android] Amazon 的 android 音视频开发文档
  • [Angular] 笔记 20:NgContent