Beschrijving
Gebruik de chrome.storage API om gebruikersgegevens op te slaan, op te halen en wijzigingen daarin bij te houden.
Toestemmingen
storage Om de opslag-API te gebruiken, moet u de machtiging "storage" in het extensiemanifest declareren. Bijvoorbeeld:
{
"name": "My extension",
...
"permissions": [
"storage"
],
...
}
Voorbeelden
De volgende voorbeelden illustreren de local , sync en session :
Voorbeeld (lokaal)
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);
});
Voorbeeld (Synchronisatie)
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);
});
Voorbeeld (sessie)
chrome.storage.session.set({ key: value }).then(() => {
console.log("Value is set");
});
chrome.storage.session.get(["key"]).then((result) => {
console.log("Value is " + result.key);
});
Om andere demonstraties van de Storage API te bekijken, kunt u een van de volgende voorbeelden raadplegen:
Concepten en gebruik
De Storage API biedt een extensiespecifieke manier om gebruikersgegevens en -status op te slaan. Deze is vergelijkbaar met de opslag-API's van het webplatform ( IndexedDB en Storage ), maar is ontworpen om te voldoen aan de opslagbehoeften van extensies. Hieronder volgen enkele belangrijke functies:
- Alle extensiecontexten, inclusief de extensieserviceworker en inhoudsscripts, hebben toegang tot de Storage API.
- De JSON-serialiseerbare waarden worden opgeslagen als objecteigenschappen.
- De Storage API is asynchroon en ondersteunt bulklees- en schrijfbewerkingen.
- Zelfs als de gebruiker de cache en browsegeschiedenis wist, blijven de gegevens bewaard.
- Opgeslagen instellingen blijven behouden, zelfs bij gebruik van de gesplitste incognitomodus .
- Inclusief een exclusieve, alleen-lezen beheerde opslagruimte voor bedrijfsbeleid.
Kunnen extensies gebruikmaken van webopslag-API's?
Hoewel extensies in sommige contexten (pop-ups en andere HTML-pagina's) gebruik kunnen maken van de Storage interface (toegankelijk via window.localStorage ), raden we dit om de volgende redenen af:
- Medewerkers van extensieservices kunnen de Web Storage API niet gebruiken.
- Contentscripts delen opslagruimte met de hostpagina.
- Gegevens die zijn opgeslagen met behulp van de Web Storage API gaan verloren wanneer de gebruiker zijn of haar browsegeschiedenis wist.
Om gegevens van webopslag-API's naar extensieopslag-API's te verplaatsen vanuit een service worker:
- Maak een HTML-pagina voor een offscreen-document en een scriptbestand aan. Het scriptbestand moet een conversieroutine en een
onMessagehandler bevatten. - Controleer in de extension service worker de map
chrome.storagevoor uw gegevens. - Als uw gegevens niet worden gevonden, roep dan
createDocument()aan. - Nadat de geretourneerde Promise is opgelost, roept u
sendMessage()aan om de conversieroutine te starten. - Roep de conversieroutine aan in de
onMessagehandler van het offscreen-document.
Er zijn ook enkele nuances met betrekking tot de werking van webopslag-API's in extensies. Lees meer in het artikel over opslag en cookies .
Opslag- en beperkingslimieten
De Storage API kent gebruiksbeperkingen:
- Het opslaan van data brengt prestatiekosten met zich mee, en de API hanteert opslagquota. Plan daarom zorgvuldig welke data u wilt opslaan, zodat u voldoende opslagruimte behoudt.
- Opslag kan enige tijd in beslag nemen. Houd bij het structureren van je code rekening met deze tijdsduur.
Voor meer informatie over de beperkingen van de opslagruimte en wat er gebeurt als deze worden overschreden, raadpleegt u de quota-informatie voor sync , local en session .
Opslagruimtes
De Storage API is onderverdeeld in de volgende opslaggebieden:
Lokaal
Gegevens worden lokaal opgeslagen en verwijderd wanneer de extensie wordt verwijderd. De opslaglimiet is 10 MB (5 MB in Chrome 113 en ouder), maar kan worden verhoogd door de machtiging "unlimitedStorage" aan te vragen. We raden aan om storage.local te gebruiken voor het opslaan van grotere hoeveelheden gegevens. Standaard is deze beschikbaar voor content scripts, maar dit gedrag kan worden gewijzigd door chrome.storage.local.setAccessLevel() aan te roepen.
Beheerd
Beheerde opslag is alleen-lezen voor via beleid geïnstalleerde extensies. Het wordt beheerd door systeembeheerders, met behulp van een door de ontwikkelaar gedefinieerd schema en bedrijfsbeleid. Beleid is vergelijkbaar met opties, maar wordt geconfigureerd door een systeembeheerder in plaats van de gebruiker. Hierdoor kan de extensie vooraf worden geconfigureerd voor alle gebruikers van een organisatie.
Standaard is storage.managed toegankelijk voor contentscripts, maar dit gedrag kan worden gewijzigd door chrome.storage.managed.setAccessLevel() aan te roepen. Zie de documentatie voor beheerders voor meer informatie over beleid. Zie het manifest voor opslaggebieden voor meer informatie over het managed opslaggebied.
Sessie
Sessieopslag bewaart gegevens in het geheugen zolang een extensie is geladen. De opslag wordt gewist als de extensie wordt uitgeschakeld, opnieuw geladen, bijgewerkt of wanneer de browser opnieuw wordt opgestart. Standaard is de opslag niet toegankelijk voor scripts, maar dit gedrag kan worden gewijzigd door de functie chrome.storage.session.setAccessLevel() aan te roepen. De opslaglimiet is 10 MB (1 MB in Chrome 111 en ouder).
De storage.session interface is een van de interfaces die we aanbevelen voor service workers .
Synchroniseren
Als de gebruiker synchronisatie inschakelt, worden de gegevens gesynchroniseerd met elke Chrome-browser waarin de gebruiker is ingelogd. Indien uitgeschakeld, werkt het als storage.local . Chrome slaat de gegevens lokaal op wanneer de browser offline is en hervat de synchronisatie wanneer deze weer online is. De quotumlimiet is ongeveer 100 KB, 8 KB per item.
We raden aan om storage.sync te gebruiken om gebruikersinstellingen te behouden tussen gesynchroniseerde browsers. Als u met gevoelige gebruikersgegevens werkt, gebruik dan in plaats daarvan storage.session . Standaard is storage.sync toegankelijk voor contentscripts, maar dit gedrag kan worden gewijzigd door chrome.storage.sync.setAccessLevel() aan te roepen.
Methoden en gebeurtenissen
Alle opslaggebieden implementeren de StorageArea interface.
krijgen()
Met de get() methode kunt u een of meer sleutels uit een StorageArea lezen.
getBytesInUse()
Met de methode getBytesInUse() kunt u het quotum zien dat door een StorageArea wordt gebruikt.
getKeys()
Met de getKeys() methode kunt u alle sleutels ophalen die in een StorageArea zijn opgeslagen.
verwijderen()
Met de remove() methode kunt u een item uit een StorageArea verwijderen.
set()
Met de set() -methode kunt u een item in een StorageArea plaatsen.
setAccessLevel()
Met de methode setAccessLevel() kunt u de toegang tot een StorageArea beheren.
duidelijk()
Met de clear() methode kunt u alle gegevens uit een StorageArea wissen.
gewijzigd
Met de onChanged gebeurtenis kunt u wijzigingen in een StorageArea bewaken.
Gebruiksvoorbeelden
De volgende secties illustreren veelvoorkomende gebruiksscenario's voor de Storage API.
Reageer op updates voor de opslag.
Om wijzigingen in de opslag bij te houden, voegt u een listener toe aan de onChanged -gebeurtenis. Wanneer er iets in de opslag verandert, wordt die gebeurtenis geactiveerd. De voorbeeldcode luistert naar deze wijzigingen:
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}".`
);
}
});
We kunnen dit idee nog verder uitwerken. In dit voorbeeld hebben we een optiepagina waarmee de gebruiker een "debugmodus" kan in- of uitschakelen (implementatie niet getoond). De optiepagina slaat de nieuwe instellingen direct op in storage.sync , en de service worker gebruikt storage.onChanged om de instelling zo snel mogelijk toe te passen.
opties.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>
opties.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);
}
});
Asynchroon vooraf laden vanuit opslag
Omdat service workers niet continu actief zijn, moeten Manifest V3-extensies soms asynchroon gegevens uit de opslag laden voordat ze hun gebeurtenisafhandelaars uitvoeren. Om dit te doen, gebruikt het volgende codefragment een asynchrone action.onClicked -gebeurtenisafhandelaar die wacht tot de globale variabele storageCache gevuld is voordat de logica wordt uitgevoerd.
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);
});
Ontwikkeltools
U kunt gegevens die via de API zijn opgeslagen, bekijken en bewerken in DevTools. Zie de pagina ' Extensieopslag bekijken en bewerken' in de DevTools-documentatie voor meer informatie.
Soorten
AccessLevel
Het toegangsniveau van de opslagruimte.
Enum
"VERTROUWDE_CONTEXTEN" "BETROUWBARE EN ONBETROUWBARE CONTEXTEN"
Specificeert contexten die afkomstig zijn van de extensie zelf.
Specificeert contexten die van buiten de extensie afkomstig zijn.
StorageChange
Eigenschappen
- nieuwe waarde
eventuele optionele
De nieuwe waarde van het item, indien er een nieuwe waarde is.
- oude waarde
eventuele optionele
De oude waarde van het artikel, indien er een oude waarde was.
Eigenschappen
local
Artikelen in het local magazijn zijn specifiek voor elke machine.
Type
Opslagruimte & object
Eigenschappen
- QUOTA_BYTES
10485760
De maximale hoeveelheid (in bytes) aan gegevens die in de lokale opslag kan worden opgeslagen, gemeten aan de hand van de JSON-string van elke waarde plus de lengte van elke sleutel. Deze waarde wordt genegeerd als de extensie de machtiging
unlimitedStorageheeft. Updates die ertoe zouden leiden dat deze limiet wordt overschreden, mislukken onmiddellijk en genererenruntime.lastErrorbij gebruik van een callback, of een afgewezen Promise bij gebruik van async/await.
managed
Items in het managed opslaggebied worden ingesteld door een bedrijfsbeleid dat is geconfigureerd door de domeinbeheerder en zijn alleen-lezen voor de extensie; pogingen om deze naamruimte te wijzigen resulteren in een fout. Zie Manifest voor opslaggebieden voor meer informatie over het configureren van een beleid.
Type
session
Items in het session worden in het geheugen opgeslagen en niet naar de schijf geschreven.
Type
Opslagruimte & object
Eigenschappen
- QUOTA_BYTES
10485760
De maximale hoeveelheid (in bytes) aan gegevens die in het geheugen kan worden opgeslagen, gemeten door het dynamisch toegewezen geheugengebruik van elke waarde en sleutel te schatten. Updates die deze limiet zouden overschrijden, mislukken onmiddellijk en stellen
runtime.lastErrorin bij gebruik van een callback of wanneer een Promise wordt afgewezen.
sync
Items in het sync worden gesynchroniseerd met behulp van Chrome Sync.
Type
Opslagruimte & object
Eigenschappen
- MAX_ITEMS
512
Het maximale aantal items dat in de synchronisatieopslag kan worden opgeslagen. Updates die deze limiet zouden overschrijden, zullen onmiddellijk mislukken en
runtime.lastErrorinstellen bij gebruik van een callback of wanneer een Promise wordt afgewezen. - MAX_AANHOUDENDE_SCHRIJFBEWERKINGEN_PER_MINUUT
1000000
VerouderdDe storage.sync API heeft geen quotum meer voor continue schrijfbewerkingen.
- MAX_SCHRIJFBEWERKINGEN_PER_UUR
1800
Het maximale aantal
set,removeofclearbewerkingen dat per uur kan worden uitgevoerd. Dit is 1 elke 2 seconden, een lagere limiet dan de kortetermijnlimiet voor hogere schrijfbewerkingen per minuut.Updates die ertoe zouden leiden dat deze limiet wordt overschreden, mislukken onmiddellijk en stellen
runtime.lastErrorin bij gebruik van een callback of wanneer een Promise wordt afgewezen. - MAX_SCHRIJFBEWERKINGEN_PER_MINUUT
120
Het maximale aantal
set,removeofclear-bewerkingen dat per minuut kan worden uitgevoerd. Dit is 2 per seconde, wat een hogere doorvoer oplevert dan schrijfbewerkingen per uur over een kortere periode.Updates die ertoe zouden leiden dat deze limiet wordt overschreden, mislukken onmiddellijk en stellen
runtime.lastErrorin bij gebruik van een callback of wanneer een Promise wordt afgewezen. - QUOTA_BYTES
102400
De maximale totale hoeveelheid (in bytes) aan gegevens die in de synchrone opslag kan worden opgeslagen, gemeten aan de hand van de JSON-stringificatie van elke waarde plus de lengte van elke sleutel. Updates die deze limiet zouden overschrijden, mislukken onmiddellijk en stellen
runtime.lastErrorin bij gebruik van een callback of wanneer een Promise wordt afgewezen. - QUOTA_BYTES_PER_ITEM
8192
De maximale grootte (in bytes) van elk afzonderlijk item in de synchronisatieopslag, gemeten aan de hand van de JSON-string van de waarde plus de lengte van de sleutel. Updates die items bevatten die groter zijn dan deze limiet, zullen onmiddellijk mislukken en
runtime.lastErrorinstellen bij gebruik van een callback of wanneer een Promise wordt afgewezen.
Evenementen
onChanged
chrome.storage.onChanged.addListener(
callback: function,
)
Wordt geactiveerd wanneer een of meer items veranderen.
Parameters
- terugbelverzoek
functie
De
callbackparameter ziet er als volgt uit:(changes: object, areaName: string) => void
- veranderingen
voorwerp
- gebiedsnaam
snaar