Opis
Interfejs API chrome.storage
służy do przechowywania, pobierania i śledzenia zmian w danych użytkownika.
Uprawnienia
storage
Aby korzystać z interfejsu Storage API, zadeklaruj w rozszerzeniu uprawnienia "storage"
manifestu. Na przykład:
{
"name": "My extension",
...
"permissions": [
"storage"
],
...
}
Pojęcia i wykorzystanie
Interfejs Storage API zapewnia sposób zachowywania danych i stanu użytkownika specyficzny dla rozszerzenia. Przypomina on interfejsy API do przechowywania danych na platformie internetowej (IndexedDB i Storage), ale został zaprojektowany tak, aby zaspokajać potrzeby rozszerzeń w zakresie miejsca na dane. Oto kilka najważniejszych cech:
- Wszystkie konteksty rozszerzeń, w tym skrypt usługi rozszerzenia i skrypty treści, mają dostęp do interfejsu Storage API.
- Serializowane wartości JSON są przechowywane jako właściwości obiektu.
- Interfejs Storage API jest asynchroniczny ze zbiorczymi operacjami odczytu i zapisu.
- Nawet jeśli użytkownik wyczyści pamięć podręczną i historię przeglądania, dane pozostaną zapisane.
- Zapisane ustawienia są zachowywane nawet podczas korzystania z podziału trybu incognito.
- Obejmuje ekskluzywne zarządzane miejsce na dysku przeznaczone tylko do odczytu na zasady przedsiębiorstwa.
Czy rozszerzenia mogą korzystać z interfejsów Web Storage API?
Rozszerzenia mogą korzystać z interfejsu Storage
(dostępnego z window.localStorage
) w niektórych kontekstach (wyskakujących okienkach i innych stronach HTML), nie zalecamy jednak tego z tych powodów:
- Instancje robocze usługi rozszerzeń nie mogą używać interfejsu Web Storage API.
- Skrypty treści współdzielą miejsce na dane ze stroną hostującą.
- Dane zapisane przez Web Storage API zostają utracone, gdy użytkownik wyczyści historię przeglądania.
Aby przenieść dane z interfejsów Web Storage API do interfejsów API pamięci rozszerzenia z skryptu service worker:
- Przygotuj stronę html i plik skryptu poza ekranem dokumentu. Plik skryptu powinien zawierać rutynę konwersji i moduł obsługi
onMessage
. - W skrypcie service worker rozszerzenia sprawdź swoje dane w usłudze
chrome.storage
. - Jeśli nie uda się znaleźć danych, zadzwoń pod numer
createDocument()
. - Po zrealizowaniu zwrotu wywołaj metodę
sendMessage()
, aby rozpocząć rutynę konwersji. - W module obsługi
onMessage
dokumentu poza ekranem wywołaj rutynę konwersji.
Istnieją też pewne niuanse w działaniu interfejsów API do przechowywania danych w internecie w rozszerzeniach. Więcej informacji: Miejsce na dane i pliki cookie.
Miejsca przechowywania
Interfejs Storage API jest podzielony na te obszary pamięci masowej:
storage.local
- Dane są przechowywane lokalnie i są usuwane po usunięciu rozszerzenia. Limit miejsca na dane wynosi 10 MB (5 MB w Chrome w wersji 113 i starszych), ale można go zwiększyć, prosząc o uprawnienie
"unlimitedStorage"
. Do przechowywania większych ilości danych zalecamy używanie funkcjistorage.local
. storage.managed
- Zarządzane miejsce na dane to miejsce tylko do odczytu dla rozszerzeń zainstalowanych za pomocą zasad i zarządzane przez administratorów systemu przy użyciu schematu zdefiniowanego przez programistę i zasad firmowych. Zasady są podobne do opcji, ale są konfigurowane przez administratora systemu, a nie przez użytkownika, dzięki czemu można wstępnie skonfigurować rozszerzenie dla wszystkich użytkowników w organizacji. Informacje o zasadach znajdziesz w dokumentacji dla administratorów. Więcej informacji o miejscu do przechowywania danych w usłudze
managed
znajdziesz w pliku manifestu dotyczącego obszarów przechowywania. storage.session
- Przechowuje dane w pamięci na czas sesji przeglądarki. Domyślnie nie jest on widoczny dla skryptów treści, ale można to zmienić, ustawiając zasadę
chrome.storage.session.setAccessLevel()
. Limit miejsca na dane wynosi 10 MB (1 MB w Chrome w wersji 111 i starszych). Interfejsstorage.session
jest jednym z kilku zalecanych dla mechanizmów Service Worker. storage.sync
- Jeśli włączona jest synchronizacja, dane są synchronizowane z dowolną przeglądarką Chrome, w której użytkownik jest zalogowany. Jeśli jest wyłączona, działa tak jak
storage.local
. Chrome zapisuje dane lokalnie, gdy przeglądarka jest offline, i wznawia synchronizację po powrocie do trybu online. Maksymalny limit wynosi około 100 KB i 8 KB na element. Zalecamy używanie zasadystorage.sync
, aby zachować ustawienia użytkownika w zsynchronizowanych przeglądarkach. Jeśli masz do czynienia z poufnymi danymi użytkownika, zamiast tego użyj zasadystorage.session
.
Limity miejsca na dane i ograniczania
Interfejs Storage API ma te ograniczenia wykorzystania:
- Przechowywanie danych często wiąże się z kosztami związanymi z wydajnością, a interfejs API uwzględnia limity miejsca na dane. Zalecamy rozważenie wyboru przechowywanych danych, aby nie utracić ich możliwości.
- Przechowywanie danych może trochę potrwać. Dopracuj strukturę kodu, by uwzględnić ten czas.
Szczegółowe informacje na temat ograniczeń miejsca na dane oraz tego, co się dzieje po jego przekroczeniu, znajdziesz w informacjach o limitach dla sync
, local
i session
.
Przypadki użycia
W sekcjach poniżej znajdziesz typowe przypadki użycia interfejsu Storage API.
Synchroniczna odpowiedź na aktualizacje miejsca na dane
Aby śledzić zmiany wprowadzone w miejscu na dane, dodaj detektor do zdarzenia onChanged
. Zdarzenie to uruchamia się, gdy cokolwiek zmieni się w pamięci masowej. Przykładowy kod nasłuchuje tych zmian:
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}".`
);
}
});
Możemy pójść o krok dalej. W tym przykładzie mamy stronę opcji, na której
umożliwia użytkownikowi włączenie „trybu debugowania” (implementacja nie jest tutaj przedstawiona). Strona opcji natychmiast zapisze nowe ustawienia w storage.sync
, a skrypcja service worker jak najszybciej stosuje je za pomocą storage.onChanged
.
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);
}
});
Asynchroniczne wczytywanie z pamięci masowej
Skrypty service worker nie działają cały czas, dlatego rozszerzenia na platformie Manifest V3 czasem muszą
asynchronicznie ładować dane z pamięci przed wykonaniem przez nich modułów obsługi zdarzeń. W tym celu
ten fragment kodu używa asynchronicznego modułu obsługi zdarzenia action.onClicked
, który czeka na storageCache
globalny do zapełnienia przed wykonaniem jej logiki.
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);
});
Przykłady
Poniższe przykłady przedstawiają local
, sync
oraz
session
miejsca przechowywania:
Lokalne
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);
});
Synchronizacja
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);
});
Sesja
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);
});
Aby zobaczyć inne wersje demonstracyjne interfejsu Storage API, zapoznaj się z każdym z tych przykładów:
Typy
AccessLevel
Poziom dostępu do miejsca na dane.
Typ wyliczeniowy
"TRUSTED_CONTEXTS"
Określa konteksty pochodzące z samego rozszerzenia.
"TRUSTED_AND_UNTRUSTED_CONTEXTS"
Określa konteksty pochodzące spoza rozszerzenia.
StorageArea
Właściwości
-
onChanged
Zdarzenie<functionvoid>
Chrome w wersji 73 i nowszych .Uruchamiane po zmianie co najmniej jednego elementu.
Funkcja
onChanged.addListener
wygląda tak:(callback: function) => {...}
.-
wywołanie zwrotne
funkcja
Parametr
callback
wygląda tak:(changes: object) => void
.-
Zmiany
Obiekt
-
-
-
wyczyść
nieważne
Obietnica .Usuwa wszystkie elementy z pamięci.
Funkcja
clear
wygląda tak:(callback?: function) => {...}
.-
wywołanie zwrotne
funkcja optional
Parametr
callback
wygląda tak:() => void
.
-
returns
Obietnica<void>
Chrome 88 i nowsze .Obietnice są obsługiwane w Manifest V3 i nowszych, ale wywołania zwrotne są podane w przypadku zgodność wsteczną. Nie można użyć obu w tym samym wywołaniu funkcji. Polecenie promowana jest realizowane z tym samym typem, który jest przekazywany do wywołania zwrotnego.
-
-
get
nieważne
Obietnica .Pobiera co najmniej 1 element z miejsca na dane.
Funkcja
get
wygląda tak:(keys?: string | string[] | object, callback?: function) => {...}
.-
klucze
string | string[] | obiekt opcjonalny
Pojedynczy klucz do pobrania, lista kluczy do pobrania lub słownik określający wartości domyślne (zobacz opis obiektu). Pusta lista lub obiekt zwróci pusty obiekt wyniku. Podaj
null
, aby uzyskać dostęp do całej zawartości miejsca na dane. -
wywołanie zwrotne
funkcja optional
Parametr
callback
wygląda tak:(items: object) => void
.-
items
Obiekt
Obiekt z elementami w mapowaniu par klucz-wartość.
-
-
returns
Promise<object>
Chrome 88 i nowsze .Obietnice są obsługiwane w Manifest V3 i nowszych, ale wywołania zwrotne są podane w przypadku zgodność wsteczną. Nie można użyć obu w tym samym wywołaniu funkcji. Polecenie promowana jest realizowane z tym samym typem, który jest przekazywany do wywołania zwrotnego.
-
-
getBytesInUse
nieważne
Obietnica .Pobiera ilość miejsca (w bajtach) zajętego przez co najmniej 1 element.
Funkcja
getBytesInUse
wygląda tak:(keys?: string | string[], callback?: function) => {...}
.-
klucze
string | string[] opcjonalnie
Pojedynczy klucz lub lista kluczy do pobrania łącznego wykorzystania. Pusta lista zwraca 0. Przekaż
null
, aby uzyskać całkowite wykorzystanie całego miejsca na dane. -
wywołanie zwrotne
funkcja optional
Parametr
callback
wygląda tak:(bytesInUse: number) => void
.-
bytesInUse
liczba
Ilość miejsca wykorzystywanego w pamięci (w bajtach).
-
-
returns
Promise<number>
Chrome 88 i nowsze .Obietnice są obsługiwane w Manifest V3 i nowszych, ale wywołania zwrotne są podane w przypadku zgodność wsteczną. Nie można użyć obu w tym samym wywołaniu funkcji. Polecenie promowana jest realizowane z tym samym typem, który jest przekazywany do wywołania zwrotnego.
-
-
getKeys,
nieważne
Obietnica OczekującyPobiera wszystkie klucze z pamięci.
Funkcja
getKeys
wygląda tak:(callback?: function) => {...}
.-
wywołanie zwrotne
funkcja optional
Parametr
callback
wygląda tak:(keys: string[]) => void
.-
klucze
ciąg znaków[]
Tablica z kluczami odczytywanymi z pamięci masowej.
-
-
returns
Promise<string[]>
Obietnice są obsługiwane w Manifest V3 i nowszych, ale wywołania zwrotne są podane w przypadku zgodność wsteczną. Nie można użyć obu w tym samym wywołaniu funkcji. Polecenie promowana jest realizowane z tym samym typem, który jest przekazywany do wywołania zwrotnego.
-
-
usuń
nieważne
Obietnica .Usuwa co najmniej 1 element z pamięci.
Funkcja
remove
wygląda tak:(keys: string | string[], callback?: function) => {...}
.-
klucze
string | ciąg znaków[]
Pojedynczy klucz lub lista kluczy dla elementów do usunięcia.
-
wywołanie zwrotne
funkcja optional
Parametr
callback
wygląda tak:() => void
.
-
returns
Obietnica<void>
Chrome 88 i nowsze .Obietnice są obsługiwane w Manifest V3 i nowszych, ale wywołania zwrotne są podane w przypadku zgodność wsteczną. Nie można użyć obu w tym samym wywołaniu funkcji. Polecenie promowana jest realizowane z tym samym typem, który jest przekazywany do wywołania zwrotnego.
-
-
zestaw
nieważne
Obietnica .Ustawia wiele elementów.
Funkcja
set
wygląda tak:(items: object, callback?: function) => {...}
.-
items
Obiekt
Obiekt, który udostępnia każdą parę klucz-wartość, której ma używać aktualizacja pamięci. Nie będzie to miało wpływu na inne pary klucz-wartość przechowywane w pamięci.
Wartości podstawowe, takie jak liczby, zostaną zserializowane zgodnie z oczekiwaniami. Wartości z
typeof
"object"
i"function"
będą zwykle serializowane do{}
, z wyjątkiemArray
(serializuje zgodnie z oczekiwaniami),Date
iRegex
(zserializuje z użyciem ich reprezentacjiString
). -
wywołanie zwrotne
funkcja optional
Parametr
callback
wygląda tak:() => void
.
-
returns
Obietnica<void>
Chrome 88 i nowsze .Obietnice są obsługiwane w Manifest V3 i nowszych, ale wywołania zwrotne są podane w przypadku zgodność wsteczną. Nie można użyć obu w tym samym wywołaniu funkcji. Polecenie promowana jest realizowane z tym samym typem, który jest przekazywany do wywołania zwrotnego.
-
-
setAccessLevel
nieważne
Obietnica Chrome w wersji 102 lub nowszejOkreśla odpowiedni poziom dostępu do obszaru przechowywania. Domyślnie będą to tylko zaufane konteksty.
Funkcja
setAccessLevel
wygląda tak:(accessOptions: object, callback?: function) => {...}
.-
accessOptions
Obiekt
-
accessLevel
Poziom dostępu do miejsca na dane.
-
-
wywołanie zwrotne
funkcja optional
Parametr
callback
wygląda tak:() => void
.
-
returns
Obietnica<void>
Obietnice są obsługiwane w Manifest V3 i nowszych, ale wywołania zwrotne są podane w przypadku zgodność wsteczną. Nie można użyć obu w tym samym wywołaniu funkcji. Polecenie promowana jest realizowane z tym samym typem, który jest przekazywany do wywołania zwrotnego.
-
StorageChange
Właściwości
-
newValue
dowolne opcjonalne
Nowa wartość elementu, jeśli występuje nowa wartość.
-
oldValue
dowolne opcjonalne
Stara wartość elementu (jeśli była taka sama).
Właściwości
local
Elementy w obszarze pamięci local
są lokalne dla każdego komputera.
Typ
StorageArea obiekt
Właściwości
-
QUOTA_BYTES
10485760
Maksymalna ilość (w bajtach) danych, które można przechowywać w pamięci lokalnej, mierzona za pomocą ciągu znaków JSON dla każdej wartości i długości każdego klucza. Jeśli rozszerzenie ma uprawnienie
unlimitedStorage
, ta wartość zostanie zignorowana. Aktualizacje, które spowodowałyby przekroczenie tego limitu, natychmiast kończą się niepowodzeniem i ustawiająruntime.lastError
w przypadku używania wywołania zwrotnego lub odrzuconej obietnicy (async/await).
managed
Elementy w obszarze miejsca na dane managed
są ustawiane przez zasady przedsiębiorstwa skonfigurowane przez administratora domeny i są dostępne tylko do odczytu rozszerzenia. próba zmodyfikowania tej przestrzeni nazw powoduje błąd. Więcej informacji o konfigurowaniu zasad znajdziesz w artykule Plik manifestu dla obszarów przechowywania.
Typ
session
Elementy w obszarze przechowywania session
są przechowywane w pamięci i nie zostaną zachowane na dysku.
Typ
StorageArea obiekt
Właściwości
-
QUOTA_BYTES
10485760
Maksymalna ilość (w bajtach) danych, które mogą być przechowywane w pamięci, mierzona przez oszacowanie dynamicznie przydzielanego wykorzystania pamięci dla każdej wartości i klucza. Aktualizacje, które spowodowałyby przekroczenie tego limitu, natychmiast kończą się niepowodzeniem i ustawiają
runtime.lastError
, gdy używasz wywołania zwrotnego lub obietnicy odrzucasz.
sync
Elementy w obszarze pamięci sync
są synchronizowane przy użyciu Synchronizacji Chrome.
Typ
StorageArea obiekt
Właściwości
-
MAX_ITEMS
512
Maksymalna liczba elementów, które można przechowywać w pamięci synchronizacji. Aktualizacje, które spowodowałyby przekroczenie tego limitu, zostaną natychmiast zakończone niepowodzeniem i ustawionym
runtime.lastError
przy użyciu wywołania zwrotnego lub w przypadku odrzucenia obietnicy. -
MAX_SUSTAINED_WRITE_OPERATIONS_PER_MINUTE
1000000
WycofanoInterfejs storage.sync API nie ma już limitu operacji długotrwałego zapisu.
-
MAX_WRITE_OPERATIONS_PER_HOUR
1800
Maksymalna liczba operacji
set
,remove
lubclear
, które można wykonać w każdej godzinie. Jest to 1 na 2 sekundy, czyli niższy pułap niż krótkoterminowy wyższy limit zapisu na minutę.Aktualizacje, które spowodowałyby przekroczenie tego limitu, natychmiast kończą się niepowodzeniem i ustawiają
runtime.lastError
, gdy używasz wywołania zwrotnego lub obietnicy odrzucasz. -
MAX_WRITE_OPERATIONS_PER_MINUTE
120
Maksymalna liczba operacji
set
,remove
lubclear
, które można wykonać na minutę. Jest to 2 na sekundę, co zapewnia większą przepustowość niż zapisy na godzinę w krótszym czasie.Aktualizacje, które spowodowałyby przekroczenie tego limitu, natychmiast kończą się niepowodzeniem i ustawiają
runtime.lastError
, gdy używasz wywołania zwrotnego lub obietnicy odrzucasz. -
QUOTA_BYTES
102400
Maksymalna łączna ilość (w bajtach) danych, które mogą być przechowywane w pamięci synchronizacji, mierzona za pomocą ciągu znaków JSON dla każdej wartości i długości każdego klucza. Aktualizacje, które spowodowałyby przekroczenie tego limitu, natychmiast kończą się niepowodzeniem i ustawiają
runtime.lastError
, gdy używasz wywołania zwrotnego lub obietnicy odrzucasz. -
QUOTA_BYTES_PER_ITEM
8192
Maksymalny rozmiar (w bajtach) każdego elementu w pamięci synchronizacji mierzony za pomocą ciągu znaków JSON jego wartości i długości klucza. Aktualizacje zawierające elementy przekraczające ten limit zostaną natychmiast zakończone niepowodzeniem i zostaną ustawione
runtime.lastError
, jeśli używasz wywołania zwrotnego lub obietnicy zostaną odrzucone.
Wydarzenia
onChanged
chrome.storage.onChanged.addListener(
callback: function,
)
Uruchamiane po zmianie co najmniej jednego elementu.
Parametry
-
wywołanie zwrotne
funkcja
Parametr
callback
wygląda tak:(changes: object, areaName: string) => void
.-
Zmiany
Obiekt
-
areaName
ciąg znaków
-