本篇要解決的問題
上一篇寫的是最常用到的 Cookie,裡面也有寫到 Cookie 通常是存有目的性的資料。如果只是想存一些不重要的資料,像是內容網站上很常會有的 放大 / 縮小 文字的按鈕,或是切換深色模式的操作,總不能使用者今天點了一次文字放大後,下次再進來頁面還得再點一次,這時就可以選擇存在瀏覽器上。
而像這種不是很重要的記錄存取,就可以選擇 localStroage。
sessionStorage 跟 localStorage 最大的差別在於,sessionStorage 是當使用者關掉了頁籤,紀錄就會消失;而 localStorage 是除非我們去刪除它,或是使用者刪除它,不然就不會過期,永遠存在。
限制
- 限制大小:約 5 MB
- 限制期限:sessionStorage 關閉頁籤即刪除,localStorage 要主動刪除或程式刪除
- 資料格式:僅接受字串
瀏覽器上檢查
這邊用 Chrome 當範例。
如果想看網站上存了什麼 sessionStorage、localStorage,在網頁上點右鍵按檢查,在面板上點擊「應用程式」,就會看到「本機儲存空間(localStorage)」、「工作階段儲存空間(sessionStorage):

原生寫法
新增、取得、刪除 sessionStorage、localStorage 的原生寫法很簡單,整理如下。
sessionStorage
// 存 sessionStorage.setItem('key', 'value'); // 取 const ssData = sessionStorage.getItem('key'); // 刪 sessionStorage.removeItem('key'); // 全部清空 sessionStorage.clear();
localStorage
// 存 localStorage.setItem('key', 'value'); // 取 const lsData = localStorage.getItem('key'); // 刪 localStorage.removeItem('key'); // 全部清空 localStorage.clear();
設定有效期限
雖說 localStorage 是沒有期限的,但可以換一種方式讓它跟 Cookies 一樣有期限。
方式就是,我們在存一個 localStorage 時,一併存一個我們希望它過期的日期上去。
之後當我們要取用時,先拿存的日期來比對當下時間,如果存的時間較大就代表過期,就當作沒取到這個 localStorage 的資料,並把它刪除。
// 存值進 localStorage function setStorageExpire({ key, value, expire }) { localStorage.setItem(key, JSON.stringify({ value, expire })); } // 從 localStorage 取值 function getStorageExpire({ key }) { const result = JSON.parse(localStorage.getItem(key)); const current = new Date().getTime(); // 現在時間小於過期時間,代表還沒過期 if(current < result.expire) { return result.value } // 大於就是過期 else { localStorage.removeItem(key); return false; } } // 存一筆資料 setStorageExpire({ key: 'demo-key', value: 'demo-value', expire: new Date('2022/11/16').getTime() }); // 取值 const demoResult = getStorageExpire({ key: 'demo-key' }); console.log("🚀", demoResult)
推薦套件
sessionStorage、localStorage 這部份有推薦套件:proxy-web-storage。
這套在 GitHub 上的星星數還沒到很多,但試用了一下覺得蠻方便的,除了可以在存的時候就存進不同的資料型別,也可以寫一個有效時間進去判斷資料是否過期。
如果懶得自己寫一個 JavaScript 來用,可以考慮直接引用。
// 先安裝 proxy-web-storage $ npm install proxy-web-storage 或 $ yarn add proxy-web-storage // 開始使用 import { local, session } from 'proxy-web-storage'; // number local.demo_number = 0; // boolean local.demo_boolean = false; // undefined local.demo_undefined = undefined; // null local.demo_null = null; // object local.demo_object = { hello: 'world' }; // array local.demo_array = ['hello']; // Date local.demo_Date = new Date('2000-01-01T00:00:00.000Z'); // RegExp local.demo_RegExp = /d(b+)d/g; // function local.demo_function = function() { return 'Hello proxy-web-storage!'; }; // 過期範例 local.test = 'hello proxy-web-storage'; local.setExpires('test', Date.now() + 10000); // 10 秒內 local.test // 'hello proxy-web-storage' // 10 秒後到期 local.test // undefined
Demo 及原始碼
本篇一樣有製作 Demo,原始碼也放在 GitHub 上,取用之前麻煩分享本篇或點個星星,你的小小動作對本站都是大大的鼓勵。
Demo:https://letswritetw.github.io/letswrite-client-storage/
GitHub:https://github.com/letswritetw/letswrite-client-storage
瀏覽器上的儲存空間系列

