Версия базы данных в контексте localForage напрямую не представлена
как отдельный параметр конфигурации API. В отличие от «классического»
IndexedDB, где версия базы данных является частью встроенного механизма
миграций схемы, localForage абстрагирует низкоуровневую работу и не
предоставляет явного поля version в config.
Понимание версии в этой библиотеке требует рассмотрения того, как
устроено хранилище под капотом и какие стратегии используются для
изменения структуры данных.
localForage может использовать несколько драйверов хранения, включая IndexedDB, WebSQL (устаревший) и localStorage. Наиболее важным с точки зрения версии является IndexedDB.
В IndexedDB:
onupgradeneededПример логики IndexedDB:
const request = indexedDB.open("appDB", 2);
request.onupgradenee ded = (event) => {
const db = event.target.result;
if (!db.objectStoreNames.contains("users")) {
db.createObjectStore("users");
}
};
localForage скрывает этот механизм и управляет объектным хранилищем автоматически, не предоставляя прямого контроля над числом версии базы данных.
Архитектура localForage ориентирована на упрощение работы с клиентским хранилищем:
Поскольку WebSQL и localStorage не имеют понятия версии базы данных,
введение универсального параметра version в конфигурацию
нарушило бы кросс-драйверную модель библиотеки.
Хотя явного параметра версии нет, в localForage используется косвенная модель управления схемой через:
name — имя базы данныхstoreName — имя хранилища (object store)Изменение этих параметров фактически создаёт новую «логическую версию» структуры данных.
import localforage from "localforage";
localforage.config({
name: "app_v2",
storeName: "users_store"
});
Изменение name или storeName приводит к
созданию новой изолированной области хранения, что по сути эквивалентно
переходу на новую версию схемы.
localForage поддерживает создание независимых экземпляров через
createInstance. Это позволяет реализовывать версионность
вручную.
const v1DB = localforage.createInstance({
name: "app",
storeName: "data_v1"
});
const v2DB = localforage.createInstance({
name: "app",
storeName: "data_v2"
});
Такой подход используется для:
Поскольку автоматического механизма миграций нет, версия данных часто реализуется вручную на уровне приложения.
Типичная стратегия:
await localforage.setItem("schema_version", 2);
const version = await localforage.getItem("schema_version");
if (version === 1) {
// миграция данных в новую структуру
}
Изменение структуры данных без контроля версии может приводить к следующим последствиям:
localForage не выполняет:
Эти операции полностью остаются на стороне разработчика.
Хотя библиотека не экспонирует version, внутри
IndexedDB-драйвера версия базы всё же существует и управляется
автоматически.
При первом создании хранилища localForage:
storeNameОднако увеличение версии базы происходит неявно и не предназначено для прямого использования.
Практическим способом управления «версиями» является создание
отдельных баз данных через изменение name.
const db_v1 = localforage.createInstance({
name: "analytics_v1"
});
const db_v2 = localforage.createInstance({
name: "analytics_v2"
});
Такой подход обеспечивает:
Отсутствие явного параметра версии приводит к ряду архитектурных особенностей:
При этом достигается:
На уровне проектирования localForage чаще всего используется следующая модель:
name — идентификатор приложения или модуляstoreName — логическая область данныхschema_version — версия структуры данных внутри
значенийТакая комбинация заменяет классическую систему версий IndexedDB и обеспечивает управляемую эволюцию хранилища без участия низкоуровневого API браузера.