首頁  >  文章  >  web前端  >  html5離線儲存和cookie儲存分析

html5離線儲存和cookie儲存分析

小云云
小云云原創
2017-11-18 13:18:122659瀏覽

什麼是Cookies(「小甜餅」)呢?簡單來說,Cookies就是伺服器暫存放在你的電腦裡的資料(.txt格式的文字檔案),好讓伺服器用來辨認你的電腦。當你在瀏覽網站的時候,網頁伺服器會先送一小小資料放在你的電腦上,Cookies 會幫你在網站上所打的文字或是一些選擇都記錄下來。當下次再造訪同一個網站,Web伺服器會先看看有沒有它上次留下的Cookies資料,有的話,就會依據Cookie裡的內容來判斷使用者,並送出特定的網頁內容給你。在HTML5以前我們會使用 cookie,在瀏覽器端快取一些數據,例如:登入使用者信息,歷史搜尋資訊等等。但cookie所支援的容量僅只有 4k ,也沒有專門的api來操作,只能依賴一些開源的函式庫, 這裡使用 cookies.js 儲存和取得cookie資訊。

// 这是一个cookie值Cookies.set('key', 'value');
// 链式调用Cookies.set('key', 'value').set('hello', 'world');
// 可以额外设置一些参数Cookies.set('key', 'value', { domain: 'www.example.com', secure: true });
// 设置缓存时间Cookies.set('key', 'value', { expires: 600 });
// Expires in 10 minutesCookies.set('key', 'value', { expires: '01/01/2012' });
Cookies.set('key', 'value', { expires: new Date(2012, 0, 1) });
Cookies.set('key', 'value', { expires: Infinity });// 获取Cookies.get('key');

由此可見用cookie儲存有一下幾個缺點:

儲存資料的量比較小

#本身沒有方便的api對其進行操作

cookie資訊會在http請求時加入到請求頭中,既不安全也增加了頻寬。

WEB Storage

HTML5 提拱更好的本地儲存規範localStorage 和sessionStorage , 它們將資料儲存在本地,而且在http請求時不會攜帶Storage 裡的資訊, 使用方式也很簡單:

localStorage.setItem('key', 'value');
localStorage.getItem('key');
localStorage.removeItem('key');
sessionStorage.setItem('key', 'value');
sessionStorage.getItem('key');
sessionStorage.removeItem('key');

sessionStorage 和localStorage 使用方式及特性基本上一致,唯一的差別是, sessionStorage 只在會話內有效,當瀏覽器視窗關閉,sessionStorage 快取的資料會自動被清除, localStorage 只要不手動清除,它會永久保存在本地。

這裡有張圖片分析了cookie 、 localStorage 、 sessionStorage 三者的區別

html5離線儲存和cookie儲存分析


OFFLINE(離線)

為了讓webapp 擁有像native app 一樣的功能和體驗, 在HTML5的規格中加入了許多新的api, 讓頁面可以在離線環境下正常存取。 service worker 和 indexedDB 兩者配合可以就可以開發離線使用的 webapp 了,由於 service worker 目前的兼容性不太好,這裡我們寫介紹下比較早的方案 application cache 。

service worker

Service Worker是基於Web Worker的事件驅動的,他們執行的機制都是新開一個執行緒去處理一些額外的,以前不能直接處理的任務。對於Web Worker,我們可以使用它來進行複雜的運算,因為它不會阻塞瀏覽器主執行緒的渲染。而Service Worker,我們可以用它來進行本地緩存,相當於一個本地的proxy。說起緩存,我們會想起我們常用的一些緩存技術來緩存我們的靜態資源,但是老的方式是不支援調試的,靈活性不高。使用Service Worker來進行緩存,我們可以用javascript程式碼來攔截瀏覽器的http請求,並設定快取的文件,直接返回,不經過web伺服器,然後,做更多你想做的事情。

因此,我們可以開發基於瀏覽器的離線應用程式。這使得我們的web應用程式減少對網路的依賴。例如,我們開發了一個新聞閱讀的web應用,當你用手機瀏覽器在有網絡的情況下打開時,你可以正常的獲取新聞內容。可是,如果手機進入飛航模式,那這個應用你就沒辦法使用了。

如果我們使用了Service Worker做緩存,瀏覽器http請求會先經過Service Worker,透過url mapping去匹配,如果匹配到了,則使用快取數據,如果匹配失敗,則繼續執行你指定的動作。一般情況下,符合失敗則讓頁面顯示「網頁無法開啟」。

