Idb-keyval — это легковесная обертка над IndexedDB, предназначенная для упрощения операций с асинхронным хранилищем ключ–значение в браузере. Она идеально подходит для реализации черновиков и автосохранения данных форм, так как позволяет хранить объёмные объекты без необходимости ручного управления транзакциями и схемой IndexedDB.
Основной принцип работы библиотеки заключается в хранении объектов JavaScript напрямую под уникальными ключами. Это даёт возможность асинхронно сохранять состояние формы и восстанавливать его при следующем посещении страницы.
Idb-keyval можно подключить через npm или CDN:
import { set, get, del, upd ate } from 'idb-keyval';
Ключевые функции:
set(key, value) — сохраняет значение под указанным
ключом.get(key) — возвращает значение по ключу, если оно
существует.del(key) — удаляет запись.upd ate(key, updater) — обновляет существующее значение
с помощью функции обновления.Пример сохранения состояния формы:
const formState = {
name: 'Иван',
email: 'ivan@example.com',
message: 'Привет!'
};
se t('contactForm', formState);
Для получения данных:
get('contactForm').then(data => {
if (data) {
console.log(data.name); // Иван
}
});
Автосохранение реализуется через события изменения полей
формы и периодическое сохранение состояния. Для этого
используют обработчики событий input или
change.
Пример:
const form = document.querySelector('#contactForm');
form.addEventListener('input', () => {
const formData = {
name: form.name.value,
email: form.email.value,
message: form.message.value
};
se t('contactForm', formData);
});
Это обеспечивает сохранение каждого изменения без задержек, а данные остаются доступными даже при перезагрузке страницы или неожиданном закрытии браузера.
Для восстановления данных используется функция get.
После загрузки страницы можно автоматически заполнить форму:
get('contactForm').then(data => {
if (data) {
form.name.value = data.name || '';
form.email.value = data.email || '';
form.message.value = data.message || '';
}
});
Важно проверять наличие данных, так как get возвращает
undefined, если ключ не существует.
Idb-keyval предоставляет функцию update, которая
позволяет модифицировать конкретные поля без необходимости
перезаписывать весь объект:
upd ate('contactForm', oldData => ({
...oldData,
message: 'Новое сообщение'
}));
Это особенно полезно для больших форм, где частые изменения затрагивают только отдельные поля.
Для удаления данных черновика после успешной отправки формы
используется del:
form.addEventListener('submit', event => {
event.preventDefault();
// Отправка формы на сервер
del('contactForm');
});
Таким образом, хранилище остаётся чистым, и прошлые черновики не будут мешать новым.
Idb-keyval легко масштабируется для нескольких форм. Рекомендуется использовать уникальные ключи для каждой формы:
set('settingsForm', settingsData);
se t('profileForm', profileData);
При восстановлении данных форм достаточно вызвать get с
соответствующим ключом. Это позволяет хранить черновики нескольких
страниц или секций интерфейса независимо друг от друга.
Все операции с Idb-keyval асинхронные. Важно учитывать, что:
set и update возвращают промис, который
разрешается после завершения записи.get и del также возвращают промис.Для высоконагруженных форм рекомендуется дебаунсинг событий ввода, чтобы не выполнять запись в IndexedDB слишком часто:
let timeout;
form.addEventListener('input', () => {
clearTimeout(timeout);
timeout = setTimeout(() => {
const data = {
name: form.name.value,
email: form.email.value,
message: form.message.value
};
set('contactForm', data);
}, 300);
});
Idb-keyval автоматически сериализует объекты в формат JSON, поэтому
можно хранить масивы, объекты, числа, строки, boolean,
но стоит избегать функций и DOM-элементов, так как они
не сериализуются корректно. Для хранения изображений или файлов можно
использовать Blob или ArrayBuffer.
contactForm_v1,
contactForm_v2. Это позволяет откатываться к предыдущей
версии.createStore(name, storeName), что полезно для изоляции
данных разных модулей.Idb-keyval предоставляет лёгкий и гибкий инструмент для реализации черновиков и автосохранения форм, позволяя хранить сложные объекты асинхронно, без лишней нагрузки и сложной работы с IndexedDB напрямую.