IndexedDB n'est pas un magasin de valeurs-clés de la même manière que le stockage local. Le stockage local stocke juste des chaînes, donc pour mettre un objet dans le stockage local, l'approche habituelle est de JSON.stringify it:
myObject = {a: 1, b: 2, c: 3};
localStorage.setItem("uniq", JSON.stringify(myObject));
C'est très bien pour trouver l'objet avec la clé uniq
, mais la seule façon de récupérer les propriétés de myObject hors du stockage local est de JSON.parse l'objet et examinez-le:
var myStorageObject = JSON.parse(localStorage.getItem("uniq"));
window.alert(myStorageObject.b);
C'est très bien si vous ne disposez que d'un ou de quelques objets dans le stockage local. Mais imaginez que vous avez mille objets, qui ont tous une propriété b
, et que vous voulez faire quelque chose juste avec ceux où b==2
. Avec le stockage local, vous devrez parcourir l'intégralité du magasin et vérifier b
sur chaque article, ce qui représente une perte de traitement considérable.
Avec IndexedDB, vous pouvez stocker autre chose que des chaînes dans la valeur : "Cela inclut des types simples tels que DOMString et Date ainsi que des instances Object et Array." Non seulement cela, mais vous pouvez créer des index sur les propriétés des objets que vous avez stockés dans la valeur. Donc, avec IndexedDb, vous pouvez y placer ces mêmes milliers d'objets mais créer un index sur la propriété b
et l'utiliser pour récupérer simplement les objets où b==2
sans la surcharge de numérisation de chaque objet dans le magasin.
C'est du moins l'idée. L'API IndexedDB n'est pas très intuitive.
Ils semblent s'exécuter dans le même thread que les appels asynchrones ont été effectués. Comment cela ne bloquera-t-il pas l'interface utilisateur?
Asynchrone n'est pas la même chose que multi-thread, JavaScript, en règle générale, n'est pas multi-thread . Tout traitement lourd que vous effectuez dans JS bloquera l'interface utilisateur, si vous voulez minimiser le blocage de l'interface utilisateur, essayez Web Workers .
indexedDB permet un plus grand magasin. Pourquoi ne pas augmenter la taille de la boutique HTML5?
Parce que, sans indexation appropriée, il deviendrait de plus en plus lent à mesure qu'il grossissait.
Ajoutant à la réponse de robert, indexedDB connaît les "plages" afin que vous puissiez rechercher et récupérer tous les enregistrements qui commencent par "ab" et se terminent par abd "pour trouver" abc ", etc.
Je suis tombé sur ce bon article discutant de localstorage vs indexeddb et d'autres options possibles.
(toutes les valeurs ci-dessous sont en millisecondes)
https://nolanlawson.com/2015/09/29/indexeddb-websql-localstorage-what-blocks-the-dom/
Pour résumer l'article (entièrement les vues de l'auteur),
Dans Firefox et Chrome, IndexedDB est plus lent que LocalStorage pour les insertions de valeur-clé de base, et il bloque toujours le DOM. Dans Chrome, il est également plus lent que WebSQL, qui bloque le DOM, mais pas autant. Ce n'est que dans Edge et Safari qu'IndexedDB parvient à s'exécuter en arrière-plan sans interrompre l'interface utilisateur et, ce qui est aggravant, ce sont les deux navigateurs qui n'implémentent que partiellement la spécification IndexedDB.
IndexedDB fonctionne à merveille dans un travailleur Web, où il fonctionne à peu près à la même vitesse mais sans bloquer le DOM. La seule exception est Safari, qui ne prend pas en charge IndexedDB à l'intérieur d'un travailleur, mais il ne bloque toujours pas l'interface utilisateur.
la mémoire locale est idéale si les données sont simples et minimales
Exécutez ce qui suit dans la console du navigateur. Il créera une entité distincte dans Application> Stockage aux côtés de LocalStorage et SessionStorage
const request = indexedDB.open("notes");
request.onupgradeneeded = e => {
alert("upgrade");
}
request.onsuccess = e => {
alert("success");
}
request.onerror = e => {
alert("error");
}
Vous pouvez interroger ce stockage avec toutes les opérations CRUD contrairement aux deux autres stockages qui ont moins de flexibilité et de fonctions pour jouer avec.