Hệ thống tệp riêng tư gốc cung cấp quyền truy cập vào một loại tệp đặc biệt được tối ưu hoá cao cho hiệu suất, chẳng hạn như bằng cách cung cấp quyền ghi tại chỗ và độc quyền vào nội dung của tệp. Nhà phát triển có thể truy cập vào các tệp đó bằng cách gọi createSyncAccessHandle()
. Đây là một phương thức hiển thị trên các đối tượng FileSystemFileHandle
. Lệnh gọi này dẫn đến một FileSystemSyncAccessHandle
.
FileSystemSyncAccessHandle
là một tệp gốc cung cấp quyền truy cập hiệu quả vào các tệp cục bộ. Một trong những trường hợp sử dụng chính của thư viện này là các ứng dụng chuyển mã C/C++ sang Wasm; tuy nhiên, các lệnh gọi không đồng bộ chưa được hỗ trợ đầy đủ trên Wasm và việc sử dụng thư viện Asyncify làm giải pháp thay thế đã làm giảm đáng kể hiệu suất. Việc đồng bộ hoá tất cả các phương thức của FileSystemSyncAccessHandle
khớp với ứng dụng dựa trên Wasm API tệp đồng bộ, giống POSIX; giúp API trở nên tiện dụng hơn trong khi vẫn mang lại hiệu suất đáng kể.
Có gì mới?
FileSystemSyncAccessHandle
hiển thị các phương thức sau đây từng không đồng bộ, nhưng đồng bộ kể từ Chromium 108.
truncate(newSize)
: Đổi kích thước tệp liên kết với handle truy cập thànhnewSize
byte. NếunewSize
lớn hơn kích thước tệp hiện tại, thì tệp sẽ được thêm vào các byte rỗng; nếu không, tệp sẽ bị cắt bớt.getSize()
: Trả về kích thước của tệp được liên kết với handle truy cập tính bằng byte.flush()
: Đảm bảo rằng nội dung của tệp liên kết với tên truy cập chứa tất cả các nội dung sửa đổi được thực hiện thông quawrite()
.close()
: Xoá sạch tay cầm truy cập rồi đóng tay cầm đó. Việc đóng một handle truy cập sẽ vô hiệu hoá mọi thao tác tiếp theo trên handle đó và giải phóng khoá trên mục nhập được liên kết với handle truy cập.
// 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();
Việc bạn cần làm
Xin lưu ý rằng việc thay đổi các phương thức từ không đồng bộ sang đồng bộ là một thay đổi được hiển thị trên web và có thể bị lỗi. Mặc dù việc sử dụng await
trong các phương thức đồng bộ không có tác dụng, nhưng mọi hoạt động sử dụng Promise.then()
sẽ bị gián đoạn.
Nếu tạo chuỗi lệnh gọi then()
trên kết quả của bất kỳ phương thức không đồng bộ nào trước đây và hiện là phương thức đồng bộ, bạn cần thay đổi mã của mình.
// (✅) 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 */
Đường liên kết có liên quan
- Bài đánh giá TAG
- Thông số kỹ thuật
- Vấn đề về thông số kỹ thuật (dẫn đến thay đổi)
- Mục ChromeStatus
- Lỗi Chromium