一、背景
如今的App开辟,或多或少都邑用到Hybrid模式,到了WebView这边,经常会加载一些js文件(例如和WebView用来Native通信的bridge.js),而这些js文件不会经常产生变更,所以我们欲望js在WebView琅绫擎加载一次之后,如不雅js没有产生变更,下次就不消再提议收集请求去加载,大年夜而削减流量和资本的┞芳用。那么竽暌剐什么方法可以达到这个目标呢?先得大年夜WebView的缓存道理入手。
二、WebView的缓存类型
WebView重要包含两类缓存,一类是浏览器自带的网页数据缓存,这是所有的浏览器都支撑的、由HTTP协定定义的缓存;另一类是H5缓存,这是由web页面的开辟者设置的,H5缓存重要包含了App Cache、DOM Storage、Local Storage、Web SQL Database 存储机制等,这里我们重要介绍App Cache来缓存js文件。
三、浏览器自带的网页数据缓存
1.工作道理
浏览器缓存机制是经由过程HTTP协定Header里的Cache-Control(或Expires)和Last-Modified(或 Etag)等字段来控制文件缓存的机制。关于这几个字段的感化和浏览器的缓存更新机制,大年夜家可以看看这两篇文┞仿(H5 缓存机制浅析 移动端 Web 加载机能优化,Android:手把手教你构建 WebView 的缓存机制 & 资本预加载筹划),琅绫擎有具体的介绍。下面大年夜我实际应用的角度,介绍一下平日会在HTTP协定中碰到的Header。
下面两个字段是提议请求时,办事器决定文件是否须要更新的字段。
- Last-Modified:Wed, 28 Sep 2016 09:24:35 GMT,这表示这个文件最后的修改时光是2016年9月28日9点24分35秒。这个字段对于浏览器来说,会鄙人次请求的时刻,作为Request Header的If-Modified-Since字段带上。例如浏览器缓存的文件已经跨越了Cache-Control(或者Expires),那么须要加载这个文件时,就会发出请求,请求的Header有一个字段为If-Modified-Since:Wed, 28 Sep 2016 09:24:35 GMT,办事器接收到请求后,会把文件的Last-Modified时光和这个时光比较,如不雅时光没变,那么浏览器将返回304 Not Modified给浏览器,且content-length肯定是0个字节。如不雅时光有变更,那么办事器会返回200 OK,并返回响应的内容给浏览器。
- ETag:”57eb8c5c-129”,这是文件的特点串。功能同膳绫擎的Last-Modified是一样的。只是在浏览器下次请求时,ETag是作为Request Header中的If-None-Match:"57eb8c5c-129"字段传到办事器。办事器和最新的文件特点串比较,如不雅雷同那么返回304 Not Modified,不合则返回200 OK。当ETag和Last-Modified同时出现时,任何一个字段只要生效了,就认为文件是没有更新的。
2.WebView若何设置才能支撑膳绫擎的协定
由膳绫擎的介绍可知,只如果个主流的、合格的浏览器,都应当可以或许支撑HTTP协定层面的┞封几个字段。这不是我们开辟者可以修改的,也不是我们应当修改的设备。在Android上,我们的WebView也支撑这几个字段。然则我们可以经由过程代码去设置WebView的Cache Mode,而使得协定生效或者无效。WebView有下面几个Cache Mode:
- LOAD_CACHE_ONLY: 不应用收集,只攫取本地缓存数据。
- LOAD_DEFAULT: 根据cache-control决定是否大年夜收集上取数据。
- LOAD_CACHE_NORMAL: API level 17中已经放弃,大年夜API level 11开端感化同LOAD_DEFAULT模式
- LOAD_NO_CACHE: 不应用缓存,只大年夜收集获取数据。
- LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过时,或者no-cache,都应用缓存中的数据。本地没有缓存时才大年夜收集上获取。
设置WebView缓存的Cache Mode示例代码如下:
- WebSettings settings = webView.getSettings();
- settings.setCacheMode(WebSettings.LOAD_DEFAULT);
网上很多人都说根据收集前提去选择Cache Mode,当有收集时,设置为LOAD_DEFAULT,当没有收集时设置为LOAD_CACHE_ELSE_NETWORK。然则在我的营业中,js文件的更新都长短覆盖式的更新,也就是时刻每次改变js文件的时刻,文件的url地址必定会产生变更,所以我欲望浏览器可以或许缓存下来js,并且一向应用它,那么我就给它只设置为LOAD_CACHE_ELSE_NETWORK。当然如不雅你如果可以改js的cdn办事器的Cache-Control字段,那也行啊,用LOAD_DEFAULT就ok了。至于文件是应当采取覆盖式or非覆盖式的更新,不是我今天要评论辩论的内容,在web前端范畴,这是一个可以聊聊的topic。
关于iOS的WebView,我同事在实际测试的时刻竟然发明,控制文件缓存的Response Header是Expires字段。。并且iOS无法针半数个WebView设置Cache Mode,只能针对每一个URLRequest去设置。。后续有机会要进修一下iOS那块的情况。
3.在手机琅绫擎的存储路径
浏览器默认缓存下来的文件是怎么被存储到了哪里呢?这个问题在接触到WebView以来,就一向是一个谜题。此次因为工作的须要,我特意root了两台手机,一台红米1(Android 4.4)和一台小米4c(Android 5.1),在root高体系版本(6.0和7.1)的两台Nexus都以掉败了却之后,我决定照样先看看4.4和5.1体系上,WebView自带的缓存存到了哪里。
AppCache工作的道理:当一个设置了manifest文件的html页面被加载时,CACHE MANIFEST指定的文件就会被缓存到浏览器的App Cache目次下面。当下次加载这个页面时,会起首应用经由过程manifest已经缓存过的文件,然后提议一个加载xxx.appcache文件的请求到办事器,如不雅xxx.appcache文件没有被修悛改,那么办事器会返回304 Not Modified给到浏览器,如不雅xxx.appcache文件被修悛改,那么办事器会返回200 OK,并返回新的xxx.appcache文件的内容给浏览器,浏览器收到之后,再把新的xxx.appcache文件中指定的内容加载过来进行缓存。
推荐阅读
新体系Fuchsia界面UI据AndroidAuthority称,今朝谷歌全新的操作体系Fuchsia还处于研发阶段,Android和Chrome OS都是一种基于Linux的自由及开放源代码的操作体系,而Fuchsia体系的内核为M>>>详细阅读
本文标题:WebView 缓存原理分析和应用
地址:http://www.17bianji.com/lsqh/35265.html
1/2 1