Không phải tất cả bộ nhớ đều được tạo như nhau: giới thiệu Bộ chứa bộ nhớ

Tiêu chuẩn bộ nhớ xác định một API để lưu trữ lâu dài và ước tính hạn mức, cũng như cấu trúc lưu trữ của nền tảng. Chúng tôi sẽ ra mắt một API để giúp việc giải phóng bộ nhớ liên tục chịu áp lực lớn về bộ nhớ trở nên dễ dự đoán hơn. Tính năng này được cung cấp kể từ Chromium 122.

Tiêu chuẩn bộ nhớ giải quyết được vấn đề gì?

Thông thường, khi người dùng hết dung lượng lưu trữ trên thiết bị, dữ liệu được lưu trữ bằng các API như IndexedDB hoặc localStorage sẽ bị mất mà người dùng không thể can thiệp. Một cách để tăng tính ổn định cho bộ nhớ là gọi phương thức persist() của giao diện StorageManager. Dịch vụ này đồng thời yêu cầu người dùng cuối cấp quyền và thay đổi bộ nhớ để duy trì sau khi được cấp:

const persisted = await navigator.storage.persist();
if (persisted) {
  /* Storage will not be cleared except by explicit user action. */
}

Phương thức yêu cầu duy trì bộ nhớ này là tất cả hoặc không có giá trị gì. Không có cách nào để thể hiện nhu cầu cụ thể hơn về tính bền vững. Tất cả chỉ là một bộ chứa.

Storage Buckets API (API Bộ chứa bộ nhớ)

Ý tưởng cốt lõi của Storage Buckets API là cấp cho các trang web khả năng tạo nhiều bộ chứa lưu trữ, trong đó trình duyệt có thể chọn xoá từng bộ chứa một cách độc lập với các bộ chứa khác. Việc này cho phép nhà phát triển chỉ định mức độ ưu tiên loại bỏ để đảm bảo dữ liệu có giá trị nhất không bị xoá.

Ví dụ về trường hợp sử dụng

Để minh hoạ nơi bộ chứa lưu trữ sẽ hữu ích, hãy tưởng tượng một ứng dụng email. Điều này sẽ không thể tha thứ nếu ứng dụng mất các bản nháp chưa gửi của người dùng mà chỉ tồn tại trên ứng dụng. Ngược lại, nếu chúng được lưu trữ trên máy chủ, thì người dùng có thể sẽ không cần lo lắng về việc một số email cũ nhất trong hộp thư đến sẽ bị xoá khỏi ứng dụng nếu trình duyệt của họ đang chịu quá tải về lưu trữ.

Giao diện của ứng dụng email
Ứng dụng email có bộ chứa riêng cho hộp thư đến và thư nháp. (Chỉ dùng để minh hoạ, không nhất thiết phản ánh cách hoạt động của Gmail.)

Sử dụng Storage Buckets API (API Bộ chứa bộ nhớ)

Tạo bộ chứa lưu trữ mới

Bạn có thể tạo một bộ chứa lưu trữ mới bằng phương thức open() trên giao diện StorageBucketManager.

// Create a storage bucket for emails that are synchronized with the
// server.
const inboxBucket = await navigator.storageBuckets.open('inbox');

Tạo một bộ chứa lưu trữ mới, bền vững

Để đảm bảo bộ chứa lưu trữ vẫn tồn tại, bạn có thể truyền các đối số tuỳ chọn durabilitypersisted đến phương thức open():

  • persisted xác định xem có nên duy trì bộ chứa lưu trữ hay không. Các giá trị được phép là false (mặc định) hoặc true.
  • durability cung cấp một gợi ý cho trình duyệt nhằm giúp trình duyệt đánh đổi hiệu suất ghi với nguy cơ giảm mất dữ liệu trong trường hợp mất điện. Các giá trị được phép là 'relaxed' (mặc định) hoặc 'strict':

    • Bộ chứa 'strict' cố gắng giảm thiểu nguy cơ mất dữ liệu khi mất điện. Điều này có thể khiến hiệu suất giảm, nghĩa là việc ghi có thể mất nhiều thời gian hơn để hoàn thành, có thể ảnh hưởng đến hiệu suất tổng thể của hệ thống, có thể tốn nhiều pin hơn và có thể làm hỏng thiết bị lưu trữ nhanh hơn.
    • Bộ chứa 'relaxed' có thể "quên" hoạt động ghi đã hoàn tất trong vài giây trước, khi mất điện. Đổi lại, việc ghi dữ liệu vào những bộ chứa này có thể có đặc điểm hiệu suất tốt hơn, đồng thời có thể kéo dài thời gian sạc pin và có thể kéo dài tuổi thọ của thiết bị lưu trữ. Ngoài ra, tình trạng mất điện sẽ không dẫn đến hỏng dữ liệu ở tỷ lệ cao hơn so với bộ chứa 'strict'.
// Create a storage bucket for email drafts that only exist on the client.
const draftsBucket = await navigator.storageBuckets.open('drafts', {
  durability: 'strict', // Or `'relaxed'`.
  persisted: true, // Or `false`.
});

Truy cập API lưu trữ từ bộ chứa lưu trữ

Mỗi bộ chứa lưu trữ được liên kết với các API lưu trữ, ví dụ: IndexedDB, giao diện Bộ nhớ đệm hoặc giao diện Tệp. Các API lưu trữ này hoạt động như bình thường, chỉ là điểm truy cập là từ giao diện StorageBucket, ví dụ: StorageBucket.indexedDB.

const inboxDb = await new Promise(resolve => {
  const request = inboxBucket.indexedDB.open('messages');
  request.onupgradeneeded = () => { /* migration code */ };
  request.onsuccess = () => resolve(request.result);
  request.onerror = () => reject(request.error);
});

Tài nguyên hữu ích