網頁資料儲存方案

 你說的非常對!chrome.storage.local 是 Chrome 擴充功能專用的儲存 API。對於一般的網頁,確實有幾種不同的客戶端儲存方案,其中 Cookie 是最老牌的一種,但現在有更好、更常用的選擇。

以下是一般網頁常用的客戶端儲存技術:

  1. Cookies (HTTP Cookies):

    • 用途:最初設計用於伺服器和客戶端之間傳遞狀態資訊 (例如:使用者登入狀態、購物車內容、追蹤使用者行為)。

    • 運作方式:由伺服器透過 HTTP Header (Set-Cookie) 發送到瀏覽器,瀏覽器儲存後,在之後的每次請求到同一網域時,都會自動將 Cookie 透過 HTTP Header (Cookie) 帶上發送給伺服器。

    • 容量:非常小,通常每個 Cookie 約 4KB,且每個網域的 Cookie 數量也有限制。

    • 存取:JavaScript 可以透過 document.cookie 讀寫 (除非設定了 HttpOnly 旗標,這樣就只能由伺服器讀寫)。伺服器端程式碼可以直接讀取 HTTP Header 中的 Cookie。

    • 生命週期:可以設定過期時間 (expires/max-age)。如果沒有設定,就是會話 Cookie (session cookie),瀏覽器關閉即失效。

    • 缺點

      • 容量小。

      • 每次 HTTP 請求都會攜帶,即使某些請求完全不需要這些 Cookie,也會增加網路流量和請求大小,影響效能。

      • API 操作不方便 (document.cookie 是一個字串,需要手動解析和設定)。

    • 適合場景:儲存少量、需要在伺服器和客戶端之間共享的狀態資訊,如身份驗證 token、使用者偏好設定 (例如主題)。

  2. Web Storage API (HTML5):
    這是現代網頁更常用的客戶端儲存方案,它提供了更大的儲存容量,且不會自動隨 HTTP 請求發送。它包含兩種:

    • localStorage:

      • 用途:在客戶端持久儲存鍵值對數據。

      • 容量:比 Cookie 大得多,通常每個來源 (origin,即協議+主機名+端口) 約 5MB - 10MB。

      • 存取:只能透過 JavaScript 存取 (localStorage.setItem('key', 'value'), localStorage.getItem('key'), localStorage.removeItem('key'), localStorage.clear())。

      • 生命週期永久儲存,除非使用者手動清除瀏覽器快取/資料,或網頁透過 JavaScript 主動刪除。關閉瀏覽器或分頁不會影響儲存的資料。

      • 作用域:同源策略限制,即同一個來源的頁面可以共享相同的 localStorage

      • 優點:容量較大,API 簡單易用,數據不會隨 HTTP 請求發送。

      • 缺點

        • 只能儲存字串。如果要儲存物件,需要先用 JSON.stringify() 轉換成字串,讀取時用 JSON.parse() 轉回來。

        • 同步操作,如果在主執行緒進行大量讀寫可能會阻塞 UI。

        • 不適合儲存敏感資料,因為容易被 XSS 攻擊讀取。

      • 最接近 chrome.storage.local 的方案:在持久性、僅客戶端存取、鍵值對儲存方面,localStorage 是最像擴充功能 chrome.storage.local 的。

    • sessionStorage:

      • 用途:在客戶端儲存當前會話 (session) 的鍵值對數據。

      • 容量:與 localStorage 類似,約 5MB - 10MB。

      • 存取:只能透過 JavaScript 存取 (API 與 localStorage 完全相同,只是把 localStorage 換成 sessionStorage)。

      • 生命週期僅限當前瀏覽器分頁/視窗的生命週期。當分頁或視窗關閉時,sessionStorage 中的資料會被清除。即使是同一個網站在不同分頁打開,它們的 sessionStorage 也是獨立的。

      • 作用域:同源策略限制,但僅限於當前分頁。

      • 優點/缺點:與 localStorage 類似,但生命週期不同。

      • 適合場景:儲存臨時性的、只在當前瀏覽會話中有效的資料,例如表單中已填寫的內容 (防止使用者意外關閉分頁後遺失),或一次性提示的狀態。

  3. IndexedDB API:

    • 用途:在客戶端儲存大量結構化數據,提供類似資料庫的功能。

    • 容量:非常大,通常只受限於使用者的硬碟空間 (瀏覽器會有提示請求更多空間)。

    • 存取:只能透過 JavaScript 存取。API 相對複雜,是基於交易 (transaction) 的非同步操作。

    • 生命週期:永久儲存,除非使用者或網頁主動清除。

    • 作用域:同源策略限制。

    • 優點

      • 可以儲存大量數據,包括 JavaScript 物件、檔案、Blob 等。

      • 支援索引,可以高效查詢數據。

      • 非同步操作,不會阻塞主執行緒。

    • 缺點:API 較為複雜,學習曲線較陡峭。

    • 適合場景:需要離線功能的複雜 Web 應用 (PWA)、需要儲存大量數據的應用 (例如郵件客戶端、內容管理工具的草稿等)。

總結與選擇:

特性CookieslocalStoragesessionStorageIndexedDB
主要用途伺服器與客戶端狀態同步、追蹤客戶端持久鍵值儲存客戶端會話期鍵值儲存客戶端大型結構化數據庫
容量~4KB~5-10MB~5-10MB非常大 (GBs+)
生命週期可設定過期,否則為會話永久 (除非手動/程式清除)當前分頁/視窗關閉即清除永久 (除非手動/程式清除)
HTTP請求自動攜帶不攜帶不攜帶不攜帶
APIdocument.cookie (字串操作)localStorage.setItem/getItem 等 (簡單)sessionStorage.setItem/getItem 等 (簡單)複雜的非同步 API
數據類型字串字串 (物件需序列化)字串 (物件需序列化)多種 (物件, Blob, 檔案等)
操作方式同步 (JS端)同步同步非同步
最像chrome.storage.local

一般來說,對於類似擴充功能中 chrome.storage.local 的需求 (在客戶端持久儲存一些設定或資料,且不需要伺服器頻繁讀取),localStorage 是最常用的替代方案。

如果你只需要在單個瀏覽會話期間儲存數據,則使用 sessionStorage
如果你需要儲存大量結構化數據或實現離線功能,則考慮 IndexedDB
Cookie 則更多用於需要伺服器參與的狀態管理。

留言

這個網誌中的熱門文章

Offscreen Canvas

外部網頁新增 Google 日曆行程(URL模板)

計算 Canvas 文字最大字體