Хранение данных в браузере всегда связано с преобразованием структур
JavaScript в формат, пригодный для долговременного хранения. В контексте
localForage сериализация через JSON выступает как один из ключевых
механизмов обеспечения совместимости, особенно при работе с драйвером
localStorage, где возможны только строковые значения.
Сериализация определяет способ преобразования объектов, массивов, примитивов и сложных структур в строковое представление, а обратная десериализация восстанавливает исходное состояние данных при чтении из хранилища.
localForage абстрагирует доступ к различным механизмам хранения:
Каждый из этих механизмов имеет собственные особенности хранения
данных. Ключевая проблема заключается в том, что
localStorage поддерживает только строковый формат. Именно
здесь JSON становится универсальным решением.
При использовании localForage разработчик работает с объектами напрямую, однако внутри системы происходит преобразование данных в формат, совместимый с выбранным драйвером. В случае строкового хранилища используется JSON-сериализация.
JSON (JavaScript Object Notation) представляет собой текстовый формат обмена данными, основанный на подмножестве JavaScript-объектов.
Основные операции:
JSON.stringify(value) — преобразование объекта в
строкуJSON.parse(string) — восстановление объекта из
строкиПример базового преобразования:
const state = {
user: "alex",
theme: "dark",
count: 42
};
const serialized = JSON.stringify(state);
const restored = JSON.parse(serialized);
В контексте localForage аналогичная логика применяется при необходимости работы со строковыми драйверами.
localForage скрывает детали сериализации, предоставляя единый API:
import localForage from "localforage";
await localForage.setItem("settings", {
theme: "dark",
fontSize: 16
});
const settings = await localForage.getItem("settings");
Внутренне происходят разные процессы в зависимости от драйвера:
Таким образом, JSON не является единственным механизмом, но играет ключевую роль в совместимости.
Несмотря на универсальность, JSON имеет ряд ограничений, которые критичны при работе с localForage.
JSON поддерживает ограниченный набор типов:
Не поддерживаются напрямую:
DateMapSetundefinedBigIntПример проблемы с датой:
const data = {
createdAt: new Date()
};
const serialized = JSON.stringify(data);
const parsed = JSON.parse(serialized);
parsed.createdAt instanceof Date; // false
Дата превращается в строку и требует ручного восстановления.
Для восстановления типов используется постобработка:
await localForage.setItem("task", {
title: "Report",
createdAt: new Date().toISOString()
});
const task = await localForage.getItem("task");
task.createdAt = new Date(task.createdAt);
JSON позволяет управлять сериализацией:
const serialized = JSON.stringify(obj, (key, value) => {
if (value instanceof Date) {
return { __type: "date", value: value.toISOString() };
}
return value;
});
const parsed = JSON.parse(serialized, (key, value) => {
if (value && value.__type === "date") {
return new Date(value.value);
}
return value;
});
Этот подход позволяет частично восстановить типизацию при работе с localForage через строковые драйверы.
JSON не поддерживает циклические ссылки. При попытке сериализации возникает ошибка:
const obj = {};
obj.self = obj;
JSON.stringify(obj); // TypeError
В контексте localForage это ограничение важно при хранении сложных графов данных.
Возможные решения:
JSON-сериализация влияет на производительность при больших объемах данных.
Факторы:
Сложные объекты требуют значительных вычислительных затрат на:
В IndexedDB этот процесс отсутствует, так как используется structured clone, что делает его более эффективным для больших структур.
Важно различать два подхода:
localForage автоматически выбирает стратегию в зависимости от доступного драйвера, что делает поведение непредсказуемым без учета окружения.
При проектировании структуры данных необходимо учитывать различие между драйверами.
Пример сложного объекта:
const session = {
id: 123,
user: {
name: "Alex",
permissions: new Set(["read", "write"])
},
createdAt: new Date()
};
При сохранении:
Это создаёт необходимость нормализации данных перед сохранением.
JSON не выполняет код, что делает его безопасным для хранения данных.
Однако при восстановлении данных через JSON.parse
необходимо учитывать:
localForage не накладывает строгую схему, поэтому ответственность за целостность структуры лежит на прикладной логике.
JSON-сериализация эффективно работает в следующих сценариях:
Менее эффективна при:
Ошибки JSON-сериализации могут возникать в момент сохранения:
localForage в таких случаях может:
Поэтому структура данных должна быть заранее подготовлена к сериализации.
Практика подготовки данных включает нормализацию:
Пример нормализации:
function normalize(data) {
return {
...data,
createdAt: data.createdAt?.toISOString?.() ?? null,
tags: Array.from(data.tags || [])
};
}
Такая подготовка снижает зависимость от конкретного драйвера localForage.
JSON выступает как универсальный слой совместимости между ограниченными строковыми хранилищами и объектной моделью JavaScript. Его использование особенно критично в сценариях, где доступен только localStorage, тогда как в IndexedDB сериализация фактически заменяется нативным механизмом structured clone.