javascript42
Главная
Все учебники
Блог
Учебник Idb-keyval
Введение в idb-keyval
Что такое IndexedDB и зачем нужна обёртка
Место idb-keyval среди других решений для хранения данных
Когда использовать idb-keyval, а когда нет
Установка и подключение библиотеки
Обзор API: минимализм как философия
Основы работы с хранилищем
Операция get: чтение значения по ключу
Операция set: запись и перезапись значения
Операция del: удаление записи
Операция clear: полная очистка хранилища
Операция keys: получение списка ключей
Операция values: получение всех значений
Операция entries: получение пар ключ-значение
Поведение при отсутствующем ключе
Порядок возврата данных и его непредсказуемость
Асинхронная природа idb-keyval
Промисы как основа всех операций
Использование async/await с idb-keyval
Обработка ошибок через try/catch
Параллельное выполнение операций с Promise.all
Последовательные операции и гонки состояний
Почему нельзя использовать idb-keyval синхронно
Типы данных и сериализация
Что можно хранить: структурированное клонирование
Примитивы: строки, числа, булевы значения
Объекты и массивы
Даты, Map, Set, ArrayBuffer
Blob и File: хранение бинарных данных
Что нельзя хранить: функции, символы, прокси
Вложенные структуры и их ограничения
Хранение JSON: когда нужна ручная сериализация
Ключи в idb-keyval
Допустимые типы ключей
Строковые ключи и соглашения об именовании
Числовые ключи и их особенности
Составные ключи через разделители
Ключи на основе идентификаторов сущностей
Коллизии ключей и стратегии их предотвращения
Кастомные хранилища
Ограничения хранилища по умолчанию
Создание кастомного хранилища через createStore
Параметры createStore: имя базы и имя хранилища
Несколько хранилищ в одном приложении
Изоляция данных между модулями через отдельные хранилища
Совместное использование хранилища между вкладками
Жизненный цикл кастомного хранилища
Удаление базы данных средствами IndexedDB API
Операция update: атомарное обновление
Что такое update и зачем он нужен
Отличие update от последовательности get/set
Функция-трансформер и её контракт
Обработка случая, когда ключ не существует
Атомарность update и её реальные границы
Практические паттерны с update: счётчики, очереди, флаги
Вложенное обновление объектов через update
Ошибки и откат транзакции внутри update
Работа с коллекциями данных
Хранение каждой записи под отдельным ключом
Сравнение подходов: один ключ против множества ключей
Реализация пагинации без встроенных индексов
Фильтрация через values и entries
Сортировка на стороне клиента
Подсчёт записей
Реализация простого поиска по значениям
Производительность и ограничения
Накладные расходы на каждую транзакцию
Батчинг операций для снижения накладных расходов
Размер хранилища: квоты браузеров
Как браузер запрашивает разрешение на расширение квоты
Storage API: проверка доступного пространства
Влияние размера значения на скорость чтения и записи
Сравнение производительности с localStorage
Профилирование операций idb-keyval в DevTools
Использование в браузерном окружении
Доступность IndexedDB в разных браузерах
Поведение в режиме инкогнито
Блокировки и конкурентный доступ из нескольких вкладок
Событие storage и его отсутствие для IndexedDB
Синхронизация состояния между вкладками через BroadcastChannel
Использование в Service Worker
Ограничения в iframe и cross-origin контексте
Интеграция с фреймворками
Использование в чистом JavaScript без фреймворка
Интеграция с React: хуки и управление состоянием
Персистентность состояния Zustand через idb-keyval
Персистентность состояния Jotai через atomWithStorage
Интеграция с Vue: composables поверх idb-keyval
Использование в Svelte: store с персистентностью
Инициализация хранилища до рендера компонентов
Гидратация состояния на клиенте
Персистентность состояния приложения
Сохранение пользовательских настроек
Кэширование ответов API
Черновики и автосохранение форм
Офлайн-очередь отложенных запросов
Хранение токенов и чувствительных данных: что допустимо
Синхронизация локального состояния с сервером
Инвалидация кэша: стратегии и реализация
Версионирование сохранённых данных
Миграции и версионирование
Проблема эволюции схемы данных
Хранение версии схемы в idb-keyval
Ручные миграции при старте приложения
Стратегия миграции с трансформацией значений
Удаление устаревших ключей
Переименование ключей и перемещение данных между хранилищами
Когда idb-keyval недостаточно и нужен переход на idb
Тестирование кода с idb-keyval
Проблема IndexedDB в среде Node.js и Jest
Мокирование idb-keyval в юнит-тестах
Использование fake-indexeddb для интеграционных тестов
Сброс состояния хранилища между тестами
Тестирование асинхронных операций
Тестирование поведения при ошибках хранилища
Тестирование миграций
Обработка ошибок и устойчивость
Классификация ошибок IndexedDB
QuotaExceededError: обнаружение и реакция
Ошибки при заблокированной базе данных
Недоступность IndexedDB в окружении
Стратегия fallback на localStorage
Универсальная обёртка с обработкой ошибок
Логирование ошибок хранилища
Деградация функциональности при недоступном хранилище
Безопасность и приватность
Изоляция данных по origin
Что означает персистентность для приватности пользователя
Очистка данных при выходе из аккаунта
Хранение чувствительных данных: риски и альтернативы
Шифрование значений перед сохранением
Аудит хранимых данных в DevTools
Устройство idb-keyval изнутри
Исходный код библиотеки: архитектура и размер
Как idb-keyval открывает и переиспользует соединение
Транзакции внутри каждой операции
Почему библиотека не поддерживает индексы и курсоры
Отличия idb-keyval от полноценной библиотеки idb
Случаи, когда стоит отказаться от idb-keyval в пользу idb