Beschreibung
Mit der chrome.storage
API können Sie Änderungen an Nutzerdaten speichern, abrufen und nachverfolgen.
Berechtigungen
storage
Übersicht
Die Storage API bietet eine Erweiterungsspezifische Möglichkeit, Nutzerdaten und den Status zu speichern. Sie ähnelt den Speicher-APIs der Webplattform (IndexedDB und Storage), wurde jedoch entwickelt, um die Speicheranforderungen von Erweiterungen zu erfüllen. Hier sind einige wichtige Funktionen:
- Alle Erweiterungskontexte, einschließlich des Dienst-Workers und der Inhaltsscripts der Erweiterung, haben Zugriff auf die Storage API.
- Die JSON-serialisierbaren Werte werden als Objekteigenschaften gespeichert.
- Die Storage API ist asynchron und unterstützt Bulk-Lese- und -Schreibvorgänge.
- Auch wenn der Nutzer den Cache und den Browserverlauf löscht, bleiben die Daten erhalten.
- Gespeicherte Einstellungen bleiben auch bei Verwendung des geteilten Inkognitomodus erhalten.
- Enthält einen exklusiven schreibgeschützten verwalteten Speicherbereich für Unternehmensrichtlinien.
Erweiterungen können die [Storage
][mdn-storage]-Oberfläche (über window.localStorage
zugänglich) in einigen Kontexten (Pop-up und andere HTML-Seiten) verwenden. Dies wird jedoch aus folgenden Gründen nicht empfohlen:
- Der Dienst-Worker der Erweiterung kann nicht auf
Storage
zugreifen. - Inhaltsscripts teilen sich den Speicherplatz mit der Hostseite.
- Daten, die über die
Storage
-Oberfläche gespeichert wurden, gehen verloren, wenn der Nutzer seinen Browserverlauf löscht.
So verschieben Sie Daten aus einem Service Worker von Webspeicher-APIs zu Erweiterungsspeicher-APIs:
- Erstellen Sie ein Offscreen-Dokument mit einer Conversion-Routine und einem [
onMessage
][on-message]-Handler. - Fügen Sie einem nicht sichtbaren Dokument eine Conversion-Routine hinzu.
- Prüfen Sie im Erweiterungs-Dienst-Worker, ob
chrome.storage
Ihre Daten enthält. - Wenn die Daten nicht gefunden werden, [create][create-offscreen] ein Offscreen-Dokument und rufe [
sendMessage()
][send-message] auf, um die Konvertierungsroutine zu starten. - Rufen Sie die Conversion-Routine im
onMessage
-Handler des Offscreen-Dokuments auf.
Außerdem gibt es einige Nuancen bei der Funktionsweise von Webspeicher-APIs in Erweiterungen. Weitere Informationen finden Sie im Artikel [Speicher und Cookies][storage-and-cookies].
Lagerflächen
Die Storage API ist in die folgenden vier Kategorien („Speicherbereiche“) unterteilt:
storage.local
- Die Daten werden lokal gespeichert und gelöscht, wenn die Erweiterung entfernt wird. Das Kontingentlimit beträgt etwa 10 MB, kann aber durch Anfordern der Berechtigung
"unlimitedStorage"
erhöht werden. Sie eignet sich zum Speichern größerer Datenmengen.
storage.sync
- Wenn die Synchronisierung aktiviert ist, werden die Daten mit jedem Chrome-Browser synchronisiert, in dem der Nutzer angemeldet ist. Wenn sie deaktiviert ist, verhält sie sich wie
storage.local
. Chrome speichert die Daten lokal, wenn der Browser offline ist, und setzt die Synchronisierung fort, sobald er wieder online ist. Das Kontingent ist auf etwa 100 KB begrenzt, also 8 KB pro Artikel. Sie können sie verwenden, um Nutzereinstellungen in synchronisierten Browsern beizubehalten.
- storage.session
- Speichert Daten für die Dauer einer Browsersitzung im Arbeitsspeicher. Standardmäßig ist es nicht für Inhaltsscripts sichtbar. Dieses Verhalten kann jedoch durch Festlegen von
chrome.storage.session.setAccessLevel()
geändert werden. Das Kontingent ist auf etwa 10 MB begrenzt. Sie können sie verwenden, um globale Variablen über mehrere Service Worker-Ausführungen hinweg zu speichern.
- storage.managed
- Administratoren können mithilfe eines Schemas und Unternehmensrichtlinien die Einstellungen einer unterstützenden Erweiterung in einer verwalteten Umgebung konfigurieren. Dieser Speicherbereich ist schreibgeschützt.
Manifest
Wenn Sie die Storage API verwenden möchten, müssen Sie die Berechtigung "storage"
im Manifest der Erweiterung deklarieren. Beispiel:
{
"name": "My extension",
...
"permissions": [
"storage"
],
...
}
Nutzung
In den folgenden Beispielen werden die Speicherbereiche local
, sync
und session
veranschaulicht:
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);
});
Weitere Informationen zum Speicherbereich managed
finden Sie unter Manifest für Speicherbereiche.
Speicher- und Drosselungslimits
Stellen Sie sich die Storage API nicht als großen Lkw vor, in den Sie Dinge einladen. Stellen Sie sich das Hinzufügen von Speicherplatz wie das Einfüllen von etwas in eine Leitung vor. Möglicherweise befindet sich bereits Material in der Leitung und sie ist sogar voll. Gehen Sie immer davon aus, dass zwischen dem Hinzufügen von Daten zum Speicher und dem tatsächlichen Aufzeichnen eine Verzögerung auftritt.
Ausführliche Informationen zu Einschränkungen für Speicherbereiche und zu den Folgen einer Überschreitung finden Sie in den Kontingentinformationen für sync
, local
und session
.
Anwendungsfälle
In den folgenden Abschnitten werden gängige Anwendungsfälle für die Storage API veranschaulicht.
Synchrone Reaktion auf Speicherupdates
Wenn Sie Änderungen am Speicherplatz erfassen möchten, können Sie dem Ereignis onChanged
einen Listener hinzufügen. Wenn sich etwas im Speicher ändert, wird dieses Ereignis ausgelöst. Der Beispielcode überwacht diese Änderungen:
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}".`
);
}
});
Wir können diese Idee noch weiterführen. In diesem Beispiel haben wir eine Optionsseite, auf der der Nutzer den „Debug-Modus“ aktivieren kann (Implementierung hier nicht zu sehen). Die neuen Einstellungen werden auf der Seite mit den Optionen sofort in storage.sync
gespeichert. Der Service Worker verwendet storage.onChanged
, um die Einstellung so schnell wie möglich anzuwenden.
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);
}
});
Asynchrones Vorladen aus dem Speicher
Da Service Worker nicht immer ausgeführt werden, müssen Manifest V3-Erweiterungen manchmal Daten asynchron aus dem Speicher laden, bevor sie ihre Ereignishandler ausführen. Dazu wird im folgenden Snippet ein asynchroner action.onClicked
-Ereignishandler verwendet, der darauf wartet, dass die globale Variable storageCache
ausgefüllt wird, bevor die Logik ausgeführt wird.
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);
});
Beispiele für Erweiterungen
Weitere Demos der Storage API finden Sie in den folgenden Beispielen:
Typen
AccessLevel
Die Zugriffsebene des Speicherbereichs.
Enum
TRUSTED_CONTEXTS
Gibt Kontexte an, die von der Erweiterung selbst stammen.
"TRUSTED_AND_UNTRUSTED_CONTEXTS"
Gibt Kontexte an, die nicht aus der Erweiterung stammen.
StorageArea
Attribute
-
onChanged
Ereignis<functionvoidvoid>
Chrome 73 und höherWird ausgelöst, wenn sich ein oder mehrere Elemente ändern.
Die
onChanged.addListener
-Funktion sieht so aus:(callback: function) => {...}
-
callback
Funktion
Der Parameter
callback
sieht so aus:(changes: object) => void
-
Änderungen
Objekt
-
-
-
löschen
void
PromiseAlle Elemente werden aus dem Speicher entfernt.
Die
clear
-Funktion sieht so aus:(callback?: function) => {...}
-
callback
function optional
Der Parameter
callback
sieht so aus:() => void
-
Gibt zurück
Promise<void>
Chrome 88 und höherVersprechen werden nur für Manifest V3 und höher unterstützt. Auf anderen Plattformen müssen Callbacks verwendet werden.
-
-
get
void
PromiseRuft ein oder mehrere Elemente aus dem Speicher ab.
Die
get
-Funktion sieht so aus:(keys?: string | string[] | object, callback?: function) => {...}
-
Schlüssel
String | String[] | Object optional
Ein einzelner Schlüssel, eine Liste von Schlüsseln oder ein Wörterbuch mit Standardwerten (siehe Beschreibung des Objekts). Eine leere Liste oder ein leeres Objekt geben ein leeres Ergebnisobjekt zurück. Geben Sie
null
ein, um den gesamten Inhalt des Speichers abzurufen. -
callback
function optional
Der Parameter
callback
sieht so aus:(items: object) => void
-
Elemente
Objekt
Objekt mit Elementen in den Schlüssel/Wert-Zuordnungen.
-
-
Gibt zurück
Promise<object>
Chrome 88 und höherVersprechen werden nur für Manifest V3 und höher unterstützt. Auf anderen Plattformen müssen Callbacks verwendet werden.
-
-
getBytesInUse
void
PromiseGibt den Speicherplatz an (in Byte), der von einem oder mehreren Elementen belegt wird.
Die
getBytesInUse
-Funktion sieht so aus:(keys?: string | string[], callback?: function) => {...}
-
Schlüssel
String | String[] optional
Ein einzelner Schlüssel oder eine Liste von Schlüsseln, für die die Gesamtnutzung abgerufen werden soll. Für eine leere Liste wird 0 zurückgegeben. Geben Sie
null
ein, um die Gesamtnutzung des gesamten Speicherplatzes zu erhalten. -
callback
function optional
Der Parameter
callback
sieht so aus:(bytesInUse: number) => void
-
bytesInUse
Zahl
Der im Speicher belegte Speicherplatz in Byte.
-
-
Gibt zurück
Promise<number>
Chrome 88 und höherVersprechen werden nur für Manifest V3 und höher unterstützt. Auf anderen Plattformen müssen Callbacks verwendet werden.
-
-
getKeys
void
Versprechen Chrome 130 und höherRuft alle Schlüssel aus dem Speicher ab.
Die
getKeys
-Funktion sieht so aus:(callback?: function) => {...}
-
callback
function optional
Der Parameter
callback
sieht so aus:(keys: string[]) => void
-
Schlüssel
String[]
Array mit Schlüsseln, die aus dem Speicher gelesen wurden.
-
-
Gibt zurück
Promise<string[]>
Versprechen werden nur für Manifest V3 und höher unterstützt. Auf anderen Plattformen müssen Callbacks verwendet werden.
-
-
Entfernen
void
PromiseEntfernt ein oder mehrere Elemente aus dem Speicher.
Die
remove
-Funktion sieht so aus:(keys: string | string[], callback?: function) => {...}
-
Schlüssel
String | String[]
Ein einzelner Schlüssel oder eine Liste von Schlüsseln für Elemente, die entfernt werden sollen.
-
callback
function optional
Der Parameter
callback
sieht so aus:() => void
-
Gibt zurück
Promise<void>
Chrome 88 und höherVersprechen werden nur für Manifest V3 und höher unterstützt. Auf anderen Plattformen müssen Callbacks verwendet werden.
-
-
set
void
PromiseMehrere Elemente festlegen
Die
set
-Funktion sieht so aus:(items: object, callback?: function) => {...}
-
Elemente
Objekt
Ein Objekt, das für jedes Schlüssel/Wert-Paar einen Wert zum Aktualisieren des Speichers angibt. Andere Schlüssel/Wert-Paare im Speicher sind davon nicht betroffen.
Primäre Werte wie Zahlen werden wie erwartet serialisiert. Werte mit
typeof
,"object"
und"function"
werden in der Regel als{}
serialisiert, mit Ausnahme vonArray
(wie erwartet serialisiert),Date
undRegex
(werden mit ihrerString
-Darstellung serialisiert). -
callback
function optional
Der Parameter
callback
sieht so aus:() => void
-
Gibt zurück
Promise<void>
Chrome 88 und höherVersprechen werden nur für Manifest V3 und höher unterstützt. Auf anderen Plattformen müssen Callbacks verwendet werden.
-
-
setAccessLevel
void
Promise Chrome 102 und höherHier legen Sie die gewünschte Zugriffsebene für den Speicherbereich fest. Standardmäßig werden nur vertrauenswürdige Kontexte berücksichtigt.
Die
setAccessLevel
-Funktion sieht so aus:(accessOptions: object, callback?: function) => {...}
-
accessOptions
Objekt
-
accessLevel
Die Zugriffsebene des Speicherbereichs.
-
-
callback
function optional
Der Parameter
callback
sieht so aus:() => void
-
Gibt zurück
Promise<void>
Versprechen werden nur für Manifest V3 und höher unterstützt. Auf anderen Plattformen müssen Callbacks verwendet werden.
-
StorageChange
Attribute
-
newValue
beliebig optional
Der neue Wert des Artikels, falls vorhanden.
-
oldValue
beliebig optional
Der alte Wert des Artikels, falls vorhanden.
Attribute
local
Elemente im Speicherbereich local
sind lokal auf jedem Computer.
Typ
StorageArea und Objekt
Attribute
-
QUOTA_BYTES
10485760
Die maximale Datenmenge (in Byte), die im lokalen Speicher gespeichert werden kann, gemessen an der JSON-Stringifizierung jedes Werts und der Länge jedes Schlüssels. Dieser Wert wird ignoriert, wenn die Erweiterung die Berechtigung
unlimitedStorage
hat. Updates, die dieses Limit überschreiten würden, schlagen sofort fehl und setzenruntime.lastError
, wenn ein Callback verwendet wird, oder ein abgelehntes Promise, wenn async/await verwendet wird.
managed
Elemente im Speicherbereich managed
werden durch eine vom Domainadministrator konfigurierte Unternehmensrichtlinie festgelegt und sind für die Erweiterung nur lesbar. Versuche, diesen Namespace zu ändern, führen zu einem Fehler. Informationen zum Konfigurieren einer Richtlinie finden Sie unter Manifest für Speicherbereiche.
Typ
sync
Elemente im Speicherbereich sync
werden mit der Chrome-Synchronisierung synchronisiert.
Typ
StorageArea und Objekt
Attribute
-
MAX_ITEMS
512
Die maximale Anzahl von Elementen, die im Synchronspeicher gespeichert werden können. Updates, die dieses Limit überschreiten würden, schlagen sofort fehl und
runtime.lastError
wird festgelegt, wenn ein Rückruf verwendet oder ein Versprechen abgelehnt wird. -
MAX_SUSTAINED_WRITE_OPERATIONS_PER_MINUTE
1000000
EingestelltFür die storage.sync API gibt es kein Kontingent für fortlaufende Schreibvorgänge mehr.
-
MAX_WRITE_OPERATIONS_PER_HOUR
1800
Die maximale Anzahl von
set
-,remove
- oderclear
-Vorgängen, die pro Stunde ausgeführt werden können. Das entspricht einer Schreibrate von einer Schreiboperation alle zwei Sekunden. Das ist ein niedrigerer Grenzwert als das kurzfristig höhere Limit für Schreibvorgänge pro Minute.Updates, die dieses Limit überschreiten würden, schlagen sofort fehl und setzen
runtime.lastError
, wenn ein Rückruf verwendet oder ein Versprechen abgelehnt wird. -
MAX_WRITE_OPERATIONS_PER_MINUTE
120
Die maximale Anzahl von
set
-,remove
- oderclear
-Vorgängen, die pro Minute ausgeführt werden können. Das entspricht 2 pro Sekunde und bietet einen höheren Durchsatz als Schreibvorgänge pro Stunde über einen kürzeren Zeitraum.Updates, die dazu führen würden, dass dieses Limit überschritten wird, schlagen sofort fehl und setzen
runtime.lastError
, wenn ein Rückruf verwendet oder ein Versprechen abgelehnt wird. -
QUOTA_BYTES
102400
Die maximale Gesamtmenge (in Byte) an Daten, die im Synchronspeicher gespeichert werden können, gemessen an der JSON-Stringifizierung jedes Werts plus der Länge jedes Schlüssels. Updates, die dazu führen würden, dass dieses Limit überschritten wird, schlagen sofort fehl und setzen
runtime.lastError
, wenn ein Rückruf verwendet oder ein Versprechen abgelehnt wird. -
QUOTA_BYTES_PER_ITEM
8192
Die maximale Größe (in Byte) jedes einzelnen Elements im Synchronspeicher, gemessen an der JSON-Stringifizierung des Werts plus der Schlüssellänge. Updates, die Elemente enthalten, die größer als dieses Limit sind, schlagen sofort fehl und
runtime.lastError
wird festgelegt, wenn ein Rückruf verwendet oder ein Versprechen abgelehnt wird.
Ereignisse
onChanged
chrome.storage.onChanged.addListener(
callback: function,
)
Wird ausgelöst, wenn sich ein oder mehrere Elemente ändern.
Parameter
-
callback
Funktion
Der Parameter
callback
sieht so aus:(changes: object, areaName: string) => void
-
Änderungen
Objekt
-
areaName
String
-