Sistem file pribadi origin
memberikan akses ke jenis file khusus yang sangat dioptimalkan untuk performa, misalnya, dengan
menawarkan akses tulis langsung dan eksklusif ke konten file. Developer dapat memperoleh akses ke
file tersebut dengan memanggil
createSyncAccessHandle()
,
yang merupakan metode yang diekspos pada
objek FileSystemFileHandle
. Panggilan ini
akan menghasilkan FileSystemSyncAccessHandle
.
FileSystemSyncAccessHandle
adalah primitif file yang memberikan akses berperforma tinggi ke file lokal. Salah satu kasus penggunaan utamanya adalah aplikasi yang mem-porting kode C/C++ ke Wasm. Namun, panggilan asinkron belum sepenuhnya didukung di Wasm, dan penggunaan library Asyncify sebagai alternatif telah menurunkan performa secara signifikan. Membuat semua metode FileSystemSyncAccessHandle
sinkron dengan yang diharapkan oleh aplikasi berbasis API file POSIX yang sinkron dan mirip POSIX; menjadikan API lebih ergonomis sekaligus membawa peningkatan performa yang signifikan.
Apa yang baru?
FileSystemSyncAccessHandle
mengekspos metode berikut yang sebelumnya bersifat asinkron, tetapi
sinkron mulai Chromium 108.
truncate(newSize)
: Mengubah ukuran file yang terkait dengan handle akses menjadi panjangnewSize
byte. JikanewSize
lebih besar dari ukuran file saat ini, file akan digabungkan dengan byte null; jika tidak, file akan dipotong.getSize()
: Menampilkan ukuran file yang terkait dengan handle akses dalam byte.flush()
: Memastikan konten file yang terkait dengan handle akses berisi semua perubahan yang dilakukan melaluiwrite()
.close()
: Menghapus tuas akses, lalu menutupnya. Menutup tuas akses akan menonaktifkan operasi lebih lanjut dan melepaskan kunci pada entri yang terkait dengan tuas akses.
// 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();
Apa yang harus saya lakukan?
Perhatikan bahwa mengubah metode dari asinkron ke sinkron adalah perubahan yang diekspos web yang berpotensi mengalami
kerusakan. Meskipun penggunaan await
dalam metode sinkron adalah tanpa pengoperasian, semua penggunaan Promise.then()
akan terganggu.
Jika merangkai panggilan then()
pada hasil dari metode yang sebelumnya asinkron dan sekarang
sinkron, Anda perlu mengubah kode.
// (✅) 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 terkait
- Peninjauan TAG
- Spesifikasi
- Masalah Spesifikasi (yang menyebabkan perubahan)
- Entri ChromeStatus
- Bug Chromium