chrome.storage

Mô tả

Sử dụng API chrome.storage để lưu trữ, truy xuất và theo dõi các thay đổi đối với dữ liệu người dùng.

Quyền

storage

Tổng quan

Storage API cung cấp một cách thức dành riêng cho tiện ích để duy trì dữ liệu và trạng thái của người dùng. API này tương tự như các API lưu trữ của nền tảng web (IndexedDBBộ nhớ), nhưng được thiết kế để đáp ứng nhu cầu lưu trữ của các tiện ích. Sau đây là một số tính năng chính:

  • Tất cả ngữ cảnh của tiện ích, bao gồm cả trình chạy dịch vụ tiện ích và tập lệnh nội dung đều có quyền truy cập vào Storage API.
  • Các giá trị JSON có thể chuyển đổi tuần tự được lưu trữ dưới dạng thuộc tính đối tượng.
  • Storage API không đồng bộ với các thao tác đọc và ghi hàng loạt.
  • Ngay cả khi người dùng xoá bộ nhớ đệm và nhật ký duyệt web, dữ liệu vẫn tồn tại.
  • Các chế độ cài đặt đã lưu trữ vẫn tồn tại ngay cả khi bạn sử dụng chế độ chia chế độ ẩn danh.
  • Bao gồm một khu vực bộ nhớ được quản lý chỉ có thể đọc dành riêng cho các chính sách của doanh nghiệp.

Mặc dù các tiện ích có thể sử dụng giao diện [Storage][mdn-storage] (có thể truy cập từ window.localStorage) trong một số ngữ cảnh (cửa sổ bật lên và các trang HTML khác), nhưng bạn không nên sử dụng giao diện này vì những lý do sau:

  • Worker dịch vụ của tiện ích không thể truy cập vào Storage.
  • Tập lệnh nội dung sẽ dùng chung dung lượng lưu trữ với trang lưu trữ.
  • Dữ liệu được lưu bằng giao diện Storage sẽ bị mất khi người dùng xoá nhật ký duyệt web.

Cách di chuyển dữ liệu từ API lưu trữ trên web sang API lưu trữ tiện ích từ một trình chạy dịch vụ:

  1. Tạo tài liệu ngoài màn hình có quy trình chuyển đổi và trình xử lý [onMessage][on-message].
  2. Thêm quy trình chuyển đổi vào tài liệu ngoài màn hình.
  3. Trong trình chạy dịch vụ tiện ích, hãy kiểm tra chrome.storage để tìm dữ liệu của bạn.
  4. Nếu không tìm thấy dữ liệu của bạn, hãy [tạo][tạo ngoài màn hình] một tài liệu ngoài màn hình và gọi [sendMessage()][send-message] để bắt đầu quy trình chuyển đổi.
  5. Bên trong trình xử lý onMessage của tài liệu ngoài màn hình, hãy gọi quy trình chuyển đổi.

Ngoài ra, còn có một số điểm khác biệt nhỏ về cách hoạt động của các API lưu trữ trên web trong các tiện ích. Tìm hiểu thêm trong bài viết [Bộ nhớ và cookie][storage-and-cookies].

Khu vực lưu trữ

Storage API được chia thành 4 nhóm sau ("khu vực lưu trữ"):

storage.local
Dữ liệu được lưu trữ cục bộ và sẽ bị xoá khi bạn xoá tiện ích. Giới hạn hạn mức là khoảng 10 MB, nhưng bạn có thể tăng hạn mức bằng cách yêu cầu quyền "unlimitedStorage". Hãy cân nhắc sử dụng kho dữ liệu này để lưu trữ lượng dữ liệu lớn hơn.
storage.sync
Nếu bạn bật tính năng đồng bộ hoá, dữ liệu sẽ được đồng bộ hoá với mọi trình duyệt Chrome mà người dùng đã đăng nhập. Nếu bị tắt, thuộc tính này sẽ hoạt động như storage.local. Chrome lưu trữ dữ liệu trên thiết bị khi trình duyệt không có kết nối mạng và tiếp tục đồng bộ hoá khi có kết nối mạng trở lại. Hạn mức hạn mức là khoảng 100 KB, 8 KB cho mỗi mặt hàng. Hãy cân nhắc việc sử dụng mẫu này để duy trì chế độ cài đặt người dùng trên các trình duyệt đã đồng bộ hoá.
storage.session
Lưu giữ dữ liệu trong bộ nhớ trong suốt một phiên hoạt động của trình duyệt. Theo mặc định, phần tử này không hiển thị với các tập lệnh nội dung, nhưng bạn có thể thay đổi hành vi này bằng cách đặt chrome.storage.session.setAccessLevel(). Hạn mức là khoảng 10 MB. Hãy cân nhắc sử dụng phương thức này để lưu trữ các biến toàn cục trên các lần chạy worker dịch vụ.
storage.managed
Quản trị viên có thể sử dụng giản đồ và chính sách doanh nghiệp để định cấu hình các tùy chọn cài đặt của tiện ích hỗ trợ trong môi trường được quản lý. Khu vực lưu trữ này ở chế độ chỉ đọc.

