Deskripsi
Gunakan chrome.storage
API untuk menyimpan, mengambil, dan melacak perubahan pada data pengguna.
Izin
storage
Untuk menggunakan Storage API, deklarasikan izin "storage"
di
manifes ekstensi. Contoh:
{
"name": "My extension",
...
"permissions": [
"storage"
],
...
}
Konsep dan penggunaan
Storage API menyediakan cara khusus ekstensi untuk mempertahankan data dan status pengguna. API ini mirip dengan API penyimpanan platform web (IndexedDB, dan Storage), tetapi dirancang untuk memenuhi kebutuhan penyimpanan ekstensi. Berikut beberapa fitur utamanya:
- Semua konteks ekstensi, termasuk pekerja layanan ekstensi dan skrip konten memiliki akses ke Storage API.
- Nilai yang dapat diserialisasi JSON disimpan sebagai properti objek.
- Storage API bersifat asinkron dengan operasi baca dan tulis massal.
- Meskipun pengguna menghapus cache dan histori penjelajahan, data akan tetap ada.
- Setelan yang disimpan tetap ada meskipun saat menggunakan mode samaran terpisah.
- Mencakup area penyimpanan terkelola hanya baca eksklusif untuk kebijakan perusahaan.
Dapatkah ekstensi menggunakan API penyimpanan web?
Meskipun ekstensi dapat menggunakan antarmuka Storage
(dapat diakses dari window.localStorage
) dalam beberapa konteks (pop-up dan halaman HTML lainnya), sebaiknya jangan gunakan antarmuka tersebut karena alasan berikut:
- Service worker ekstensi tidak dapat menggunakan Web Storage API.
- Skrip konten berbagi penyimpanan dengan halaman host.
- Data yang disimpan menggunakan Web Storage API akan hilang saat pengguna menghapus histori penjelajahannya.
Untuk memindahkan data dari API penyimpanan web ke API penyimpanan ekstensi dari pekerja layanan:
- Siapkan halaman html dokumen di balik layar dan file skrip. File skrip harus berisi rutin konversi dan handler
onMessage
. - Di pekerja layanan ekstensi, periksa
chrome.storage
untuk data Anda. - Jika data Anda tidak ditemukan, panggil
createDocument()
. - Setelah Promise yang ditampilkan diselesaikan, panggil
sendMessage()
untuk memulai rutin konversi. - Di dalam handler
onMessage
dokumen di balik layar, panggil rutin konversi.
Ada juga beberapa nuansa tentang cara kerja API penyimpanan web di ekstensi. Pelajari lebih lanjut di artikel Penyimpanan dan Cookie.
Area penyimpanan
Storage API dibagi menjadi area penyimpanan berikut:
storage.local
- Data disimpan secara lokal dan dihapus saat ekstensi dihapus. Batas penyimpanan adalah 10 MB (5 MB di Chrome 113 dan yang lebih lama), tetapi dapat ditingkatkan dengan meminta izin
"unlimitedStorage"
. Sebaiknya gunakanstorage.local
untuk menyimpan data dalam jumlah yang lebih besar. Secara default, API ini diekspos ke skrip konten, tetapi perilaku ini dapat diubah dengan memanggilchrome.storage.local.setAccessLevel()
. storage.managed
- Penyimpanan terkelola adalah penyimpanan hanya baca untuk ekstensi yang diinstal kebijakan dan dikelola oleh administrator sistem menggunakan skema yang ditentukan developer dan kebijakan perusahaan. Kebijakan serupa dengan opsi, tetapi dikonfigurasi oleh administrator sistem, bukan pengguna, sehingga memungkinkan ekstensi dikonfigurasi sebelumnya untuk semua pengguna organisasi. Untuk mengetahui informasi tentang kebijakan, lihat Dokumentasi untuk Administrator. Untuk mempelajari area penyimpanan
managed
lebih lanjut, lihat Manifes untuk area penyimpanan. storage.session
- Menyimpan data dalam memori saat ekstensi dimuat. Penyimpanan akan dihapus jika ekstensi dinonaktifkan, dimuat ulang, atau diupdate, dan saat browser dimulai ulang. Secara default, API ini tidak diekspos ke skrip konten, tetapi perilaku ini dapat diubah dengan memanggil
chrome.storage.session.setAccessLevel()
. Batas penyimpanan adalah 10 MB (1 MB di Chrome 111 dan yang lebih lama). Antarmukastorage.session
adalah salah satu dari beberapa antarmuka yang kami rekomendasikan untuk pekerja layanan. storage.sync
- Jika sinkronisasi diaktifkan, data akan disinkronkan ke browser Chrome tempat pengguna login. Jika dinonaktifkan, perilakunya seperti
storage.local
. Chrome menyimpan data secara lokal saat browser offline dan melanjutkan sinkronisasi saat browser kembali online. Batasan kuota sekitar 100 KB, 8 KB per item. Sebaiknya gunakanstorage.sync
untuk mempertahankan setelan pengguna di seluruh browser yang disinkronkan. Jika Anda menangani data pengguna sensitif, gunakanstorage.session
. Secara default,storage.sync
diekspos ke skrip konten, tetapi perilaku ini dapat diubah dengan memanggilchrome.storage.sync.setAccessLevel()
.
Batas penyimpanan dan pembatasan
Storage API memiliki batasan penggunaan berikut:
- Penyimpanan data sering kali menimbulkan biaya performa, dan API mencakup kuota penyimpanan. Sebaiknya berhati-hatilah dengan data yang Anda simpan agar Anda tidak kehilangan kemampuan untuk menyimpan data.
- Penyimpanan dapat memerlukan waktu untuk diselesaikan. Pastikan untuk menyusun kode Anda untuk memperhitungkan waktu tersebut.
Untuk mengetahui detail tentang batasan area penyimpanan dan apa yang terjadi jika batas tersebut terlampaui, lihat informasi kuota untuk sync
, local
, dan session
.
Kasus penggunaan
Bagian berikut menunjukkan kasus penggunaan umum untuk Storage API.
Merespons pembaruan penyimpanan
Untuk melacak perubahan yang dilakukan pada penyimpanan, tambahkan pemroses ke peristiwa onChanged
-nya. Saat ada perubahan di penyimpanan, peristiwa tersebut akan diaktifkan. Kode contoh memantau perubahan ini:
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}".`
);
}
});
Kita bisa mengembangkan ide ini lebih jauh. Dalam contoh ini, kita memiliki halaman opsi yang
memungkinkan pengguna mengaktifkan/menonaktifkan "mode debug" (implementasi tidak ditampilkan di sini). Halaman opsi akan segera menyimpan setelan baru ke storage.sync
, dan pekerja layanan menggunakan storage.onChanged
untuk menerapkan setelan sesegera mungkin.
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);
}
});
Pemuatan awal asinkron dari penyimpanan
Karena pekerja layanan tidak selalu berjalan, ekstensi Manifest V3 terkadang perlu memuat data dari penyimpanan secara asinkron sebelum mengeksekusi pengendali peristiwanya. Untuk melakukannya, cuplikan
berikut menggunakan pengendali peristiwa action.onClicked
asinkron yang menunggu storageCache
global diisi sebelum menjalankan logikanya.
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);
});
DevTools
Anda dapat melihat dan mengedit data yang disimpan menggunakan API di DevTools. Untuk mempelajari lebih lanjut, lihat halaman Melihat dan mengedit penyimpanan ekstensi di dokumentasi DevTools.
Contoh
Contoh berikut menunjukkan area penyimpanan local
, sync
, dan
session
:
Lokal
chrome.storage.local.set({ key: value }).then(() => {
console.log("Value is set");
});
chrome.storage.local.get(["key"]).then((result) => {
console.log("Value is " + result.key);
});
Sinkronisasi
chrome.storage.sync.set({ key: value }).then(() => {
console.log("Value is set");
});
chrome.storage.sync.get(["key"]).then((result) => {
console.log("Value is " + result.key);
});
Sesi
chrome.storage.session.set({ key: value }).then(() => {
console.log("Value was set");
});
chrome.storage.session.get(["key"]).then((result) => {
console.log("Value is " + result.key);
});
Untuk melihat demo lain dari Storage API, jelajahi salah satu contoh berikut:
Jenis
AccessLevel
Tingkat akses area penyimpanan.
Enum
"TRUSTED_CONTEXTS"
Menentukan konteks yang berasal dari ekstensi itu sendiri.
"TRUSTED_AND_UNTRUSTED_CONTEXTS"
Menentukan konteks yang berasal dari luar ekstensi.
StorageArea
Properti
-
onChanged
Event<functionvoidvoid>
Chrome 73+Diaktifkan saat satu atau beberapa item berubah.
Fungsi
onChanged.addListener
akan terlihat seperti:(callback: function) => {...}
-
callback
fungsi
Parameter
callback
terlihat seperti:(changes: object) => void
-
perubahan
objek
-
-
-
hapus
void
JanjiMenghapus semua item dari penyimpanan.
Fungsi
clear
akan terlihat seperti:(callback?: function) => {...}
-
callback
fungsi opsional
Parameter
callback
terlihat seperti:() => void
-
return
Promise<void>
Chrome 95+Promise didukung di Manifest V3 dan yang lebih baru, tetapi callback disediakan untuk kompatibilitas mundur. Anda tidak dapat menggunakan keduanya pada panggilan fungsi yang sama. Promise di-resolve dengan jenis yang sama yang diteruskan ke callback.
-
-
get
void
JanjiMendapatkan satu atau beberapa item dari penyimpanan.
Fungsi
get
akan terlihat seperti:(keys?: string | string[] | object, callback?: function) => {...}
-
kunci
string | string[] | object opsional
Satu kunci yang akan diambil, daftar kunci yang akan diambil, atau kamus yang menentukan nilai default (lihat deskripsi objek). Daftar atau objek kosong akan menampilkan objek hasil kosong. Teruskan
null
untuk mendapatkan seluruh konten penyimpanan. -
callback
fungsi opsional
Parameter
callback
terlihat seperti:(items: object) => void
-
item
objek
Objek dengan item dalam pemetaan nilai kuncinya.
-
-
return
Promise<object>
Chrome 95+Promise didukung di Manifest V3 dan yang lebih baru, tetapi callback disediakan untuk kompatibilitas mundur. Anda tidak dapat menggunakan keduanya pada panggilan fungsi yang sama. Promise di-resolve dengan jenis yang sama yang diteruskan ke callback.
-
-
getBytesInUse
void
JanjiMendapatkan jumlah ruang (dalam byte) yang digunakan oleh satu atau beberapa item.
Fungsi
getBytesInUse
akan terlihat seperti:(keys?: string | string[], callback?: function) => {...}
-
kunci
string | string[] opsional
Satu kunci atau daftar kunci untuk mendapatkan total penggunaan. Daftar kosong akan menampilkan 0. Teruskan
null
untuk mendapatkan total penggunaan semua penyimpanan. -
callback
fungsi opsional
Parameter
callback
terlihat seperti:(bytesInUse: number) => void
-
bytesInUse
angka
Jumlah ruang yang digunakan dalam penyimpanan, dalam byte.
-
-
return
Promise<number>
Chrome 95+Promise didukung di Manifest V3 dan yang lebih baru, tetapi callback disediakan untuk kompatibilitas mundur. Anda tidak dapat menggunakan keduanya pada panggilan fungsi yang sama. Promise di-resolve dengan jenis yang sama yang diteruskan ke callback.
-
-
getKeys
void
Promise Chrome 130+Mendapatkan semua kunci dari penyimpanan.
Fungsi
getKeys
akan terlihat seperti:(callback?: function) => {...}
-
callback
fungsi opsional
Parameter
callback
terlihat seperti:(keys: string[]) => void
-
kunci
string[]
Array dengan kunci yang dibaca dari penyimpanan.
-
-
return
Promise<string[]>
Promise didukung di Manifest V3 dan yang lebih baru, tetapi callback disediakan untuk kompatibilitas mundur. Anda tidak dapat menggunakan keduanya pada panggilan fungsi yang sama. Promise di-resolve dengan jenis yang sama yang diteruskan ke callback.
-
-
hapus
void
JanjiMenghapus satu atau beberapa item dari penyimpanan.
Fungsi
remove
akan terlihat seperti:(keys: string | string[], callback?: function) => {...}
-
kunci
string | string[]
Satu kunci atau daftar kunci untuk item yang akan dihapus.
-
callback
fungsi opsional
Parameter
callback
terlihat seperti:() => void
-
return
Promise<void>
Chrome 95+Promise didukung di Manifest V3 dan yang lebih baru, tetapi callback disediakan untuk kompatibilitas mundur. Anda tidak dapat menggunakan keduanya pada panggilan fungsi yang sama. Promise di-resolve dengan jenis yang sama yang diteruskan ke callback.
-
-
tetapkan
void
JanjiMenetapkan beberapa item.
Fungsi
set
akan terlihat seperti:(items: object, callback?: function) => {...}
-
item
objek
Objek yang memberikan setiap key-value pair untuk memperbarui penyimpanan. Pasangan nilai/kunci lainnya dalam penyimpanan tidak akan terpengaruh.
Nilai primitif seperti angka akan diserialisasi seperti yang diharapkan. Nilai dengan
typeof
"object"
dan"function"
biasanya akan diserialisasi ke{}
, kecualiArray
(diserialisasi seperti yang diharapkan),Date
, danRegex
(diserialisasi menggunakan representasiString
-nya). -
callback
fungsi opsional
Parameter
callback
terlihat seperti:() => void
-
return
Promise<void>
Chrome 95+Promise didukung di Manifest V3 dan yang lebih baru, tetapi callback disediakan untuk kompatibilitas mundur. Anda tidak dapat menggunakan keduanya pada panggilan fungsi yang sama. Promise di-resolve dengan jenis yang sama yang diteruskan ke callback.
-
-
setAccessLevel
void
Promise Chrome 102+Menetapkan tingkat akses yang diinginkan untuk area penyimpanan. Secara default, penyimpanan
session
dibatasi untuk konteks tepercaya (halaman ekstensi dan pekerja layanan), sementara penyimpananlocal
dansync
mengizinkan akses dari konteks tepercaya dan tidak tepercaya.Fungsi
setAccessLevel
akan terlihat seperti:(accessOptions: object, callback?: function) => {...}
-
accessOptions
objek
-
accessLevel
Tingkat akses area penyimpanan.
-
-
callback
fungsi opsional
Parameter
callback
terlihat seperti:() => void
-
return
Promise<void>
Promise didukung di Manifest V3 dan yang lebih baru, tetapi callback disediakan untuk kompatibilitas mundur. Anda tidak dapat menggunakan keduanya pada panggilan fungsi yang sama. Promise di-resolve dengan jenis yang sama yang diteruskan ke callback.
-
StorageChange
Properti
-
newValue
opsional
Nilai baru item, jika ada nilai baru.
-
oldValue
opsional
Nilai lama item, jika ada nilai lama.
Properti
local
Item di area penyimpanan local
bersifat lokal untuk setiap komputer.
Jenis
StorageArea & objek
Properti
-
QUOTA_BYTES
10485760
Jumlah maksimum data (dalam byte) yang dapat disimpan di penyimpanan lokal, sebagaimana diukur oleh stringifikasi JSON dari setiap nilai ditambah panjang setiap kunci. Nilai ini akan diabaikan jika ekstensi memiliki izin
unlimitedStorage
. Update yang akan menyebabkan batas ini terlampaui akan langsung gagal dan menetapkanruntime.lastError
saat menggunakan callback, atau Promise yang ditolak jika menggunakan async/await.
managed
Item di area penyimpanan managed
ditetapkan oleh kebijakan perusahaan yang dikonfigurasi oleh administrator domain, dan bersifat hanya baca untuk ekstensi; mencoba mengubah namespace ini akan menghasilkan error. Untuk mengetahui informasi tentang cara mengonfigurasi kebijakan, lihat Manifes untuk area penyimpanan.
Jenis
session
Item di area penyimpanan session
disimpan dalam memori dan tidak akan dipertahankan ke disk.
Jenis
StorageArea & objek
Properti
-
QUOTA_BYTES
10485760
Jumlah maksimum data (dalam byte) yang dapat disimpan dalam memori, sebagaimana diukur dengan memperkirakan penggunaan memori yang dialokasikan secara dinamis dari setiap nilai dan kunci. Update yang akan menyebabkan batas ini terlampaui akan langsung gagal dan menetapkan
runtime.lastError
saat menggunakan callback, atau saat Promise ditolak.
sync
Item di area penyimpanan sync
disinkronkan menggunakan Sinkronisasi Chrome.
Jenis
StorageArea & objek
Properti
-
MAX_ITEMS
512
Jumlah maksimum item yang dapat disimpan di penyimpanan sinkronisasi. Update yang akan menyebabkan batas ini terlampaui akan langsung gagal dan menetapkan
runtime.lastError
saat menggunakan callback, atau saat Promise ditolak. -
MAX_SUSTAINED_WRITE_OPERATIONS_PER_MINUTE
1000000
Tidak digunakan lagiAPI storage.sync tidak lagi memiliki kuota operasi tulis berkelanjutan.
-
MAX_WRITE_OPERATIONS_PER_HOUR
1800
Jumlah maksimum operasi
set
,remove
, atauclear
yang dapat dilakukan setiap jam. Nilainya adalah 1 setiap 2 detik, yang merupakan batas atas yang lebih rendah daripada batas tulis per menit yang lebih tinggi dalam jangka pendek.Update yang akan menyebabkan batas ini terlampaui akan langsung gagal dan menetapkan
runtime.lastError
saat menggunakan callback, atau saat Promise ditolak. -
MAX_WRITE_OPERATIONS_PER_MINUTE
120
Jumlah maksimum operasi
set
,remove
, atauclear
yang dapat dilakukan setiap menit. Ini adalah 2 per detik, yang memberikan throughput lebih tinggi daripada penulisan per jam dalam jangka waktu yang lebih singkat.Update yang akan menyebabkan batas ini terlampaui akan langsung gagal dan menetapkan
runtime.lastError
saat menggunakan callback, atau saat Promise ditolak. -
QUOTA_BYTES
102400
Jumlah total maksimum (dalam byte) data yang dapat disimpan di penyimpanan sinkronisasi, sebagaimana diukur oleh stringifikasi JSON setiap nilai ditambah panjang setiap kunci. Update yang akan menyebabkan batas ini terlampaui akan langsung gagal dan menetapkan
runtime.lastError
saat menggunakan callback, atau saat Promise ditolak. -
QUOTA_BYTES_PER_ITEM
8192
Ukuran maksimum (dalam byte) setiap item individual dalam penyimpanan sinkron, sebagaimana diukur oleh stringifikasi JSON dari nilainya ditambah panjang kuncinya. Update yang berisi item yang lebih besar dari batas ini akan langsung gagal dan menetapkan
runtime.lastError
saat menggunakan callback, atau saat Promise ditolak.
Acara
onChanged
chrome.storage.onChanged.addListener(
callback: function,
)
Diaktifkan saat satu atau beberapa item berubah.
Parameter
-
callback
fungsi
Parameter
callback
terlihat seperti:(changes: object, areaName: string) => void
-
perubahan
objek
-
areaName
string
-