TypeScript ve StorageManager
Bu makale TypeScript ve StorageManager'ı açıklar.
TypeScript ve StorageManager'ı açıklamak için pratik örnekler sunuyoruz.
YouTube Video
TypeScript ve StorageManager
StorageManager nedir?
StorageManager, web uygulamalarının ne kadar depolama kullandığını ve ne kadar kapasite kaldığını tahmin etmesine olanak tanıyan bir API'dir. Ayrıca, kullanıcının veya tarayıcının verileri otomatik olarak silmesini önlemek için bir kalıcılık isteği (persist()) sağlar. Bu, yeterli boş alan olup olmadığını veya verilerin otomatik olarak silinip silinmeyeceğini kontrol etmenizi sağlar; örneğin, çevrimdışı uygulamalar için IndexedDB'de büyük miktarlarda veri saklandığında.
Özellik Tespiti
Öncelikle tarayıcının navigator.storage desteği olup olmadığını kontrol edin.
1// TypeScript: feature detection for StorageManager
2function supportsStorageManager(): boolean {
3 return typeof navigator !== "undefined" &&
4 typeof navigator.storage !== "undefined" &&
5 typeof navigator.storage.estimate === "function";
6}
7
8// Example usage
9if (supportsStorageManager()) {
10 console.log("StorageManager is supported.");
11} else {
12 console.warn("StorageManager not supported. Falling back to localStorage or IndexedDB.");
13}- Bu fonksiyon, StorageManager API'nin kullanılabilirliğini aşama aşama kontrol eder.
navigator.storageSafari gibi bazı tarayıcılarda bulunmadığından, bunun varlığınıtypeofile güvenli bir şekilde kontrol etmek önemlidir.
Depolama Kullanımını Tahmin Etme (estimate())
supportsStorageManager() ile işlevselliği kontrol ettikten sonra, navigator.storage.estimate() ile kullanım (usage) ve kota (quota) bilgilerini alın.
1// TypeScript: safely get storage estimate
2async function getStorageEstimate(): Promise<{ usage: number; quota: number } | null> {
3 if (!supportsStorageManager()) {
4 console.warn("StorageManager not supported.");
5 return null;
6 }
7
8 const estimate = await navigator.storage.estimate();
9 return { usage: estimate.usage ?? 0, quota: estimate.quota ?? 0 };
10}
11
12// Example usage
13getStorageEstimate().then(result => {
14 if (result) {
15 console.log(`Usage: ${result.usage} bytes / Quota: ${result.quota} bytes`);
16 }
17});- Bu fonksiyon, tarayıcı desteklemiyorsa her zaman güvenli çalışır ve
nulldöndürür. usagevequotadeğerleri bir tahmindir ve tarayıcılar arasında değişebilir.
Veri Kalıcılığı Talep Etme (persist())
Önemli verilerin (örneğin, çevrimdışı önbellek) tarayıcı tarafından otomatik olarak silinmemesi için persist() kullanarak kalıcılık isteyebilirsiniz. Ancak, bu her ortamda başarılı olmayabilir.
1// TypeScript: safely request persistent storage
2async function requestPersistence(): Promise<boolean> {
3 if (!supportsStorageManager()) {
4 console.warn("StorageManager not supported.");
5 return false;
6 }
7
8 if (typeof navigator.storage.persist !== "function") {
9 console.warn("persist() not available in this browser.");
10 return false;
11 }
12
13 try {
14 const granted = await navigator.storage.persist();
15 return Boolean(granted);
16 } catch (err) {
17 console.error("persist() error:", err);
18 return false;
19 }
20}
21
22// Example usage
23requestPersistence().then(granted => {
24 console.log("Persistence granted?", granted);
25});persist()başarılı olursa, veriler kullanıcı manuel olarak müdahale etmediği sürece tarayıcı tarafından otomatik olarak silinmez. Ancak, istekler kullanıcı eylemlerine veya tarayıcı ayarlarına bağlı olarak reddedilebilir.
Veri Kaydetmeden Önce Kullanılabilir Depolamayı Kontrol Edin
Yazma hatalarını (QuotaExceededError) önlemek için büyük veri kaydetmeden önce kullanılabilir alanı doğrulayın.
1// TypeScript: ensure enough space before writing
2async function ensureSpaceAndWrite(neededBytes: number, writeFn: () => Promise<void>): Promise<boolean> {
3 const estimate = await getStorageEstimate();
4 if (!estimate) {
5 console.warn("Cannot check storage space. Proceeding without validation.");
6 await writeFn();
7 return true;
8 }
9
10 const free = estimate.quota - estimate.usage;
11 if (free < neededBytes) {
12 console.warn(`Not enough space. Free: ${free} bytes, needed: ${neededBytes} bytes.`);
13 return false;
14 }
15
16 await writeFn();
17 return true;
18}
19
20// Example usage
21ensureSpaceAndWrite(10 * 1024 * 1024, async () => {
22 console.log("Saving large data...");
23});- Kaydetmeden önce kullanılabilir depolamayı kontrol ederek, yetersiz kapasite nedeniyle oluşabilecek yazma kesintisi riskini azaltabilirsiniz.
TypeScript'te localStorage'ı Tip Güvenliğiyle Kullanmak
localStorage, hafif yapılandırma verilerini ve benzer bilgileri saklamak için oldukça uygundur.
Aşağıdaki sınıf, tip güvenli bir sarmalayıcı oluşturmak için generics kullanır.
1// TypeScript: typed localStorage wrapper
2type Serializer<T> = {
3 serialize: (v: T) => string;
4 deserialize: (s: string) => T;
5};
6
7class TypedLocalStorage<K extends string, V> {
8 constructor(private storage: Storage, private serializer: Serializer<V>) {}
9
10 set(key: K, value: V): void {
11 this.storage.setItem(key, this.serializer.serialize(value));
12 }
13
14 get(key: K): V | null {
15 const raw = this.storage.getItem(key);
16 if (raw === null) return null;
17 try {
18 return this.serializer.deserialize(raw);
19 } catch {
20 return null;
21 }
22 }
23
24 remove(key: K): void {
25 this.storage.removeItem(key);
26 }
27
28 clear(): void {
29 this.storage.clear();
30 }
31}
32
33// Example usage
34const jsonSerializer: Serializer<any> = {
35 serialize: v => JSON.stringify(v),
36 deserialize: s => JSON.parse(s),
37};
38
39const appStorage = new TypedLocalStorage<'theme' | 'token', any>(localStorage, jsonSerializer);
40appStorage.set('theme', { dark: true });
41console.log(appStorage.get('theme'));- Bu sınıf, yanlış türde veri depolama veya alma riskini azaltmaya yardımcı olur.
Pratik Noktalar ve En İyi Uygulamalar
-
Tarayıcının StorageManager desteği olup olmadığını her zaman kontrol edin StorageManager nispeten yeni bir API olduğu için, kullanmadan önce varlığını mutlaka doğrulayın.
-
Depolama sınırlarına ve uyumluluğa dikkat edin
estimate()tarafından döndürülen değer, tarayıcıya göre değişir ve yalnızca bir tahmindir. -
Asenkron API'ları Akılda Tutacak Şekilde Tasarlayın
estimate()vepersist()promise tabanlı asenkron API'lardır. Kodunuzu, kullanıcı arayüzünü (UI) bloke etmeyecek şekilde tasarlayın. -
Güvenlik Dikkatleri Erişim belirteçleri gibi hassas bilgileri
localStorage'da saklamayın. Mümkünse HttpOnly çerezleri veya şifreleme kullanmayı düşünün. -
Yedek Tasarım
supportsStorageManager()false döndürürse, yalnızcalocalStorageveyaIndexedDBkullanacak şekilde bir mantık ekleyin.
Özet
supportsStorageManager() ile özellik tespiti sayesinde, tüm ortamları güvenli bir şekilde destekleyebilir, navigator.storage.estimate() ile kullanım ve kotayı kontrol edebilir ve persist() ile kalıcılık isteğinde bulunabilirsiniz. TypeScript'te okunabilir ve güvenli kod yazmak için sarmalayıcı fonksiyonlar ve tip tanımlamaları kullanın. Temel akış: varlık kontrolü, tahmin, kalıcılık isteği ve depolamaya yazmadan önce kapasite kontrolüdür.
Yukarıdaki makaleyi, YouTube kanalımızda Visual Studio Code'u kullanarak takip edebilirsiniz. Lütfen YouTube kanalını da kontrol edin.