Tệp kê khai

Để sử dụng API bộ nhớ, hãy khai báo quyền "storage" trong tệp kê khai của tiện ích. Ví dụ:

{
  "name": "My extension",
  ...
  "permissions": [
    "storage"
  ],
  ...
}

Cách sử dụng

Các mẫu sau đây minh hoạ local, syncsession khu vực lưu trữ:

storage.local

chrome.storage.local.set({ key: value }).then(() => {
  console.log("Value is set");
});

chrome.storage.local.get(["key"]).then((result) => {
  console.log("Value currently is " + result.key);
});

storage.sync

chrome.storage.sync.set({ key: value }).then(() => {
  console.log("Value is set");
});

chrome.storage.sync.get(["key"]).then((result) => {
  console.log("Value currently is " + result.key);
});

storage.session

chrome.storage.session.set({ key: value }).then(() => {
  console.log("Value was set");
});

chrome.storage.session.get(["key"]).then((result) => {
  console.log("Value currently is " + result.key);
});

Để tìm hiểu thêm về vùng lưu trữ managed, hãy xem phần Tệp kê khai cho vùng lưu trữ.

Hạn mức bộ nhớ và giới hạn điều tiết

Đừng nghĩ việc thêm vào API Bộ nhớ giống như việc đặt đồ đạc vào một chiếc xe tải lớn. Hãy coi việc thêm vào bộ nhớ giống như việc đặt một vật gì đó vào một ống. Đường ống có thể đã có sẵn chất liệu và thậm chí có thể được điền. Luôn giả định có độ trễ giữa thời điểm bạn thêm vào bộ nhớ và thời điểm dữ liệu đó thực sự được ghi lại.

Để biết chi tiết về giới hạn đối với khu vực lưu trữ và những việc sẽ xảy ra khi vượt quá hạn mức, hãy xem thông tin về hạn mức cho sync, localsession.

Trường hợp sử dụng

Các phần sau đây minh hoạ các trường hợp sử dụng phổ biến của API Bộ nhớ.

Phản hồi đồng bộ đối với nội dung cập nhật về bộ nhớ

Để theo dõi các thay đổi đối với bộ nhớ, bạn có thể thêm trình nghe vào sự kiện onChanged. Khi có bất kỳ thay đổi nào trong bộ nhớ, sự kiện đó sẽ kích hoạt. Mã mẫu theo dõi những thay đổi sau:

background.js:

chrome.storage.onChanged.addListener((changes, namespace) => {
  for (let [key, { oldValue, newValue }] of Object.entries(changes)) {
    console.log(
      `Storage key "${key}" in namespace "${namespace}" changed.`,
      `Old value was "${oldValue}", new value is "${newValue}".`
    );
  }
});

Chúng ta có thể phát triển ý tưởng này hơn nữa. Trong ví dụ này, chúng ta có một trang tuỳ chọn cho phép người dùng bật/tắt "chế độ gỡ lỗi" (không hiển thị cách triển khai tại đây). Trang tuỳ chọn sẽ lưu ngay chế độ cài đặt mới vào storage.sync và worker dịch vụ sẽ sử dụng storage.onChanged để áp dụng chế độ cài đặt sớm nhất có thể.

options.html:

<!-- type="module" allows you to use top level await -->
<script defer src="options.js" type="module"></script>
<form id="optionsForm">
  <label for="debug">
    <input type="checkbox" name="debug" id="debug">
    Enable debug mode
  </label>
</form>

options.js:

// In-page cache of the user's options
const options = {};
const optionsForm = document.getElementById("optionsForm");

// Immediately persist options changes
optionsForm.debug.addEventListener("change", (event) => {
  options.debug = event.target.checked;
  chrome.storage.sync.set({ options });
});

// Initialize the form with the user's option settings
const data = await chrome.storage.sync.get("options");
Object.assign(options, data.options);
optionsForm.debug.checked = Boolean(options.debug);

background.js:

function setDebugMode() { /* ... */ }