service work 生命週期

html5離線儲存和cookie儲存分析


work work demo

#service work demo

<!DOCTYPE html><html lang="en">
  <head>
    <meta charset="utf-8">
    <script>
        navigator.serviceWorker.register("/service-worker.js").then(function(serviceWorker) {            console.log("success!");
        });    </script>
  </head>
  <body>
  </body></html>

在頁面註冊service-worker成功時就會呼叫這個js

this.oninstall = function(e) {    var resources = new Cache();    var visited = new Cache();    // Fetch them.
    e.waitUntil(resources.add(        "/index.html",        "/fallback.html",        "/css/base.css",        "/js/app.js",        "/img/logo.png"
    ).then(function() {        // Add caches to the global caches.
        return Promise.all([
            caches.set("v1", resources),
            caches.set("visited", visited)
        ]);
    }));
};this.onfetch = function(e) {
    e.respondWith(        // Check to see if request is found in cache
        caches.match(e.request).catch(function() {            // It&#39;s not? Prime the cache and return the response.
            return caches.get("visited").then(function(visited) {                return fetch(e.request).then(function(response) {
                    visited.put(e.request, response);                    // Don&#39;t bother waiting, respond already.
                    return response;
                });
            });
        }).catch(function() {            // Connection is down? Simply fallback to a pre-cached page.
            return caches.match("/fallback.html");
        });
    );
};

service worker 採用事件監聽機制, 上面的程式碼監聽了install 和fetch 事件,當server worker 安裝成功後,呼叫此方法,然後緩存頁面的資源文件, fetch 頁面請求事件, server worker 攔截到用戶請求,當發現請求文件命中緩存則從緩存中取得文件,返回給頁面,無需經過服務器,藉此達到離線的目的。

當然service worker 的功能遠不止現在這些

indexedDB######indexedDB 是一個用於本地儲存資料的nosql 資料庫,擁有極快的資料查詢速度,而且可以直接保存js 物件。相較於web sql(sqlite)更有效率,包括索引、事務處理和健壯的查詢功能。 indexedDB特點:######1.一個網站可能有一個或多個 IndexedDB 資料庫,每個資料庫必須有惟一的名稱。 ######2.一個資料庫可包含一個或多個物件儲存###

一个对象存储(由一个名称惟一标识)是一个记录集合。每个记录有一个键 和一个值。该值是一个对象,可拥有一个或多个属性。键可能基于某个键生成器,从一个键路径衍生出来,或者是显式设置。一个键生成器自动生成惟一的连续正整数。键路径定义了键值的路径。它可以是单个 JavaScript 标识符或多个由句点分隔的标识符。

基本使用方式如下:

var openRequest = indexedDB.open("auto_people", 3);var db; //数据库对象openRequest.onupgradeneeded = function(e)
{    console.log("Running onupgradeeded...");	var thisDB = e.target.result;	if(!thisDB.objectStoreNames.contains("people")){
thisDB.createObjectStore("people", {autoIncrement:true}); //新建一个store并设置主键自增长
}
}//创建成功openRequest.onsuccess = function(e){    console.log("success!");
   db = e.target.result;	//Listen for add clicks}
openRequest.onerror = function(e){	console.log("error!");	console.dir(e);
}//这应该站在别的地方处理,这是做一个代码展示var transaction = db.transaction([&#39;people&#39;], "readwrite"); 
//创建一个连接var store = transaction.objectStore("people");  //获取storevar request = store.add({
   name: &#39;myron&#39;,
   email: &#39;test@qq.com&#39;,
   created: new Date()
}); //添加信息request.onerror = function(e){
   alert(&#39;error!&#39;);    console.dir(e);
} //当添加失败时调用request.onsuccess = function(e){    console.log(&#39;Did it!&#39;);
} //添加成功时调用request = store.get(1);  //获取第一条数据request.onsuccess = function(e)
{    var result = e.target.result;    console.dir(result);    if(result){        //拿到存储的对象
}
}

以上内容就是cookie和HTML5离线存储的分析,大家都了解了吗?

相关推荐:

如何区别html5离线存储和本地缓存实例详解

HTML5离线存储原理

html5的离线存储问题汇总

以上是html5離線儲存和cookie儲存分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn