Метод setDriver в localForage предназначен для динамического выбора механизма хранения данных во время выполнения. Он позволяет переключать используемый драйвер между доступными реализациями (IndexedDB, WebSQL, localStorage), а также задавать предпочтительный порядок их использования с учётом возможностей среды.
Внутренняя архитектура localForage построена на концепции абстракции над различными браузерными хранилищами. Каждый драйвер реализует единый интерфейс, но использует разные технологии:
Метод setDriver позволяет принудительно переключить активный драйвер, минуя автоматический механизм выбора. Это важно в сценариях, где требуется:
localforage.setDriver(driverName);
или с использованием массива драйверов:
localforage.setDriver([
localforage.INDEXEDDB,
localforage.WEBSQL,
localforage.LOCALSTORAGE
]);
Метод возвращает Promise, который резолвится после успешной активации драйвера.
localforage.setDriver(localforage.INDEXEDDB)
.then(() => {
// драйвер установлен
})
.catch((err) => {
// ошибка установки драйвера
});
В localForage определены стандартные константы драйверов:
localforage.INDEXEDDB
Наиболее современный и производительный механизм хранения. Поддерживает асинхронную работу и большие объёмы данных. Используется как основной драйвер в современных браузерах.
Особенности:
localforage.WEBSQL
Устаревший, но всё ещё встречающийся в некоторых браузерах драйвер. Основан на SQL-подобной модели.
Особенности:
localforage.LOCALSTORAGE
Самый простой и универсальный вариант хранения.
Особенности:
Метод setDriver не просто переключает активный драйвер, а полностью перестраивает внутренний слой доступа к данным.
При вызове setDriver выполняется:
Если драйвер недоступен, Promise отклоняется с ошибкой.
При передаче массива драйверов происходит последовательная попытка инициализации:
localforage.setDriver([
localforage.INDEXEDDB,
localforage.WEBSQL,
localforage.LOCALSTORAGE
]);
Логика работы:
Этот механизм позволяет обеспечить максимальную совместимость при сохранении производительности.
import localforage from "localforage";
localforage.setDriver(localforage.INDEXEDDB)
.then(() => {
return localforage.setItem("user", { name: "Alex" });
})
.then(() => localforage.getItem("user"))
.then(value => {
console.log(value);
});
В этом сценарии гарантируется использование только IndexedDB без fallback.
localforage.setDriver([
localforage.INDEXEDDB,
localforage.LOCALSTORAGE
])
.then(() => localforage.setItem("token", "abc123"));
Здесь WebSQL исключён, что может быть полезно при отказе от устаревших технологий.
async function switchStorage(useFast) {
if (useFast) {
await localforage.setDriver(localforage.INDEXEDDB);
} else {
await localforage.setDriver(localforage.LOCALSTORAGE);
}
await localforage.setItem("mode", useFast);
}
Метод setDriver тесно связан с конфигурацией экземпляра localForage. При смене драйвера:
Важно учитывать, что setDriver влияет только на текущий экземпляр. Если используется несколько инстансов localForage, каждый из них управляет драйвером независимо.
При работе с setDriver возможны следующие типы ошибок:
Error: Invalid driver name
Возникает при передаче неизвестного идентификатора.
Error: No available storage method found
Появляется, если ни один из указанных драйверов не поддерживается.
Error: Failed to open storage
Связана с ограничениями браузера, приватным режимом или повреждённым состоянием хранилища.
IndexedDB используется по умолчанию. setDriver обычно выполняется мгновенно, без fallback.
Полная поддержка IndexedDB и LocalStorage. WebSQL отсутствует.
IndexedDB может иметь ограничения в приватном режиме. В таких случаях fallback на LocalStorage становится критически важным.
Использование setDriver позволяет жёстко закрепить IndexedDB для больших приложений:
await localforage.setDriver(localforage.INDEXEDDB);
Это снижает задержки при чтении и записи больших объектов.
Для старых устройств можно задать fallback:
await localforage.setDriver([
localforage.LOCALSTORAGE
]);
При юнит-тестировании часто используется LocalStorage как наиболее предсказуемый драйвер:
beforeEach(async () => {
await localforage.setDriver(localforage.LOCALSTORAGE);
});
При вызове setDriver происходит пересборка внутреннего core-объекта:
Это означает, что операции, находящиеся в процессе выполнения, могут быть прерваны или завершены до смены драйвера, но новые запросы уже будут направлены в новый backend.
setDriver работает в связке с:
При этом смена драйвера не влияет на API-уровень: интерфейс остаётся неизменным, меняется только реализация.
Повторный вызов setDriver:
await localforage.setDriver(localforage.INDEXEDDB);
await localforage.setDriver(localforage.LOCALSTORAGE);
приводит к полной переинициализации storage backend. Это может быть полезно для переключения режимов работы приложения без перезагрузки страницы.
Однако частые переключения могут снижать производительность из-за постоянной пересборки контекста хранения.
setDriver является ключевым механизмом управления уровнем абстракции в localForage. Он отделяет:
Благодаря этому обеспечивается переносимость кода между различными платформами без изменения бизнес-логики.