Web性能优化-浏览器存储

Cookie

Cookie.png
  • 因为HTTP请求无状态,所以需要cookie去维持客户端状态,
  • 过期时间 expire
  • cookie的生成方式
    1.http response header中的set-cookie
    2.js中可以通过document.cookie可以读写cookie
  • 仅仅作为浏览器存储(大小4KB左右,能力被localstorage替代)
  • cookie中在相关域名下面 —— cdn的流量损耗
  • httponly (防止被黑客利用)

会员卡的例子. 去健身房中,刚开始的会开卡, 然后以后不用每次去健身房的时候就重新再验证一遍身份, 拿着会员卡就知道这个人是会员, 当然会员卡也有过期时间 .

Cookie 的两个作用:

  1. 用于维护用户的状态
  2. 浏览器存储

LocalStorage

  • HTML5设计出来专门用于浏览器存储
  • 大小为5M左右
  • 仅在客户端使用, 不和服务器端进行通信
  • 接口封装较好
  • 浏览器本地缓存方案

SessionStorage

  • 会话级别的浏览器存储
  • 大小为5M左右
  • 仅在客户端使用,不和服务端进行通信
  • 接口封装较好
  • 对于表单信息的维护

IndexedDB(用的很少)

  • IndexedDB 是一种低级API,用于客户端存储大量结构化数据。该API使用索引来实现对该数据的高性能搜索。虽然 Web Storage 对于存储较少量的数据很有用,但对于存储更大量的结构化数据来说,这种方法不太有用。IndexedDB提供了一个解决方案。
  • 为应用创建离线版本

CDN域名要和主站区分开, 要不会在cdn 域名下边携带cookie ,产生带宽资源浪费.

PWA

PWA (Progressive Web Apps) 是一种 Web App 新模型,并不是具体指某一种前沿的技术或者某一个单一的知识点,我们从英文缩写来看就能看出来,这是一个渐进式的 Web App,是通过一系列新的 Web 特性,配合优秀的 UI 交互设计,逐步的增强 Web App 的用户体验。
三个优势:

  1. 可靠:在没有网络的环境中也能提供基本的页面访问,而不会出现“未连接到互联网”的页面。
  2. 快速:针对网页渲染及网络数据访问有较好优化。
  3. 融入(Engaging):应用可以被增加到手机桌面,并且和普通应用一样有全屏、推送等特性。
    安装之后可以运行评测当前打开网页的支持分数