// Watch for changes to the user's options & apply them
chrome.storage.onChanged.addListener((changes, area) => {
  if (area === 'sync' && changes.options?.newValue) {
    const debugMode = Boolean(changes.options.newValue.debug);
    console.log('enable debug mode?', debugMode);
    setDebugMode(debugMode);
  }
});

Tải trước không đồng bộ từ bộ nhớ

Vì worker dịch vụ không phải lúc nào cũng chạy, nên các tiện ích Manifest V3 đôi khi cần tải dữ liệu không đồng bộ từ bộ nhớ trước khi thực thi trình xử lý sự kiện. Để thực hiện việc này, đoạn mã sau đây sử dụng trình xử lý sự kiện action.onClicked không đồng bộ để chờ điền sẵn storageCache toàn cục trước khi thực thi logic của trình xử lý đó.

background.js:

// Where we will expose all the data we retrieve from storage.sync.
const storageCache = { count: 0 };
// Asynchronously retrieve data from storage.sync, then cache it.
const initStorageCache = chrome.storage.sync.get().then((items) => {
  // Copy the data retrieved from storage into storageCache.
  Object.assign(storageCache, items);
});

chrome.action.onClicked.addListener(async (tab) => {
  try {
    await initStorageCache;
  } catch (e) {
    // Handle error that occurred during storage initialization.
  }

  // Normal action handler logic.
  storageCache.count++;
  storageCache.lastTabId = tab.id;
  chrome.storage.sync.set(storageCache);
});

Ví dụ về phần mở rộng

Để xem các bản minh hoạ khác về API Bộ nhớ, hãy khám phá bất kỳ ví dụ nào sau đây:

Loại

AccessLevel

Chrome 102 trở lên

Cấp truy cập của khu vực lưu trữ.

Enum

"TRUSTED_CONTEXTS"
Chỉ định ngữ cảnh bắt nguồn từ chính tiện ích.

"TRUSTED_AND_UNTRUSTED_CONTEXTS"
Chỉ định các ngữ cảnh bắt nguồn từ bên ngoài tiện ích.

StorageArea

