對一個 App 來說,為了達到某些目的,將相關資料存在用戶端是相對方便的,舉例來說
通常用戶端的儲存和伺服器端的儲存會是一起搭配使用的,舉例來說當我們使用影音串流功能時,會從伺服器端下載相關資料到用戶端使用,在過程中 App 也能夠將資料快取起來以便下次使用。
不過在實務上,瀏覽器用戶端的儲存目前有各式解決方案,也都有著各自的限制存在,如果是有大小限制的儲存,就必須注意定時和伺服器端同步去避免資料遺失。
目前常見的用戶端儲存機制如下:
一般來說儲存空間的上限如下:
在 Chrome、Firefox、Edge 等瀏覽器中可以使用以下的程式碼去估計剩餘空間:
https://caniuse.com/mdn-api_storagemanager
if (navigator.storage && navigator.storage.estimate) {
const quota = await navigator.storage.estimate();
// quota.usage -> 用了多少 bytes
// quota.quota -> 還剩多少 bytes 可使用
const percentageUsed = (quota.usage / quota.quota) * 100;
console.log(`${percentageUsed}% 已使用`);
const remaining = quota.quota - quota.usage;
console.log(`還可以寫入 ${remaining} bytes`);
}
const transaction = idb.transaction(["entries"], "readwrite");
transaction.onabort = function (event) {
const error = event.target.error; // DOMException
if (error.name == "QuotaExceededError") {
// 錯誤處理
}
};
try {
const cache = await caches.open("my-cache");
await cache.add(new Request("/test.jpg"));
} catch (err) {
if (error.name === "QuotaExceededError") {
// 錯誤處理
}
}
資料在儲存上會分成兩種類別
當硬碟空間即將用完時,瀏覽器會依據 LRU policy (least recently used) 的規則透過去清除快取檔案。
為了避免資料被儲存淘汰機制處理掉,我們能夠通過程式碼去確認、啟用 Persistent Storage。
// 確認目前儲存空間是否套用 Persistent
if (navigator.storage && navigator.storage.persist) {
const isPersisted = await navigator.storage.persisted();
console.log(`Persisted storage granted: ${isPersisted}`);
}
// 針對這個站台啟用 Persistent Storage
if (navigator.storage && navigator.storage.persist) {
const isPersisted = await navigator.storage.persist();
console.log(`Persisted storage granted: ${isPersisted}`);
}
啟用過後底下的儲存皆會受到保護,但要注意啟用後目前尚沒有透過程式停用的方式。