HTML5技术

H5 缓存机制浅析 移动端 Web 加载性能优化 - 第八号当铺(2)

字号+ 作者:H5之家 来源:H5之家 2016-03-03 19:21 我要评论( )

在要缓存的资源文件名中加上版本号或文件 MD5值字串,如 common.d5d02a02.js,common.v1.js,同时设置 Cache-Control:max-age=31536000,也就是一年。在一年时间内,资源文件如果本地有缓存,就会使用缓存;也就不

在要缓存的资源文件名中加上版本号或文件 MD5值字串,如 common.d5d02a02.js,common.v1.js,同时设置 Cache-Control:max-age=31536000,也就是一年。在一年时间内,资源文件如果本地有缓存,就会使用缓存;也就不会有304的回包。

  • 如果资源文件有修改,则更新文件内容,同时修改资源文件名,如 common.v2.js,html页面也会引用新的资源文件名。

  • 通过这种方式,实现了:缓存文件没有更新,则使用缓存;缓存文件有更新,则第一时间使用最新文件的目的。即上面说的第1、2条。第3、4条由于浏览器内部机制,目前还无法满足。

    2.2 Dom Storage 存储机制

    DOM 存储是一套在 Web Applications 1.0 规范中首次引入的与存储相关的特性的总称,现在已经分离出来,单独发展成为独立的 W3C Web 存储规范。 DOM 存储被设计为用来提供一个更大存储量、更安全、更便捷的存储方法,从而可以代替掉将一些不需要让服务器知道的信息存储到 cookies 里的这种传统方法。

    上面一段是对 Dom Storage 存储机制的官方表述。看起来,Dom Storage 机制类似 Cookies,但有一些优势。

    Dom Storage 是通过存储字符串的 Key/Value 对来提供的,并提供 5MB (不同浏览器可能不同,分 HOST)的存储空间(Cookies 才 4KB)。另外 Dom Storage 存储的数据在本地,不像 Cookies,每次请求一次页面,Cookies 都会发送给服务器。

    DOM Storage 分为 sessionStorage 和 localStorage。localStorage 对象和 sessionStorage 对象使用方法基本相同,它们的区别在于作用的范围不同。sessionStorage 用来存储与页面相关的数据,它在页面关闭后无法使用。而 localStorage 则持久存在,在页面关闭后也可以使用。

    Dom Storage 提供了以下的存储接口:

     

     

    interface Storage { 

    readonly attribute unsigned long length; 

    [IndexGetter] DOMString key(in unsigned long index); 

    [NameGetter] DOMString getItem(in DOMString key); 

    [NameSetter] void setItem(in DOMString key, in DOMString data); 

    [NameDeleter] void removeItem(in DOMString key); 

    void clear();

    };

     

     

     

     

    sessionStorage 是个全局对象,它维护着在页面会话(page session)期间有效的存储空间。只要浏览器开着,页面会话周期就会一直持续。当页面重新载入(reload)或者被恢复(restores)时,页面会话也是一直存在的。每在新标签或者新窗口中打开一个新页面,都会初始化一个新的会话。

     

     

     

     

     // 当页面刷新时,从sessionStorage恢复之前输入的内容

     window.onload = function(){

        if (window.sessionStorage) {

            var name = window.sessionStorage.getItem("name");

            if (name != "" || name != null){

                document.getElementById("name").value = name;

             }

         }

     };

     // 将数据保存到sessionStorage对象中

     function saveToStorage() {

        if (window.sessionStorage) {

            var name = document.getElementById("name").value;

            window.sessionStorage.setItem("name", name);

            window.location.href="session_storage.html";

         }

     }

     

     

     

     

    当浏览器被意外刷新的时候,一些临时数据应当被保存和恢复。sessionStorage 对象在处理这种情况的时候是最有用的。比如恢复我们在表单中已经填写的数据。

    把上面的代码复制到 session_storage.html(也可以从附件中直接下载)页面中,用 Google Chrome 浏览器的不同 PAGE 或 WINDOW 打开,在输入框中分别输入不同的文字,再点击“Save”,然后分别刷新。每个 PAGE 或 WINDOW 显示都是当前PAGE输入的内容,互不影响。关闭 PAGE,再重新打开,上一次输入保存的内容已经没有了。

     

    F3p7KoF.gif

     

     

    FTSyNzK.gif

     

    Local Storage 的接口、用法与 Session Storage 一样,唯一不同的是:Local Storage 保存的数据是持久性的。当前 PAGE 关闭(Page Session 结束后),保存的数据依然存在。重新打开PAGE,上次保存的数据可以获取到。另外,Local Storage 是全局性的,同时打开两个 PAGE 会共享一份存数据,在一个PAGE中修改数据,另一个 PAGE 中是可以感知到的。

     

     

     

     

     

      //通过localStorage直接引用key, 另一种写法,等价于:

      //localStorage.getItem("pageLoadCount");

      //localStorage.setItem("pageLoadCount", value);

      if (!localStorage.pageLoadCount)

    localStorage.pageLoadCount = 0;

         localStorage.pageLoadCount = parseInt(localStorage.pageLoadCount) + 1;

         document.getElementById('count').textContent = localStorage.pageLoadCount;    You have viewed this page

        an untold number of    time(s).

     

     

     

     

    将上面代码复制到 local_storage.html 的页面中,用浏览器打开,pageLoadCount 的值是1;关闭 PAGE 重新打开,pageLoadCount 的值是2。这是因为第一次的值已经保存了。

     

    gX0nhDe.gif

     

     

    VsSJUCN.gif

     

    用两个 PAGE 同时打开 local_storage.html,并分别交替刷新,发现两个 PAGE 是共享一个 pageLoadCount 的。

     

    K3d9gc0.gif

     

     

    cWePbMp.gif

     

    分析:Dom Storage 给 Web 提供了一种更录活的数据存储方式,存储空间更大(相对 Cookies),用法也比较简单,方便存储服务器或本地的一些临时数据。

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • 用惯了Task,你应该也需要了解它的内部调度机制TaskScheduler - 一线码农

      用惯了Task,你应该也需要了解它的内部调度机制TaskScheduler - 一线

      2017-04-29 10:01

    • 浓缩的才是精华:浅析GIF格式图片的存储和压缩 - 腾讯云技术社区

      浓缩的才是精华:浅析GIF格式图片的存储和压缩 - 腾讯云技术社区

      2017-04-07 15:08

    • 认识浏览器缓存 - TechSnail

      认识浏览器缓存 - TechSnail

      2017-04-03 09:02

    • 【实践】基于接口的插件机制 - 悠扬的牧笛

      【实践】基于接口的插件机制 - 悠扬的牧笛

      2017-01-18 14:03

    网友点评
    i