Кастомный драйвер в localForage представляет собой объект,
реализующий строго определённый интерфейс хранения данных. Его задача —
обеспечить единый API (getItem, setItem,
removeItem, clear и др.) поверх любого
механизма хранения: памяти, IndexedDB, WebSQL, cookies или внешнего
API.
Минимальная реализация драйвера сводится к созданию простого
хранилища в памяти, которое соответствует требованиям localForage и
может быть зарегистрировано через defineDriver.
Любой драйвер localForage обязан содержать:
уникальный идентификатор _driver
метод проверки поддержки _support
инициализацию _initStorage
базовые операции CRUD:
getItemsetItemremoveItemclearlengthkeyДополнительно могут присутствовать методы итерации и расширенные API, но для минимального драйвера они не обязательны.
Простейшая реализация строится на обычном объекте JavaScript, который используется как словарь ключ-значение.
const MemoryDriver = {
_driver: 'memoryDriver',
_initStorage: function (options) {
this._store = {};
this._config = options || {};
return Promise.resolve();
},
_support: function () {
return true;
},
getItem: function (key) {
const value = this._store[key];
return Promise.resolve(value === undefined ? null : value);
},
setItem: function (key, value) {
this._store[key] = value;
return Promise.resolve(value);
},
removeItem: function (key) {
delete this._store[key];
return Promise.resolve();
},
clear: function () {
this._store = {};
return Promise.resolve();
},
length: function () {
return Promise.resolve(Object.keys(this._store).length);
},
key: function (n) {
const keys = Object.keys(this._store);
return Promise.resolve(keys[n] || null);
}
};
localForage ожидает, что все методы драйвера будут возвращать
Promise. Даже синхронные операции должны быть обёрнуты в
промисы, поскольку библиотека унифицирует асинхронное поведение
независимо от backend-хранилища.
Ключевые требования:
null как значением отсутствия
данныхПосле создания объекта драйвера он регистрируется в localForage через
defineDriver.
import localForage from 'localforage';
localForage.defineDriver(MemoryDriver);
После регистрации драйвер становится доступным для использования:
localForage.setDriver('memoryDriver');
При использовании кастомного драйвера localForage проходит несколько этапов:
Проверка поддержки Вызывается
_support, чтобы определить, можно ли использовать драйвер в
текущей среде.
Инициализация _initStorage создаёт
внутренние структуры хранения.
Операции чтения/записи getItem и
setItem используются для доступа к данным.
Управление данными removeItem,
clear, length, key обеспечивают
контроль состояния хранилища.
В минимальном драйвере используется простая структура:
this._store = {};
Она ведёт себя как:
undefined, но наружу
возвращается nullТакое поведение соответствует стандарту localForage, где
null используется как универсальный маркер отсутствия
значения.
Даже в синхронной реализации важно сохранять асинхронный контракт:
return Promise.resolve(value);
Это обеспечивает:
.then()Для учебных целей можно оставить только строго необходимые методы:
_driver_initStorage_supportgetItemsetItemremoveItemclearМетоды length и key формально не
обязательны для самой базовой работы, но без них теряется совместимость
с частью API localForage, использующей перечисление ключей.
После установки драйвера можно создать отдельный экземпляр, использующий только его:
const store = localforage.createInstance({
name: 'memory-db',
driver: 'memoryDriver'
});
Такой экземпляр полностью изолирован от IndexedDB и других встроенных драйверов.
Каждый вызов _initStorage должен сбрасывать внутреннее
состояние:
this._store = {};
Это критично для корректного поведения при переключении драйверов или создании новых экземпляров с тем же драйвером.
Минимальный драйвер обычно не реализует сложную систему ошибок, но базовые принципы сохраняются:
При необходимости можно расширить поведение через
Promise.reject(new Error(...)), но в минимальной версии это
не требуется.
Хотя базовая реализация использует объект, её можно постепенно расширять:
Map для предсказуемого порядка ключейОднако базовый контракт localForage остаётся неизменным: асинхронные методы, ключ-значение модель и строгая совместимость интерфейса драйвера.