Thuộc tính

  • onChanged

    Event<functionvoidvoid>

    Chrome 73 trở lên

    Được kích hoạt khi một hoặc nhiều mục thay đổi.

    Hàm onChanged.addListener có dạng như sau:

    (callback: function) => {...}

    • lệnh gọi lại

      hàm

      Tham số callback có dạng như sau:

      (changes: object) => void

      • các thay đổi

        đối tượng

  • xóa

    void

    Promise

    Xoá tất cả mục khỏi bộ nhớ.

    Hàm clear có dạng như sau:

    (callback?: function) => {...}

    • số gọi lại

      hàm không bắt buộc

      Tham số callback có dạng như sau:

      () => void

    • returns

      Promise<void>

      Chrome 88 trở lên

      Lời hứa chỉ được hỗ trợ cho Tệp kê khai V3 trở lên, các nền tảng khác cần sử dụng lệnh gọi lại.

  • get

    void

    Lời hứa

    Lấy một hoặc nhiều mục từ bộ nhớ.

    Hàm get có dạng như sau:

    (keys?: string | string[] | object, callback?: function) => {...}

    • khoá

      string | string[] | đối tượng không bắt buộc

      Một khoá duy nhất cần lấy, danh sách các khoá cần lấy hoặc từ điển chỉ định giá trị mặc định (xem nội dung mô tả về đối tượng). Danh sách hoặc đối tượng trống sẽ trả về một đối tượng kết quả trống. Truyền null để nhận toàn bộ nội dung của bộ nhớ.

    • lệnh gọi lại

      hàm không bắt buộc

      Tham số callback có dạng như sau:

      (items: object) => void

      • mục

        đối tượng

        Đối tượng có các mục trong mối liên kết khoá-giá trị.

    • returns

      Promise<object>

      Chrome 88 trở lên

      Lời hứa chỉ được hỗ trợ cho Tệp kê khai V3 trở lên, các nền tảng khác cần sử dụng lệnh gọi lại.

  • getBytesInUse

    void

    Lời hứa

    Lấy dung lượng (tính bằng byte) mà một hoặc nhiều mục đang sử dụng.

    Hàm getBytesInUse có dạng như sau:

    (keys?: string | string[], callback?: function) => {...}

    • khoá

      string | string[] không bắt buộc

      Một khoá hoặc danh sách khoá để biết tổng mức sử dụng. Danh sách trống sẽ trả về 0. Truyền vào null để biết tổng mức sử dụng của tất cả bộ nhớ.

    • số gọi lại

      hàm không bắt buộc

      Tham số callback có dạng như sau:

      (bytesInUse: number) => void

      • bytesInUse

        số

        Dung lượng đang được sử dụng trong bộ nhớ, tính bằng byte.

    • returns

      Cam kết<number>

      Chrome 88 trở lên

      Lời hứa chỉ được hỗ trợ cho Manifest V3 trở lên, các nền tảng khác cần sử dụng lệnh gọi lại.

  • getKeys

    void

    Lời hứa Chrome 130 trở lên

    Lấy tất cả khoá từ bộ nhớ.

    Hàm getKeys có dạng như sau:

    (callback?: function) => {...}

    • lệnh gọi lại

      hàm không bắt buộc

      Tham số callback sẽ có dạng như sau:

      (keys: string[]) => void

      • khoá

        string[]

        Mảng có các khoá được đọc từ bộ nhớ.

    • returns

      Cam kết<string[]>

      Lời hứa chỉ được hỗ trợ cho Tệp kê khai V3 trở lên, các nền tảng khác cần sử dụng lệnh gọi lại.

  • xoá

    void

    Lời hứa

    Xoá một hoặc nhiều mục khỏi bộ nhớ.

    Hàm remove có dạng như sau:

    (keys: string | string[], callback?: function) => {...}

    • khoá

      string | string[]

      Một khoá hoặc một danh sách các khoá của các mục cần xoá.

    • số gọi lại

      hàm không bắt buộc

      Tham số callback có dạng như sau:

      () => void

    • returns

      Promise<void>

      Chrome 88 trở lên

      Lời hứa chỉ được hỗ trợ cho Tệp kê khai V3 trở lên, các nền tảng khác cần sử dụng lệnh gọi lại.

  • đặt

    void

    Lời hứa

    Đặt nhiều mục.

    Hàm set có dạng như sau:

    (items: object, callback?: function) => {...}

    • mục

      đối tượng

      Một đối tượng cung cấp cho mỗi cặp khoá/giá trị để cập nhật bộ nhớ. Mọi cặp khoá/giá trị khác trong bộ nhớ sẽ không bị ảnh hưởng.

      Các giá trị ban đầu như số sẽ được chuyển đổi tuần tự như dự kiến. Các giá trị có typeof "object""function" thường sẽ chuyển đổi tuần tự thành {}, ngoại trừ Array (chuyển đổi tuần tự như dự kiến), DateRegex (chuyển đổi tuần tự bằng cách sử dụng bản trình bày String).

    • lệnh gọi lại

      hàm không bắt buộc

      Tham số callback có dạng như sau:

      () => void

    • returns

      Promise<void>

      Chrome 88 trở lên

      Lời hứa chỉ được hỗ trợ cho Tệp kê khai V3 trở lên, các nền tảng khác cần sử dụng lệnh gọi lại.

  • setAccessLevel

    void

    Lời hứa Chrome 102 trở lên

    Đặt cấp truy cập mong muốn cho vùng bộ nhớ. Tuỳ chọn mặc định sẽ chỉ là ngữ cảnh đáng tin cậy.

    Hàm setAccessLevel có dạng như sau:

    (accessOptions: object, callback?: function) => {...}

    • accessOptions

      đối tượng

      • accessLevel

        Cấp truy cập của vùng bộ nhớ.

    • số gọi lại

      hàm không bắt buộc

      Tham số callback có dạng như sau:

      () => void

    • returns

      Lời hứa<vô hiệu>

      Lời hứa chỉ được hỗ trợ cho Tệp kê khai V3 trở lên, các nền tảng khác cần sử dụng lệnh gọi lại.

StorageChange

Thuộc tính

  • newValue

    bất kỳ không bắt buộc nào

    Giá trị mới của mặt hàng, nếu có giá trị mới.

  • oldValue

    bất kỳ không bắt buộc nào

    Giá trị cũ của mặt hàng, nếu có giá trị cũ.

Thuộc tính

local

Các mục trong vùng lưu trữ local sẽ là cục bộ trên mỗi máy.

Loại

StorageArea và đối tượng

Thuộc tính

  • QUOTA_BYTES

    10485760

    Dung lượng dữ liệu tối đa (tính bằng byte) có thể được lưu trữ trong bộ nhớ cục bộ, được đo bằng chuỗi JSON của mọi giá trị cộng với độ dài của mỗi khoá. Giá trị này sẽ bị bỏ qua nếu tiện ích có quyền unlimitedStorage. Các bản cập nhật sẽ khiến giới hạn này bị vượt quá sẽ không thành công ngay lập tức và đặt runtime.lastError khi sử dụng lệnh gọi lại hoặc Lời hứa bị từ chối nếu sử dụng chế độ không đồng bộ/chờ.

