Уничтожение и очистка конкретного экземпляра

Библиотека localForage оперирует абстракцией хранилища, внутри которой фактически могут использоваться разные драйверы: IndexedDB, WebSQL или localStorage. При использовании нескольких независимых конфигураций через createInstance формируются логически изолированные хранилища, каждое из которых имеет собственный namespace (имя базы и storeName).

const userStore = localforage.createInstance({
  name: 'app',
  storeName: 'users'
});

const cacheStore = localforage.createInstance({
  name: 'app',
  storeName: 'cache'
});

Каждый такой экземпляр живёт отдельно и управляет собственным набором данных. Это создаёт необходимость точечного управления очисткой и уничтожением данных без затрагивания остальных частей приложения.


Очистка данных внутри экземпляра: метод clear()

Метод clear() полностью удаляет все записи внутри конкретного экземпляра, не затрагивая другие хранилища с тем же name, но другим storeName.

await userStore.clear();

Поведение:

  • очищает только текущий store (storeName);
  • не удаляет саму базу IndexedDB;
  • не влияет на другие экземпляры localForage;
  • работает асинхронно и возвращает Promise.

Применение clear() оправдано в случаях:

  • сброс кэша текущего модуля;
  • очистка временных данных пользователя;
  • переинициализация состояния приложения.

Важно учитывать, что clear() не удаляет структуру хранилища, а лишь обнуляет содержимое.


Уничтожение экземпляра через dropInstance

Для более радикального сценария используется dropInstance. Этот метод удаляет физическое хранилище, связанное с конкретной конфигурацией.

await localforage.dropInstance({
  name: 'app',
  storeName: 'cache'
});

Особенности поведения:

  • удаляет IndexedDB object store (или аналог в другом драйвере);
  • освобождает место на диске;
  • уничтожает все данные без возможности частичного восстановления;
  • влияет только на указанный name + storeName.

Если storeName не указан, поведение зависит от драйвера: может быть удалена вся база, связанная с name.

await localforage.dropInstance({
  name: 'app'
});

Такой вызов фактически приводит к удалению всей базы приложения.


Отличие clear() от dropInstance()

Разница между этими методами критична для архитектуры хранения:

  • clear() Очищает данные внутри существующего хранилища, сохраняя его структуру.

  • dropInstance() Удаляет само хранилище как сущность, включая его структуру на уровне IndexedDB/WebSQL.

Практически это означает:

  • после clear() экземпляр продолжает работать без изменений;
  • после dropInstance() экземпляр теряет физическое хранилище и при следующей операции может быть пересоздан.

Очистка через экземпляр localForage

У экземпляров, созданных через createInstance, также доступен метод clear():

const sessionStore = localforage.createInstance({
  name: 'app',
  storeName: 'session'
});

await sessionStore.clear();

Это эквивалентно вызову clear() на глобальном объекте с теми же параметрами конфигурации, но более безопасно с точки зрения инкапсуляции.

Экземпляр при этом остаётся валидным и может продолжать запись новых данных без повторной инициализации.


Полное удаление базы данных IndexedDB

В сценариях, где требуется уничтожить все данные приложения, включая все store внутри одной базы, используется dropInstance без уточнения storeName.

await localforage.dropInstance({
  name: 'app'
});

Это приводит к удалению всей базы IndexedDB, соответствующей указанному имени. Поведение может отличаться в зависимости от драйвера:

  • IndexedDB: удаляется database целиком;
  • WebSQL: удаляется таблица/база;
  • localStorage: очищаются ключи, соответствующие namespace.

Сценарии точечной очистки нескольких экземпляров

При архитектуре с несколькими экземплярами часто требуется частичное уничтожение данных.

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() управляет физическим хранилищем.

Типичный жизненный цикл:

  1. создание экземпляра;
  2. накопление данных;
  3. частичная очистка через clear();
  4. полное удаление через dropInstance();
  5. повторное создание при необходимости.

Особенности конкурентного доступа при удалении

Удаление хранилища может пересекаться с активными операциями записи или чтения. В таких случаях поведение зависит от драйвера:

  • операции могут быть отложены до завершения транзакции;
  • возможны ошибки при обращении к уже удалённому store;
  • рекомендуется завершать активные операции перед 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() даёт более радикальный эффект:

  • освобождает пространство;
  • удаляет метаданные;
  • устраняет фрагментацию store.

Поэтому для кэш-ориентированных приложений часто предпочтительнее полное удаление, а не логическая очистка.