TypeScript e StorageManager
Questo articolo spiega TypeScript e StorageManager.
Forniamo esempi pratici per spiegare TypeScript e StorageManager.
YouTube Video
TypeScript e StorageManager
Che cos'è StorageManager?
StorageManager è un'API che consente alle applicazioni web di stimare quanto spazio di archiviazione stanno utilizzando e quanta capacità è disponibile. Fornisce inoltre una richiesta di persistenza (persist()) per impedire la rimozione automatica dei dati da parte dell'utente o del browser. Questo ti consente di controllare se c'è abbastanza spazio libero o se i dati verranno eliminati automaticamente, ad esempio quando si archiviano grandi quantità di dati in IndexedDB per applicazioni offline.
Rilevamento delle Funzionalità
Per prima cosa, verifica se il browser supporta navigator.storage.
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}- Questa funzione verifica la disponibilità dell'API StorageManager a più livelli.
- Poiché
navigator.storagenon esiste in alcuni browser come Safari, è importante verificare la sua esistenza in modo sicuro tramitetypeof.
Stima dell'Utilizzo dello Spazio di Archiviazione (estimate())
Dopo aver verificato la funzionalità con supportsStorageManager(), ottieni l'utilizzo (usage) e la quota (quota) da navigator.storage.estimate().
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});- Questa funzione funziona sempre in modo sicuro e restituisce
nullse il browser non la supporta. usageequotasono stime e possono variare da browser a browser.
Richiesta di Persistenza dei Dati (persist())
Usa persist() per richiedere la persistenza in modo che dati importanti (ad esempio, cache offline) non siano soggetti alla cancellazione automatica da parte del browser. Tuttavia, non riesce in tutti gli ambienti.
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});- Se
persist()ha successo, i dati non verranno eliminati automaticamente dal browser, tranne in caso di intervento manuale dell'utente. Tuttavia, le richieste possono essere rifiutate a seconda delle azioni dell'utente o delle impostazioni del browser.
Controlla lo Spazio Disponibile Prima di Salvare i Dati
Verifica lo spazio disponibile prima di salvare grandi quantità di dati per evitare errori di scrittura (QuotaExceededError).
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});- Controllando lo spazio disponibile prima di salvare, puoi ridurre il rischio di interruzioni di scrittura a causa di capacità insufficiente.
Gestione Type-Safe di localStorage in TypeScript
localStorage è comodo per memorizzare dati di configurazione leggeri e informazioni simili.
La seguente classe usa i generics per creare un wrapper type-safe.
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'));- Questa classe aiuta a ridurre il rischio di memorizzare o recuperare dati con il tipo sbagliato.
Considerazioni Pratiche e Best Practice
-
Verifica sempre se il browser supporta StorageManager Poiché StorageManager è un'API relativamente nuova, conferma sempre la sua esistenza prima dell’uso.
-
Presta attenzione ai limiti di archiviazione e alla compatibilità Il valore restituito da
estimate()varia a seconda del browser ed è solo una stima. -
Progetta tenendo conto delle API asincrone
estimate()epersist()sono API asincrone basate su promise. Progetta il tuo codice in modo da non bloccare l'interfaccia utente. -
Considerazioni sulla Sicurezza Non memorizzare informazioni sensibili come token di accesso in
localStorage. Considera l’utilizzo di cookie HttpOnly o la crittografia se possibile. -
Progettazione dei fallback Se
supportsStorageManager()restituisce falso, fornisci una logica per passare all'utilizzo di sololocalStorageoIndexedDB.
Riepilogo
Con il rilevamento delle funzionalità tramite supportsStorageManager(), puoi supportare in sicurezza tutti gli ambienti, controllare l’utilizzo e la quota con navigator.storage.estimate() e richiedere la persistenza con persist(). In TypeScript, usa funzioni di wrapper e definizioni di tipo per scrivere codice leggibile e sicuro. Il flusso di base è: controllare l’esistenza, stimare, richiedere la persistenza e verificare la capacità prima di scrivere nello storage.
Puoi seguire l'articolo sopra utilizzando Visual Studio Code sul nostro canale YouTube. Controlla anche il nostro canale YouTube.