lighthouse (下载地址:https://lavas.baidu.com/doc-assets/lavas/vue/more/downloads/lighthouse_2.1.0_0.zip

Service Worker

Service Worker 是一个脚本,浏览器独立于当前网页,将其在后台运行,为实现一些不依赖页面或者用户交互的特性打开了一扇大门。在未来这些特性将包括推送消息,背景后台同步, geofencing(地理围栏定位),但它将推出的第一个首要特性,就是拦截和处理网络请求的能力,包括以编程方式来管理被缓存的响应。


ServiceWorker.png

能让应用离线, 更好的一个缓存机制.
缓存内容在Cache Storage 中.
Https才能生成

运行命令为
chrome://serviceworker-internals/
chrome://inspect/#service-workers

一个一个来:先说cookie

    document.cookie = "userName=Ethan";
    document.cookie = "gender=male"

在js中这么写 然后看一下application标签中的值.


cookie.png

成功设置cookie,
本身 cookie以字符串形式 存储

image.png

那么把这个页面关闭之后再看


重新打开的cookie.png

cookie 默认失效时间就是当前这个网页关了就没了.

目前cookie中看几大电商的网页里, 主要还是存用户的信息, 主要是各种的id . cookie 主要用的是跟服务器的之间交互验证的过程, 本身cookie 能存的内容有限, 不是为了大规模存储数据而设计的.

接着是LocalStorage

if(window.localStorage){
        localStorage.setItem("name","Ethan");
        localStorage.setItem("gender","Male")
    }

效果为:
image.png

利用LocalStorage实现一个js文件缓存效果. js代码如下

var cacheJs = localStorage.getItem("cacheJs");

    if(cacheJs){
        eval(cacheJs);
    }else{
        var xmlHttpRequest = new XMLHttpRequest();
        xmlHttpRequest.onreadystatechange = callback;
        xmlHttpRequest.onprogress = progressCallback;
        xmlHttpRequest.open("GET","./cache.js",true);
        xmlHttpRequest.send();
        function callback(){
            if(xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200){
                var jsContent = this.response;
                eval(jsContent);
                localStorage.setItem("cacheJs",jsContent);
            }else{
                console.log("Request was unsuccessful:" + xmlHttpRequest.status);
            }
        }

        function progressCallback(e){
            e = e || event;
            if(e.lengthComputable){
                console.log("Received " + e.loaded + " of " + e.total + " bytes");
            }
        }
    }

效果为 第一次将js 文件存到localstorage 中
第二次读取即从localstorage 中读

indexedDB

创建一个indexedDB

function openIndexDb(name,callback){
        var request = window.indexedDB.open(name);
        request.onerror = function(e){
            console.log("open indexdb error");
        }
        request.onsuccess= function(e){
            myDB.db = e.target.result;
            callback && callback();
        }
        //from no db to firstVersion . firstVersion to SecondVersion
        request.onupgradeneeded = function (e) {
            var store = e.currentTarget.result.createObjectStore("books",{keyPath:"isbn"});
            console.log(store);
            store.createIndex("by_title",'title',{unique:true});
            store.createIndex("by_author","author");
            store.put({title:"三国演义",author:"罗贯中",isbn:123});
            store.put({title:"水浒装",author:"施耐庵",isbn:234});
            store.put({title:"西游记",author:"吴承恩",isbn:345});
            store.put({title:"红楼梦",author:"曹雪芹",isbn:456});
        }
    }
    var myDB = {
        name:"testDB",
        version: "1",
        db : null
    }
    openIndexDb(myDB.name,function(){
        console.log("successfully open indexDB ");
//        myDB.db.close();
//        deleteDB(myDB.name);

    })
    function addBook(db){

        var transaction = db.transaction("books",'readwrite');
        var store = transaction.objectStore('books');
        //获取当前indexedDB中的数据 ///查询
//        store.get(456).onsuccess = function(e){
//            console.log(e.target.result);
//        }
        //添加一条书的记录 //添加
//        store.add({
//            title:"论语",
//            author:"孔子",
//            isbn:666
//        })
        //删除
//        store.delete(456);
        //更新
        store.put({title:"红楼梦1",author:"Ethan",isbn:456});

    }

    function deleteDB(name){
        var deleteDb = window.indexedDB.deleteDatabase(name);
        deleteDb.onsuccess = function() {
            console.log('complete');
        };

    }

    setTimeout(function(){
        addBook(myDB.db)
    },3000);

效果为
创建并删除一个indexDB的过程.Note: 试了一下 如果不先close db , 就不能删除这个db,
代码里包含了 对book的增删改查操作.

Service Worker

这东西主要就是把资源存在cache Storage中 , 先看下淘宝离线的时候的状态 .


淘宝离线.png

也就是用这个保证了在没有网络的情况下, 可以给用户看见一些东西 ,而不是一个页面中啥都没有告诉用户当前网络环境有问题
注册Service Worker 是用navigator.serviceworker 获取到
这里就不写代码了

总结一下

cookie : 特点小. 跟服务器验证, 主要用来用户的登录信息存储, 各种id.CDN域名不要有cookie

localstorage , 做缓存策略 , 更好的首屏渲染.
SessionStorage 会话层,页面关闭就清空 ,
indexDB 大规模数据 结构化 .性能优化
PWA标准, 评测软件, 关注哪些监测点. 也就是需要做的性能优化的部分.
其中Service Worker就是其中一部分, 主要用离线运用.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容