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 in-place ed esclusivo 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. Rendere sincroni tutti i metodi di FileSystemSyncAccessHandle
corrisponde alle aspettative dell'applicazione basata su Wasm con API file sincrona e simile a POSIX; rendere l'API più ergonomica e ottenere al contempo notevoli miglioramenti delle 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
è maggiore delle dimensioni attuali del file, il file viene completato con byte null; altrimenti 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()
: svuota la barra 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()
non funzionerà.
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