В среде браузера без сборщика основным способом подключения
становится загрузка библиотеки напрямую из CDN с использованием
<script>-тега. В этом режиме localForage
добавляется в глобальную область видимости и становится доступен через
window.localforage.
<script src="https://cdnjs.cloudflare.com/ajax/libs/localforage/1.10.0/localforage.min.js"></script>
<script>
console.log(window.localforage);
</script>
После подключения глобальный объект предоставляет полный API
библиотеки, включая асинхронные методы хранения и получения данных.
Важно учитывать, что порядок загрузки скриптов имеет значение: любые
обращения к localforage должны происходить только после
загрузки библиотеки.
В классическом режиме без модулей библиотека становится доступна
через идентификатор localforage. Он идентичен
window.localforage, но предпочтительнее использовать прямую
ссылку для читаемости кода.
localforage.setItem('key', 'value');
Внутренне библиотека автоматически выбирает наиболее подходящий механизм хранения:
Выбор происходит автоматически при инициализации.
Все операции в localForage асинхронны и возвращают
Promise.
localforage.setItem('user', {
name: 'Alex',
age: 30
}).then(value => {
console.log('Сохранено:', value);
});
Метод setItem поддерживает любые типы данных,
совместимые с алгоритмом structured clone: объекты, массивы, строки,
числа, даты, Blob и другие структуры.
localforage.getItem('user').then(value => {
console.log('Получено:', value);
});
Если ключ отсутствует, возвращается null.
localforage.removeItem('user').then(() => {
console.log('Удалено');
});
localforage.clear().then(() => {
console.log('Хранилище очищено');
});
localforage.keys().then(keys => {
console.log(keys);
});
localforage.length().then(numberOfKeys => {
console.log(numberOfKeys);
});
В браузере без сборщика особенно важно разделять данные по логическим
пространствам. Это достигается через createInstance.
const userStore = localforage.createInstance({
name: 'appDatabase',
storeName: 'users'
});
const settingsStore = localforage.createInstance({
name: 'appDatabase',
storeName: 'settings'
});
name — имя базы данных (используется IndexedDB)storeName — имя хранилища внутри базыdescription — описание (используется редко, но
поддерживается)Каждый экземпляр работает независимо, включая отдельные ключи и пространство данных.
В браузерной среде без сборщика часто важно явно управлять порядком fallback-драйверов, особенно при работе в ограниченных средах (старые WebView, приватные режимы).
localforage.config({
driver: [
localforage.INDEXEDDB,
localforage.WEBSQL,
localforage.LOCALSTORAGE
],
name: 'appDatabase',
storeName: 'mainStore'
});
INDEXEDDB — основной современный механизмWEBSQL — устаревший, но иногда доступенLOCALSTORAGE — синхронное хранилище с
ограничениямиНесмотря на наличие localStorage как fallback, API
localForage всегда остаётся асинхронным. Это унифицирует
работу с данными вне зависимости от выбранного драйвера.
console.log('A');
localforage.setItem('x', 1).then(() => {
console.log('B');
});
console.log('C');
Порядок вывода будет:
A
C
B
Такой подход позволяет избежать блокировки основного потока выполнения.
В отличие от localStorage, который хранит только строки,
localForage использует сериализацию, основанную на
structured clone algorithm.
Поддерживаемые типы:
const data = {
title: 'Document',
created: new Date(),
buffer: new Uint8Array([1, 2, 3])
};
localforage.setItem('doc', data);
Каждая операция может завершиться ошибкой, особенно при превышении квоты или отключённом хранилище.
localforage.setItem('bigData', hugeObject)
.then(() => {
console.log('OK');
})
.catch(err => {
console.error('Ошибка записи:', err);
});
Типичные причины ошибок:
Перед активным использованием полезно проверить доступные драйверы.
localforage.supports(localforage.INDEXEDDB);
localforage.supports(localforage.WEBSQL);
localforage.supports(localforage.LOCALSTORAGE);
Возвращается true или false.
localforage.getDriver().then(driver => {
console.log(driver);
});
Это полезно при диагностике поведения приложения в разных браузерах.
Даже без сборщика можно использовать модульную загрузку:
<script type="module">
import localforage from 'https://cdn.jsdelivr.net/npm/localforage/+esm';
await localforage.setItem('test', 123);
const value = await localforage.getItem('test');
console.log(value);
</script>
В этом режиме библиотека ведёт себя как ES-модуль, а код становится
совместимым с современным синтаксисом async/await.
В браузерной среде без сборщика поведение зависит от движка:
localForage скрывает различия, но ограничения всё равно
проявляются на уровне объёма данных и доступности API.
При изменении структуры приложения важно учитывать, что разные версии
приложения могут использовать разные storeName или
name.
localforage.config({
name: 'app_v2'
});
Старые данные остаются в прежней базе и не перезаписываются автоматически. Для миграции требуется ручное чтение из старого хранилища и перенос в новое.
При работе без bundler-системы (Webpack, Vite, Rollup) возникают специфические ограничения:
Поэтому важным становится контроль порядка загрузки и явная инициализация конфигурации до первого обращения к API.
Повторное вызовы config или createInstance
не сбрасывают уже сохранённые данные, но могут изменить контекст
доступа:
localforage.config({ name: 'app1' });
localforage.config({ name: 'app2' });
После этого операции будут выполняться уже в новой базе, а старая останется неизменной.
В отличие от JSON-сериализации, используемой в
localStorage, механизм хранения localForage
сохраняет структуру объектов более точно.
Однако некоторые типы всё же теряют часть данных:
const obj = {};
obj.self = obj; // циклическая ссылка
localforage.setItem('bad', obj); // ошибка сериализации
При использовании без сборщика критически важно соблюдать последовательность:
<script> с библиотекойconfigcreateInstance (при необходимости)setItem/getItemНарушение порядка может приводить к использованию дефолтных настроек или неожиданному выбору драйвера.
Одним из ключевых сценариев использования становится офлайн-хранение
данных. При отключении сети localForage продолжает
работать, поскольку использует локальные механизмы браузера.
localforage.setItem('offlineQueue', [
{ action: 'save', id: 1 },
{ action: 'delete', id: 2 }
]);
Данные сохраняются независимо от сетевого состояния и доступны при следующей загрузке страницы.
Если пользователь очищает данные сайта, все хранилища
localForage удаляются вместе с IndexedDB и localStorage.
Библиотека не предоставляет механизмов восстановления, так как работает
поверх браузерного слоя хранения.