managed

Các mục trong vùng lưu trữ của managed được thiết lập theo một chính sách doanh nghiệp do quản trị viên miền thiết lập và ở chế độ chỉ có thể đọc đối với tiện ích; việc cố gắng sửa đổi không gian tên này sẽ dẫn đến lỗi. Để biết thông tin về cách định cấu hình chính sách, hãy xem phần Tệp kê khai cho vùng bộ nhớ.

Loại

session

Chrome 102 trở lên MV3 trở lên

Các mục trong vùng lưu trữ session được lưu trữ trong bộ nhớ và sẽ không được lưu trữ vĩnh viễn trên ổ đĩa.

Loại

StorageArea và đối tượng

Thuộc tính

  • QUOTA_BYTES

    10485760

    Dung lượng dữ liệu tối đa (tính bằng byte) có thể lưu trữ trong bộ nhớ, được đo bằng cách ước tính mức sử dụng bộ nhớ được phân bổ linh động của mọi giá trị và khoá. Các bản cập nhật sẽ khiến việc vượt quá giới hạn này sẽ không thành công ngay lập tức và đặt runtime.lastError khi sử dụng lệnh gọi lại hoặc khi Lời hứa bị từ chối.

sync

Các mục trong khu vực lưu trữ sync được đồng bộ hoá bằng tính năng Đồng bộ hoá Chrome.

Loại

StorageArea & đối tượng

Thuộc tính

  • MAX_ITEMS

    512

    Số lượng mục tối đa có thể được lưu trữ trong bộ nhớ đồng bộ hoá. Những nội dung cập nhật khiến việc vượt quá giới hạn này sẽ bị lỗi ngay lập tức và đặt giá trị runtime.lastError khi sử dụng lệnh gọi lại hoặc khi Lời hứa bị từ chối.

  • MAX_SUSTAINED_WRITE_OPERATIONS_PER_MINUTE

    1000000

    Không dùng nữa

    API storage.sync không còn hạn mức hoạt động ghi liên tục.

  • MAX_WRITE_OPERATIONS_PER_HOUR

    1800

    Số lượng thao tác set, remove hoặc clear tối đa có thể thực hiện mỗi giờ. Tức là 1 lần mỗi 2 giây, thấp hơn giới hạn ghi mỗi phút cao hơn trong thời gian ngắn.

    Các bản cập nhật sẽ khiến việc vượt quá giới hạn này sẽ không thành công ngay lập tức và đặt runtime.lastError khi sử dụng lệnh gọi lại hoặc khi Lời hứa bị từ chối.

  • MAX_WRITE_OPERATIONS_PER_MINUTE

    120

    Số lượng thao tác set, remove hoặc clear tối đa có thể thực hiện mỗi phút. Tốc độ này là 2/giây, mang lại thông lượng cao hơn so với ghi mỗi giờ trong một khoảng thời gian ngắn hơn.

    Các bản cập nhật sẽ khiến giới hạn này bị vượt quá sẽ không thành công ngay lập tức và đặt runtime.lastError khi sử dụng lệnh gọi lại hoặc khi Lời hứa bị từ chối.

  • QUOTA_BYTES

    102400

    Tổng lượng dữ liệu tối đa (tính bằng byte) có thể được lưu trữ trong bộ nhớ đồng bộ hoá, được đo bằng việc chuyển đổi chuỗi JSON của mọi giá trị cộng với độ dài của mọi khoá. Các bản cập nhật sẽ khiến giới hạn này bị vượt quá sẽ không thành công ngay lập tức và đặt runtime.lastError khi sử dụng lệnh gọi lại hoặc khi Lời hứa bị từ chối.

  • QUOTA_BYTES_PER_ITEM

    8192

    Kích thước tối đa (tính bằng byte) của từng mục riêng lẻ trong bộ nhớ đồng bộ hoá, được đo bằng cách chuyển đổi giá trị của mục đó thành chuỗi JSON cộng với độ dài khoá của mục đó. Các bản cập nhật chứa các mục lớn hơn hạn mức này sẽ không thành công ngay lập tức và đặt runtime.lastError khi sử dụng lệnh gọi lại hoặc khi một Lời hứa bị từ chối.

Sự kiện

onChanged

chrome.storage.onChanged.addListener(
  callback: function,
)

Được kích hoạt khi một hoặc nhiều mục thay đổi.

Thông số

  • số gọi lại

    hàm

    Tham số callback có dạng như sau:

    (changes: object, areaName: string) => void

    • các thay đổi

      đối tượng

    • areaName

      string