El modo de durabilidad predeterminado en IndexedDB cambiará de strict
a relaxed
a partir de Chrome 121. Este ajuste se realiza para mejorar el rendimiento y alinearse con otros navegadores principales, como Firefox y Safari. En la entrada de blog, se explican los detalles de este cambio y lo que significa para los desarrolladores web.
Modos de durabilidad de IndexedDB
IndexedDB, una potente API web para almacenar grandes cantidades de datos estructurados, ofrece dos modos de durabilidad para las transacciones readwrite
:
strict
: Este modo le indica explícitamente al SO que borre los cambios en el disco antes de emitir el eventocomplete
.relaxed
: Este modo se basa en el comportamiento de limpieza predeterminado del SO y emite el eventocomplete
después de que los cambios llegan al búfer del SO, que se borra cada dos segundos.
Es importante tener en cuenta que strict
no garantiza que los cambios se escriban de inmediato en el disco. Después de que un sitio llama a put()
, todavía hay una cantidad finita de tiempo durante la cual una falla de energía podría hacer que el cambio no llegue al disco y, por lo tanto, no esté disponible la próxima vez que se ejecute la app.
En el caso de las garantías con durabilidad strict
, el evento complete
de la transacción de IndexedDB no se activa hasta después de que se escriben los datos, mientras que con la durabilidad relaxed
, los datos aún están en proceso de escritura cuando se activa el evento complete
. (para obtener más detalles sobre el proceso completo, consulta esta explicación).
Por lo tanto, strict
solo se usa para operaciones en las que necesitas saber que se escribieron antes de hacer lo siguiente. La migración de datos es un ejemplo en el que se requiere la durabilidad de strict
. Cuando se pasa de un almacén de respaldo a otro, no se debe borrar el formato anterior hasta que se escriba el nuevo. De esta manera, la durabilidad de strict
facilita una rutina de migración que podría recuperarse de una falla a mitad de camino.
Cambio en el modo de durabilidad predeterminado
El aspecto fundamental de este cambio es el modo de durabilidad predeterminado para las transacciones readwrite
en Chrome. Hasta ahora, el valor predeterminado era strict
, lo que garantizaba escrituras en el disco inmediatas para los cambios de datos. Sin embargo, debido a consideraciones de rendimiento y para alinearse con otros navegadores principales que usan relaxed
, Chrome también planea cambiar el valor predeterminado a relaxed
.
Este cambio está diseñado para proporcionar un mejor equilibrio entre el rendimiento y la durabilidad de los datos. Si bien strict
garantiza la máxima durabilidad de los datos, relaxed
suele ser suficiente para muchas aplicaciones web y puede mejorar significativamente el rendimiento de las siguientes maneras:
- Velocidad: En ejemplos del mundo real, el equipo de Chrome observó mejoras de velocidad entre un factor de 3 y 30.
- Durabilidad del disco, en especial para dispositivos con un disco de estado sólido (SSD).
- Mayor duración de batería.
- Una mejora en la velocidad de lectura. Debido a la arquitectura de IndexedDB, en la que las transacciones de lectura suelen bloquearse detrás de las transacciones de escritura, la velocidad de lectura mejora como efecto secundario.
- Todo el dispositivo se ve afectado de forma positiva, ya que las operaciones de disco son un recurso del sistema compartido.
Interoperabilidad y compatibilidad
Un aspecto importante de este cambio es su impacto en la interoperabilidad y la compatibilidad. Al alinearse con el comportamiento de otros proveedores de navegadores importantes, Chromium mejora la interoperabilidad. El estándar en sí permite diferentes implementaciones, y este cambio tiene como objetivo armonizarlas. Puedes encontrar más contexto histórico sobre este cambio en este problema de GitHub.
¿Qué significa esto para los desarrolladores web?
Este cambio no presenta ninguna nueva plataforma de API. La API de IndexedDB existente sigue siendo la misma, y este cambio afecta principalmente el comportamiento predeterminado de las transacciones readwrite
. Puedes especificar el modo de durabilidad que prefieras cuando crees transacciones, lo que te dará control sobre la durabilidad y el rendimiento de los datos. En la siguiente muestra de código, se muestra cómo recuperar el comportamiento anterior configurando durability
como strict
en el array de opciones opcionales.
let db;
const DBOpenRequest = window.indexedDB.open("toDoList", 4);
DBOpenRequest.onsuccess = (event) => {
db = DBOpenRequest.result;
};
const transaction = db.transaction(
['toDoList'],
'readwrite',
{ durability: 'strict' });
Prueba el cambio de forma local antes de que se envíe
El cambio entrará en vigencia en Chrome 121. Si quieres probar el nuevo comportamiento de forma local antes, activa o desactiva la marca #indexed-db-default-durability-relaxed
en chrome://flags
.
Más información
Para obtener más detalles técnicos y actualizaciones sobre este cambio, consulta el error de seguimiento y la entrada del estado de la plataforma de Chrome.
En resumen, el cambio de Chrome para cambiar el modo de durabilidad predeterminado en IndexedDB tiene como objetivo mejorar el rendimiento y, al mismo tiempo, mantener la compatibilidad con otros navegadores principales. En la mayoría de los casos, nuestra recomendación es no hacer nada, ya que el nuevo valor predeterminado proporcionará mejoras de rendimiento. Si es necesario, puedes seguir especificando tu modo de durabilidad preferido y controlar la durabilidad y el rendimiento de los datos en tus aplicaciones web.
Agradecimientos
Evan Stade y Rachel Andrew revisaron este artículo.