Библиотека localForage оперирует абстракцией хранилища, внутри
которой фактически могут использоваться разные драйверы: IndexedDB,
WebSQL или localStorage. При использовании нескольких независимых
конфигураций через createInstance формируются логически
изолированные хранилища, каждое из которых имеет собственный namespace
(имя базы и storeName).
const userStore = localforage.createInstance({
name: 'app',
storeName: 'users'
});
const cacheStore = localforage.createInstance({
name: 'app',
storeName: 'cache'
});
Каждый такой экземпляр живёт отдельно и управляет собственным набором данных. Это создаёт необходимость точечного управления очисткой и уничтожением данных без затрагивания остальных частей приложения.
Метод clear() полностью удаляет все записи внутри
конкретного экземпляра, не затрагивая другие хранилища с тем же
name, но другим storeName.
await userStore.clear();
Поведение:
storeName);Применение clear() оправдано в случаях:
Важно учитывать, что clear() не удаляет структуру
хранилища, а лишь обнуляет содержимое.
Для более радикального сценария используется
dropInstance. Этот метод удаляет физическое хранилище,
связанное с конкретной конфигурацией.
await localforage.dropInstance({
name: 'app',
storeName: 'cache'
});
Особенности поведения:
name + storeName.Если storeName не указан, поведение зависит от драйвера:
может быть удалена вся база, связанная с name.
await localforage.dropInstance({
name: 'app'
});
Такой вызов фактически приводит к удалению всей базы приложения.
Разница между этими методами критична для архитектуры хранения:
clear() Очищает данные внутри существующего
хранилища, сохраняя его структуру.
dropInstance() Удаляет само хранилище как сущность,
включая его структуру на уровне IndexedDB/WebSQL.
Практически это означает:
clear() экземпляр продолжает работать без
изменений;dropInstance() экземпляр теряет физическое
хранилище и при следующей операции может быть пересоздан.У экземпляров, созданных через createInstance, также
доступен метод clear():
const sessionStore = localforage.createInstance({
name: 'app',
storeName: 'session'
});
await sessionStore.clear();
Это эквивалентно вызову clear() на глобальном объекте с
теми же параметрами конфигурации, но более безопасно с точки зрения
инкапсуляции.
Экземпляр при этом остаётся валидным и может продолжать запись новых данных без повторной инициализации.
В сценариях, где требуется уничтожить все данные приложения, включая
все store внутри одной базы, используется dropInstance без
уточнения storeName.
await localforage.dropInstance({
name: 'app'
});
Это приводит к удалению всей базы IndexedDB, соответствующей указанному имени. Поведение может отличаться в зависимости от драйвера:
При архитектуре с несколькими экземплярами часто требуется частичное уничтожение данных.
const authStore = localforage.createInstance({
name: 'app',
storeName: 'auth'
});
const tempStore = localforage.createInstance({
name: 'app',
storeName: 'temp'
});
await tempStore.clear();
В этом случае очищается только временное хранилище, а данные аутентификации остаются нетронутыми.
Если требуется полный сброс состояния:
await Promise.all([
authStore.clear(),
tempStore.clear()
]);
Если требуется физическое удаление:
await localforage.dropInstance({ name: 'app' });
После вызова dropInstance следующая операция записи или
чтения приводит к созданию нового хранилища с теми же параметрами:
await localforage.dropInstance({ name: 'app', storeName: 'cache' });
await cacheStore.setItem('key', 'value');
В этом случае IndexedDB store будет создан заново автоматически при первой записи. Это важное свойство делает localForage устойчивым к полному сбросу данных.
При работе с динамическими экземплярами важно учитывать, что JavaScript-объект и физическое хранилище — разные сущности.
createInstance создаёт программный интерфейс;clear() управляет данными внутри хранилища;dropInstance() управляет физическим хранилищем.Типичный жизненный цикл:
clear();dropInstance();Удаление хранилища может пересекаться с активными операциями записи или чтения. В таких случаях поведение зависит от драйвера:
dropInstance.Пример безопасного сценария:
await cacheStore.clear();
await localforage.dropInstance({
name: 'app',
storeName: 'cache'
});
При изменении структуры данных часто используется комбинированный подход:
await localforage.dropInstance({ name: 'app', storeName: 'oldSchema' });
const newStore = localforage.createInstance({
name: 'app',
storeName: 'newSchema'
});
Такой подход позволяет полностью избавиться от устаревших форматов без попыток миграции на уровне записей.
clear() не уменьшает физический размер базы данных сразу
во всех драйверах. В IndexedDB освобождение места может происходить
асинхронно и зависеть от реализации браузера.
dropInstance() даёт более радикальный эффект:
Поэтому для кэш-ориентированных приложений часто предпочтительнее полное удаление, а не логическая очистка.