Descrizione
Utilizza l'API chrome.storage
per archiviare, recuperare e monitorare le modifiche ai dati utente.
Autorizzazioni
storage
Panoramica
L'API Storage fornisce un modo specifico per l'estensione per mantenere i dati e lo stato dell'utente. È simile alle API di archiviazione della piattaforma web (IndexedDB e Storage), ma è stata progettata per soddisfare le esigenze di archiviazione delle estensioni. Di seguito sono riportate alcune funzionalità chiave:
- Tutti i contesti dell'estensione, inclusi il worker del servizio dell'estensione e gli script di contenuti, hanno accesso all'API Storage.
- I valori serializzabili JSON vengono archiviati come proprietà dell'oggetto.
- L'API Storage è asincrona con le operazioni di lettura e scrittura collettive.
- Anche se l'utente svuota la cache e la cronologia di navigazione, i dati rimangono invariati.
- Le impostazioni memorizzate rimangono invariate anche quando si utilizza la navigazione in incognito divisa.
- Include un'area di archiviazione gestita in sola lettura esclusiva per i criteri aziendali.
Sebbene le estensioni possano utilizzare l'interfaccia [Storage
][mdn-storage] (accessibile da window.localStorage
) in alcuni contesti (popup e altre pagine HTML), non è consigliata per i seguenti motivi:
- Il worker del servizio dell'estensione non può accedere a
Storage
. - Gli script di contenuti condividono lo spazio di archiviazione con la pagina host.
- I dati salvati utilizzando l'interfaccia
Storage
vengono persi quando l'utente cancella la cronologia di navigazione.
Per spostare i dati dalle API di archiviazione web alle API di archiviazione delle estensioni da un service worker:
- Crea un documento offscreen con una routine di conversione e un gestore [
onMessage
][on-message]. - Aggiungi una routine di conversione a un documento offscreen.
- Nel worker del servizio dell'estensione, controlla
chrome.storage
per i tuoi dati. - Se i dati non vengono trovati, [crea][create-offscreen] un documento offscreen e chiama [
sendMessage()
][send-message] per avviare la routine di conversione. - All'interno dell'handler
onMessage
del documento offscreen, chiama la routine di conversione.
Esistono anche alcune sfumature sul funzionamento delle API di archiviazione web nelle estensioni. Scopri di più nell'articolo [Spazio di archiviazione e cookie][storage-and-cookies].
Aree di stoccaggio
L'API Storage è suddivisa nei seguenti quattro bucket ("aree di archiviazione"):
storage.local
- I dati vengono memorizzati localmente e vengono cancellati quando l'estensione viene rimossa. La limitazione della quota è di circa 10 MB, ma può essere aumentata richiedendo l'autorizzazione
"unlimitedStorage"
. Valuta la possibilità di utilizzarlo per archiviare quantità maggiori di dati.
storage.sync
- Se la sincronizzazione è attiva, i dati vengono sincronizzati con qualsiasi browser Chrome a cui l'utente ha eseguito l'accesso. Se è disattivato, si comporta come
storage.local
. Chrome archivia i dati localmente quando il browser è offline e riprende la sincronizzazione quando è di nuovo online. La limitazione della quota è di circa 100 KB, 8 KB per elemento. Valuta la possibilità di utilizzarlo per conservare le impostazioni utente nei browser sincronizzati.
- storage.session
- Mantiene i dati in memoria per la durata di una sessione del browser. Per impostazione predefinita, non è visibile agli script dei contenuti, ma questo comportamento può essere modificato impostando
chrome.storage.session.setAccessLevel()
. La limitazione della quota è di circa 10 MB. Valuta la possibilità di utilizzarlo per memorizzare le variabili globali nelle esecuzioni del servizio worker.
- storage.managed
- Gli amministratori possono utilizzare uno schema e i criteri aziendali per configurare le impostazioni di un'estensione di supporto in un ambiente gestito. Questa area di archiviazione è di sola lettura.
Manifest
Per utilizzare l'API di archiviazione, dichiara l'autorizzazione "storage"
nel manifest dell'estensione. Ad esempio:
{
"name": "My extension",
...
"permissions": [
"storage"
],
...
}
Utilizzo
I seguenti esempi mostrano le aree di archiviazione local
, sync
e
session
:
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);
});
Per scoprire di più sull'area di archiviazione managed
, consulta Manifest per le aree di archiviazione.
Limiti di spazio di archiviazione e throttling
Non pensare di aggiungere elementi all'API Storage come se stessi mettendo delle cose in un grande camion. Pensa all'aggiunta di spazio di archiviazione come a mettere qualcosa in un tubo. La canna potrebbe già contenere materiale e persino essere piena. Assegna sempre un ritardo tra il momento in cui aggiungi dati allo spazio di archiviazione e quello in cui vengono effettivamente registrati.
Per informazioni dettagliate sulle limitazioni dell'area di archiviazione e su cosa succede quando vengono superate, consulta le informazioni sulle quote per sync
, local
e session
.
Casi d'uso
Le sezioni seguenti mostrano casi d'uso comuni dell'API Storage.
Risposta sincrona agli aggiornamenti dello spazio di archiviazione
Per monitorare le modifiche apportate allo spazio di archiviazione, puoi aggiungere un ascoltatore all'evento onChanged
. Quando si verificano modifiche nello spazio di archiviazione, viene attivato questo evento. Il codice di esempio è in ascolto per queste modifiche:
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}".`
);
}
});
Possiamo spingere questa idea ancora oltre. In questo esempio, abbiamo una pagina di opzioni che consente all'utente di attivare/disattivare una "modalità di debug" (l'implementazione non è mostrata qui). La pagina delle opzioni salva immediatamente le nuove impostazioni in storage.sync
e il service worker utilizza storage.sync
per applicare l'impostazione il prima possibile.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);
}
});
Precaricamento asincrono dallo spazio di archiviazione
Poiché i service worker non sono sempre in esecuzione, a volte le estensioni Manifest V3 devono caricare i dati in modo asincrono dallo spazio di archiviazione prima di eseguire i relativi gestori eventi. Per farlo, il
seguente snippet utilizza un gestore di eventi action.onClicked
asincrono che attende che la variabile globale storageCache
venga compilata prima di eseguire la relativa logica.
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);
});
Esempi di estensioni
Per vedere altre dimostrazioni dell'API Storage, consulta uno dei seguenti esempi:
Tipi
AccessLevel
Il livello di accesso dell'area di archiviazione.
Enum
"TRUSTED_CONTEXTS"
Specifica i contesti provenienti dall'estensione stessa.
"TRUSTED_AND_UNTRUSTED_CONTEXTS"
Specifica i contesti provenienti dall'esterno dell'estensione.
StorageArea
Proprietà
-
onChanged
Event<functionvoidvoid>
Chrome 73 e versioni successiveViene attivato quando uno o più elementi cambiano.
La funzione
onChanged.addListener
ha il seguente aspetto:(callback: function) => {...}
-
callback
funzione
Il parametro
callback
ha il seguente aspetto:(changes: object) => void
-
modifiche
oggetto
-
-
-
cancella
nullo
PromessaRimuove tutti gli elementi dallo spazio di archiviazione.
La funzione
clear
ha il seguente aspetto:(callback?: function) => {...}
-
callback
function facoltativa
Il parametro
callback
ha il seguente aspetto:() => void
-
returns
Promise<void>
Chrome 88 e versioni successiveLe promesse sono supportate solo per Manifest V3 e versioni successive, mentre le altre piattaforme devono utilizzare i callback.
-
-
get
nullo
PromessaRecupera uno o più elementi dallo spazio di archiviazione.
La funzione
get
ha il seguente aspetto:(keys?: string | string[] | object, callback?: function) => {...}
-
chiavi
stringa | stringa[] | oggetto facoltativo
Una singola chiave da recuperare, un elenco di chiavi da recuperare o un dizionario che specifica i valori predefiniti (vedi la descrizione dell'oggetto). Un elenco o un oggetto vuoto restituirà un oggetto risultato vuoto. Passa
null
per ottenere l'intero contenuto dello spazio di archiviazione. -
callback
function facoltativa
Il parametro
callback
ha il seguente aspetto:(items: object) => void
-
elementi
oggetto
Oggetto con elementi nelle relative mappature di coppie chiave-valore.
-
-
returns
Promise<object>
Chrome 88 e versioni successiveLe promesse sono supportate solo per Manifest V3 e versioni successive, mentre le altre piattaforme devono utilizzare i callback.
-
-
getBytesInUse
nullo
PromessaRecupera la quantità di spazio (in byte) utilizzata da uno o più elementi.
La funzione
getBytesInUse
ha il seguente aspetto:(keys?: string | string[], callback?: function) => {...}
-
chiavi
stringa | stringa[] facoltativo
Una singola chiave o un elenco di chiavi per le quali ottenere l'utilizzo totale. Un elenco vuoto restituirà 0. Passa
null
per ottenere l'utilizzo totale di tutto lo spazio di archiviazione. -
callback
function facoltativa
Il parametro
callback
ha il seguente aspetto:(bytesInUse: number) => void
-
bytesInUse
numero
Quantità di spazio utilizzato nello spazio di archiviazione, in byte.
-
-
returns
Promise<number>
Chrome 88 e versioni successiveLe promesse sono supportate solo per Manifest V3 e versioni successive, mentre le altre piattaforme devono utilizzare i callback.
-
-
getKeys
nullo
Promessa Chrome 130 e versioni successiveRecupera tutte le chiavi dallo spazio di archiviazione.
La funzione
getKeys
ha il seguente aspetto:(callback?: function) => {...}
-
callback
function facoltativa
Il parametro
callback
ha il seguente aspetto:(keys: string[]) => void
-
chiavi
stringa[]
Array con le chiavi lette dallo spazio di archiviazione.
-
-
returns
Promise<string[]>
Le promesse sono supportate solo per Manifest V3 e versioni successive, mentre le altre piattaforme devono utilizzare i callback.
-
-
rimuovi
nullo
PromessaRimuove uno o più elementi dallo spazio di archiviazione.
La funzione
remove
ha il seguente aspetto:(keys: string | string[], callback?: function) => {...}
-
chiavi
stringa | stringa[]
Una singola chiave o un elenco di chiavi per gli elementi da rimuovere.
-
callback
function facoltativa
Il parametro
callback
ha il seguente aspetto:() => void
-
returns
Promise<void>
Chrome 88 e versioni successiveLe promesse sono supportate solo per Manifest V3 e versioni successive, mentre le altre piattaforme devono utilizzare i callback.
-
-
imposta
nullo
PromessaImposta più elementi.
La funzione
set
ha il seguente aspetto:(items: object, callback?: function) => {...}
-
elementi
oggetto
Un oggetto che fornisce ogni coppia chiave/valore per aggiornare lo spazio di archiviazione. Le altre coppie chiave/valore nello spazio di archiviazione non saranno interessate.
I valori primitivi come i numeri verranno serializzati come previsto. I valori con
typeof
"object"
e"function"
vengono generalmente serializzati in{}
, ad eccezione diArray
(viene serializzato come previsto),Date
eRegex
(viene serializzato utilizzando la relativa rappresentazioneString
). -
callback
function facoltativa
Il parametro
callback
ha il seguente aspetto:() => void
-
returns
Promise<void>
Chrome 88 e versioni successiveLe promesse sono supportate solo per Manifest V3 e versioni successive, mentre le altre piattaforme devono utilizzare i callback.
-
-
setAccessLevel
nullo
Promessa Chrome 102 e versioni successiveImposta il livello di accesso desiderato per l'area di archiviazione. L'impostazione predefinita sarà solo contesti attendibili.
La funzione
setAccessLevel
ha il seguente aspetto:(accessOptions: object, callback?: function) => {...}
-
accessOptions
oggetto
-
accessLevel
Il livello di accesso dell'area di archiviazione.
-
-
callback
function facoltativa
Il parametro
callback
ha il seguente aspetto:() => void
-
returns
Promise<void>
Le promesse sono supportate solo per Manifest V3 e versioni successive, mentre le altre piattaforme devono utilizzare i callback.
-
StorageChange
Proprietà
-
newValue
qualsiasi facoltativo
Il nuovo valore dell'elemento, se presente.
-
oldValue
qualsiasi facoltativo
Il vecchio valore dell'elemento, se esistente.
Proprietà
local
Gli elementi nell'area di archiviazione local
sono locali per ogni macchina.
Tipo
StorageArea e oggetto
Proprietà
-
QUOTA_BYTES
10485760
La quantità massima (in byte) di dati che possono essere archiviati nello spazio di archiviazione locale, misurata dalla stringificazione JSON di ogni valore più la lunghezza di ogni chiave. Questo valore verrà ignorato se l'estensione dispone dell'autorizzazione
unlimitedStorage
. Gli aggiornamenti che causerebbero il superamento di questo limite non vanno a buon fine immediatamente e impostanoruntime.lastError
quando si utilizza un callback o una Promise rifiutata se si utilizza async/await.
managed
Gli elementi nell'area di archiviazione managed
sono impostati da un criterio aziendale configurato dall'amministratore di dominio e sono di sola lettura per l'estensione. Il tentativo di modificare questo spazio dei nomi genera un errore. Per informazioni sulla configurazione di un criterio, consulta Manifest per le aree di archiviazione.
Tipo
sync
Gli elementi nell'area di archiviazione sync
vengono sincronizzati utilizzando Sincronizzazione Chrome.
Tipo
StorageArea e oggetto
Proprietà
-
MAX_ITEMS
512
Il numero massimo di elementi che possono essere archiviati nello spazio di archiviazione sincronizzato. Gli aggiornamenti che causerebbero il superamento di questo limite non andranno a buon fine immediatamente e imposteranno
runtime.lastError
quando viene utilizzato un callback o quando una promessa viene rifiutata. -
MAX_SUSTAINED_WRITE_OPERATIONS_PER_MINUTE
1000000
ObsoletoL'API storage.sync non ha più una quota di operazioni di scrittura sostenuta.
-
MAX_WRITE_OPERATIONS_PER_HOUR
1800
Il numero massimo di operazioni
set
,remove
oclear
che possono essere eseguite ogni ora. Si tratta di una scrittura ogni 2 secondi, un limite inferiore rispetto al limite di scrittura al minuto più elevato a breve termine.Gli aggiornamenti che causerebbero il superamento di questo limite non vanno a buon fine immediatamente e impostano
runtime.lastError
quando viene utilizzato un callback o quando una promessa viene rifiutata. -
MAX_WRITE_OPERATIONS_PER_MINUTE
120
Il numero massimo di operazioni
set
,remove
oclear
che possono essere eseguite ogni minuto. ovvero 2 al secondo, che offre una maggiore velocità effettiva rispetto alle scritture all'ora in un periodo di tempo più breve.Gli aggiornamenti che causerebbero il superamento di questo limite non vanno a buon fine immediatamente e impostano
runtime.lastError
quando viene utilizzato un callback o quando una promessa viene rifiutata. -
QUOTA_BYTES
102400
La quantità totale massima (in byte) di dati che possono essere archiviati nello spazio di archiviazione sincronizzato, misurata dalla stringificazione JSON di ogni valore più la lunghezza di ogni chiave. Gli aggiornamenti che causerebbero il superamento di questo limite non vanno a buon fine immediatamente e impostano
runtime.lastError
quando viene utilizzato un callback o quando una promessa viene rifiutata. -
QUOTA_BYTES_PER_ITEM
8192
La dimensione massima (in byte) di ogni singolo elemento nello spazio di archiviazione sincronizzato, misurata dalla stringificazione JSON del relativo valore più la lunghezza della chiave. Gli aggiornamenti contenenti elementi più grandi di questo limite non andranno a buon fine immediatamente e imposteranno
runtime.lastError
quando viene utilizzato un callback o quando una promessa viene rifiutata.
Eventi
onChanged
chrome.storage.onChanged.addListener(
callback: function,
)
Viene attivato quando uno o più elementi cambiano.
Parametri
-
callback
funzione
Il parametro
callback
ha il seguente aspetto:(changes: object, areaName: string) => void
-
modifiche
oggetto
-
areaName
stringa
-