refresh date: 2026-09-25 robots: noindex
Descripción
Usa la API de chrome.storage para almacenar, recuperar y hacer un seguimiento de los cambios en los datos del usuario.
Permisos
storageDescripción general
La API de Storage proporciona una forma específica de la extensión para conservar los datos y el estado del usuario. Es similar a las APIs de almacenamiento de la plataforma web (IndexedDB y Storage), pero se diseñó para satisfacer las necesidades de almacenamiento de las extensiones. Estas son algunas de las funciones clave:
- Todos los contextos de extensión, incluidos el service worker de la extensión y las secuencias de comandos de contenido, tienen acceso a la API de Storage.
- Los valores serializables de JSON se almacenan como propiedades de objeto.
- La API de Storage es asíncrona con operaciones de lectura y escritura masivas.
- Incluso si el usuario borra la caché y el historial de navegación, los datos persisten.
- La configuración almacenada persiste incluso cuando se usa el modo Incógnito dividido.
- Incluye un área de almacenamiento administrada exclusiva de solo lectura para las políticas empresariales.
Aunque las extensiones pueden usar la interfaz [Storage][mdn-storage] (accesible desde window.localStorage) en algunos contextos (ventanas emergentes y otras páginas HTML), no se recomienda por los siguientes motivos:
- El service worker de la extensión no puede acceder a
Storage. - Las secuencias de comandos de contenido comparten el almacenamiento con la página host.
- Los datos guardados con la interfaz
Storagese pierden cuando el usuario borra su historial de navegación.
Para mover datos de las APIs de almacenamiento web a las APIs de almacenamiento de extensiones desde un service worker, haz lo siguiente:
- Crea un documento fuera de pantalla con una rutina de conversión y un controlador [
onMessage][on-message]. - Agrega una rutina de conversión a un documento fuera de pantalla.
- En el service worker de la extensión, verifica
chrome.storagepara ver tus datos. - Si no se encuentran tus datos, [crea][create-offscreen] un documento fuera de pantalla y llama a [
sendMessage()][send-message] para iniciar la rutina de conversión. - Dentro del controlador
onMessagedel documento fuera de pantalla, llama a la rutina de conversión.
También hay algunos matices en cuanto al funcionamiento de las APIs de almacenamiento web en las extensiones. Obtén más información en el artículo [Almacenamiento y cookies][storage-and-cookies].
Áreas de almacenamiento
La API de Storage se divide en los siguientes cuatro buckets ("áreas de almacenamiento"):
storage.local- Los datos se almacenan de forma local y se borran cuando se quita la extensión. La limitación de cuota es de aproximadamente 10 MB, pero se puede aumentar solicitando el permiso
"unlimitedStorage". Considera usarlo para almacenar grandes cantidades de datos.
storage.sync- Si la sincronización está habilitada, los datos se sincronizan con cualquier navegador Chrome al que el usuario haya accedido. Si se inhabilita, se comporta como
storage.local. Chrome almacena los datos de forma local cuando el navegador está sin conexión y reanuda la sincronización cuando vuelve a estar en línea. La limitación de cuota es de aproximadamente 100 KB, 8 KB por elemento. Considera usarlo para conservar la configuración del usuario en los navegadores sincronizados.
- storage.session
- Guarda los datos en la memoria durante una sesión del navegador. De forma predeterminada, no se expone a las secuencias de comandos de contenido, pero este comportamiento se puede cambiar configurando
chrome.storage.session.setAccessLevel(). La limitación de cuota es de aproximadamente 10 MB. Considera usarlo para almacenar variables globales en las ejecuciones de service workers.
- storage.managed
- Los administradores pueden usar un esquema y políticas empresariales para establecer los parámetros de configuración de una extensión compatible en un entorno administrado. Esta área de almacenamiento es de solo lectura.
Manifiesto
Para usar la API de Storage, declara el permiso "storage" en el manifiesto de la extensión. Por ejemplo:
{
"name": "My extension",
...
"permissions": [
"storage"
],
...
}
Uso
En los siguientes ejemplos, se muestran las áreas de almacenamiento local, sync y
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);
});
Para obtener más información sobre el área de almacenamiento managed, consulta Manifiesto para áreas de almacenamiento.
Límites de almacenamiento y regulación
No pienses en agregar elementos a la API de Storage como si los pusieras en un camión grande. Piensa en agregar datos al almacenamiento como si estuvieras colocando algo en una tubería. Es posible que la tubería ya tenga material e incluso que esté llena. Siempre asume que hay un retraso entre el momento en que agregas datos al almacenamiento y el momento en que se registran.
Para obtener detalles sobre las limitaciones del área de almacenamiento y lo que sucede cuando se superan, consulta la información de cuotas para sync, local y session.
Casos de uso
En las siguientes secciones, se muestran casos de uso comunes de la API de Storage.
Respuesta síncrona a las actualizaciones de almacenamiento
Para hacer un seguimiento de los cambios realizados en el almacenamiento, puedes agregar un objeto de escucha a su evento onChanged. Cuando se produce un cambio en el almacenamiento, se activa ese evento. El código de muestra escucha estos cambios:
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}".`
);
}
});
Podemos llevar esta idea aún más lejos. En este ejemplo, tenemos una página de opciones que permite al usuario activar o desactivar un "modo de depuración" (la implementación no se muestra aquí). La página de opciones guarda de inmediato la nueva configuración en storage.sync, y el service worker usa storage.onChanged para aplicar el parámetro de configuración lo antes posible.
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);
}
});
Carga previa asíncrona desde el almacenamiento
Como los service workers no siempre se están ejecutando, las extensiones de Manifest V3 a veces necesitan
cargar datos de forma asíncrona desde el almacenamiento antes de ejecutar sus controladores de eventos. Para ello, el siguiente fragmento usa un controlador de eventos action.onClicked asíncrono que espera a que se complete la variable global storageCache
antes de ejecutar su lógica.
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);
});
Ejemplos de extensiones
Para ver otras demostraciones de la API de Storage, explora cualquiera de los siguientes ejemplos:
Tipos
AccessLevel
Es el nivel de acceso del área de almacenamiento.
Enum
"TRUSTED_CONTEXTS"
Especifica los contextos que se originan en la extensión.
"TRUSTED_AND_UNTRUSTED_CONTEXTS"
Especifica los contextos que se originan fuera de la extensión.
StorageChange
Propiedades
-
newValue
any optional
Es el valor nuevo del elemento, si hay uno.
-
oldValue
any optional
Es el valor anterior del elemento, si lo hubiera.
Propiedades
local
Los elementos del área de almacenamiento local son locales para cada máquina.
Tipo
StorageArea y objeto
Propiedades
-
QUOTA_BYTES
10485760
Es la cantidad máxima (en bytes) de datos que se pueden almacenar en el almacenamiento local, según la conversión a cadena JSON de cada valor más la longitud de cada clave. Este valor se ignorará si la extensión tiene el permiso
unlimitedStorage. Las actualizaciones que provocarían que se supere este límite fallan de inmediato y establecenruntime.lastErrorcuando se usa una devolución de llamada, o una promesa rechazada si se usa async/await.
managed
Los elementos del área de almacenamiento managed se establecen mediante una política empresarial que configura el administrador del dominio y son de solo lectura para la extensión. Si se intenta modificar este espacio de nombres, se produce un error. Para obtener información sobre cómo configurar una política, consulta Manifiesto para áreas de almacenamiento.
Tipo
sync
Los elementos del área de almacenamiento sync se sincronizan con la Sincronización de Chrome.
Tipo
StorageArea y objeto
Propiedades
-
MAX_ITEMS
512
Es la cantidad máxima de elementos que se pueden almacenar en el almacenamiento de sincronización. Las actualizaciones que provoquen que se supere este límite fallarán de inmediato y establecerán
runtime.lastErrorcuando se use una devolución de llamada o cuando se rechace una promesa. -
MAX_SUSTAINED_WRITE_OPERATIONS_PER_MINUTE
1000000
ObsoletoLa API de storage.sync ya no tiene una cuota de operaciones de escritura sostenida.
-
MAX_WRITE_OPERATIONS_PER_HOUR
1800
Es la cantidad máxima de operaciones
set,removeoclearque se pueden realizar cada hora. Esto es 1 cada 2 segundos, un límite inferior al límite de escrituras por minuto más alto a corto plazo.Las actualizaciones que harían que se supere este límite fallan de inmediato y establecen
runtime.lastErrorcuando se usa una devolución de llamada o cuando se rechaza una promesa. -
MAX_WRITE_OPERATIONS_PER_MINUTE
120
Es la cantidad máxima de operaciones
set,removeoclearque se pueden realizar por minuto. Este límite es de 2 por segundo, lo que proporciona una mayor capacidad de procesamiento que las escrituras por hora durante un período más corto.Las actualizaciones que harían que se supere este límite fallan de inmediato y establecen
runtime.lastErrorcuando se usa una devolución de llamada o cuando se rechaza una promesa. -
QUOTA_BYTES
102400
Es la cantidad total máxima (en bytes) de datos que se pueden almacenar en el almacenamiento de sincronización, según se mide por la cadena JSON de cada valor más la longitud de cada clave. Las actualizaciones que harían que se supere este límite fallan de inmediato y establecen
runtime.lastErrorcuando se usa una devolución de llamada o cuando se rechaza una promesa. -
QUOTA_BYTES_PER_ITEM
8192
Es el tamaño máximo (en bytes) de cada elemento individual en el almacenamiento de sincronización, medido por la cadena JSON de su valor más la longitud de su clave. Las actualizaciones que contengan elementos que superen este límite fallarán de inmediato y establecerán
runtime.lastErrorcuando se use una devolución de llamada o cuando se rechace una promesa.
Eventos
onChanged
chrome.storage.onChanged.addListener(
callback: function,
)
Se activa cuando cambian uno o más elementos.
Parámetros
-
callback
función
El parámetro
callbackse ve de la siguiente manera:(changes: object, areaName: string) => void
-
Cambios
objeto
-
areaName
string
-