Il
file system privato di origine
offre l'accesso a un tipo speciale di file altamente ottimizzato per le prestazioni, ad esempio, offrendo accesso in scrittura esclusivo e in-place ai contenuti di un file. Gli sviluppatori possono accedere a questi
file chiamando
createSyncAccessHandle()
,
che è un metodo esposto sugli oggetti
FileSystemFileHandle
. Questa chiamata
genera un FileSystemSyncAccessHandle
.
FileSystemSyncAccessHandle
è una primitiva file che fornisce un accesso efficiente ai file locali. Uno
tra i suoi casi d'uso principali è il porting del codice C/C++ in Wasm; tuttavia, le chiamate asincrone non sono ancora completamente supportate su Wasm e l'utilizzo della libreria
Asyncify come alternativa ha avuto un impatto significativo sul rendimento. L'impostazione di tutti i metodi di FileSystemSyncAccessHandle
sincrona corrisponde alle aspettative dell'applicazione di file sincrona, simile a POSIX, per l'applicazione basata su Wasm. L'API è più ergonomica e, al contempo, migliora sensibilmente le prestazioni.
Novità
FileSystemSyncAccessHandle
espone i seguenti metodi, che in precedenza erano asincroni, ma che sono sincroni a partire da Chromium 108.
truncate(newSize)
: ridimensiona il file associato all'handle di accesso in modo che abbia una dimensione dinewSize
byte. SenewSize
è superiore alla dimensione attuale del file, occupa il file con byte nulli, altrimenti il file viene troncato.getSize()
: restituisce le dimensioni del file associato all'handle di accesso in byte.flush()
: garantisce che i contenuti del file associato all'handle di accesso contengano tutte le modifiche apportate tramitewrite()
.close()
: scarica la maniglia di accesso e poi la chiude. La chiusura di un handle di accesso disattiva eventuali operazioni aggiuntive e rilascia il blocco della voce associata all'handle di accesso.
// In a `Worker`:
const root = await navigator.storage.getDirectory();
const fileHandle = await root.getFileHandle('test', { create: true });
// `createSyncAccessHandle()` is still async.
const accessHandle = await fileHandle.createSyncAccessHandle();
// Both `read()` and `write()` were sync before.
accessHandle.read(/* ... */);
accessHandle.write(/* ... */);
// New: synchronous as of Chromium 108.
console.log(accessHandle.getSize());
accessHandle.truncate(123);
accessHandle.flush();
accessHandle.close();
Che cosa devo fare?
Tieni presente che la modifica dei metodi da asincroni a sincroni è una modifica esposta al web con potenziali interruzioni. Sebbene l'utilizzo di await
nei metodi sincroni sia un'operazione non valida, qualsiasi utilizzo di Promise.then()
causerà un errore.
Se esegui una chiamata then()
in catena sul risultato di uno dei metodi precedentemente asincroni e ora
sincroni, devi modificare il codice.
// (✅) This won't break, but you better remove the superfluous `await`:
await accessHandle.flush();
// ✅ Correct:
accessHandle.flush();
// ⛔️ This will break, and you need to restructure your code:
accessHandle.flush().then(/* Follow-up code */);
// ✅ Correct:
accessHandle.flush();
/* Follow-up code */
Link correlati
- Revisione del TAG
- Specifiche
- Problema relativo alle specifiche (che ha portato alla modifica)
- Voce ChromeStatus
- Bug di Chromium