Sistem file pribadi origin
memberikan akses ke jenis file khusus yang sangat dioptimalkan untuk performa, misalnya, dengan
menawarkan akses tulis eksklusif dan di tempat ke konten file. Developer bisa mendapatkan akses ke file
tersebut dengan memanggil
createSyncAccessHandle()
,
yang merupakan metode yang ditampilkan di
objek FileSystemFileHandle
. Panggilan ini
menghasilkan FileSystemSyncAccessHandle
.
FileSystemSyncAccessHandle
adalah primitif file yang memberikan akses berperforma tinggi ke file lokal. Salah satu
kasus penggunaan utamanya adalah aplikasi yang melakukan porting kode C/C++ ke Wasm; namun, panggilan asinkron
belum didukung sepenuhnya di Wasm, dan menggunakan
library Asyncify sebagai alternatif telah
menguraikan performa secara substansial. Membuat semua metode FileSystemSyncAccessHandle
sinkron sesuai dengan ekspektasi aplikasi berbasis API Wasm seperti POSIX sinkron; membuat API lebih ergonomis sekaligus memberikan peningkatan performa yang substansial.
Apa yang baru?
FileSystemSyncAccessHandle
menampilkan metode berikut yang sebelumnya asinkron, tetapi
sinkron mulai Chromium 108.
truncate(newSize)
: Mengubah ukuran file yang terkait dengan handle akses menjadi sepanjangnewSize
byte. JikanewSize
lebih besar dari ukuran file saat ini, file akan diisi dengan byte null; jika tidak, file akan terpotong.getSize()
: Menampilkan ukuran file yang terkait dengan handle akses dalam byte.flush()
: Memastikan bahwa konten file yang terkait dengan handle akses berisi semua perubahan yang dilakukan melaluiwrite()
.close()
: Menghapus handle akses, lalu menutupnya. Menutup handle akses akan menonaktifkan operasi lebih lanjut pada handle tersebut dan melepaskan kunci pada entri yang terkait dengan handle 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 menjadi sinkron adalah perubahan yang diekspos web dengan potensi kerusakan. Meskipun penggunaan await
dalam metode sinkron tidak akan berfungsi, penggunaan Promise.then()
akan rusak.
Jika Anda membuat rantai panggilan then()
pada hasil 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
- TAG Review
- Spesifikasi
- Masalah Spesifikasi (yang menyebabkan perubahan)
- Entri ChromeStatus
- Bug Chromium