javascript42
Главная
Все учебники
Блог
Учебник Dexie.js
Введение в Dexie.js
Что такое Dexie.js и зачем она нужна
Сравнение с нативным IndexedDB API
Сравнение с другими обёртками: localForage, idb, PouchDB
Когда использовать Dexie.js, а когда нет
Установка и подключение библиотеки
Совместимость с браузерами и средами выполнения
Основы IndexedDB
Архитектура IndexedDB: базы данных, хранилища, транзакции
Асинхронная природа IndexedDB
Ключи, индексы и курсоры
Ограничения и квоты хранилища
Жизненный цикл базы данных и версионирование
Создание и настройка базы данных
Объявление схемы через Dexie
Синтаксис описания хранилищ и индексов
Первичные ключи: автоинкремент, явные, составные
Уникальные и мультиэнтри-индексы
Составные индексы
Открытие соединения и обработка события ready
Закрытие и удаление базы данных
Версионирование и миграции
Концепция версий в Dexie
Метод version().stores()
Метод version().upgrade()
Последовательные миграции между версиями
Добавление и удаление хранилищ при апгрейде
Переименование полей и преобразование данных
Обработка ошибок при миграции
Стратегии тестирования миграций
Базовые операции с данными
Добавление записей: add()
Вставка с перезаписью: put()
Получение по ключу: get()
Обновление записей: update()
Удаление записей: delete()
Очистка хранилища: clear()
Пакетные операции: bulkAdd(), bulkPut(), bulkGet(), bulkDelete()
Обработка дублирующихся ключей при пакетных операциях
Транзакции
Что такое транзакция в контексте Dexie
Явные транзакции через db.transaction()
Режимы транзакций: readonly и readwrite
Вложенные транзакции
Автоматические транзакции в одиночных операциях
Повторное использование транзакции между вызовами
Прерывание транзакции: abort()
Обработка ошибок и откат транзакции
Ограничения времени жизни транзакции в IndexedDB
Запросы и фильтрация данных
Объект Table и цепочка вызовов
Метод toArray() и toCollection()
Фильтрация через where()
Операторы сравнения: equals, above, below, between, startsWith
Фильтрация по составному индексу
Метод filter() для произвольных условий
Ограничение выборки: limit() и offset()
Сортировка: sortBy() и reverse()
Подсчёт записей: count()
Проверка существования: first(), last()
Итерирование через each()
Метод primaryKeys() и keys()
Продвинутые запросы
Запросы по нескольким значениям: anyOf(), noneOf()
Диапазонные запросы с составными ключами
Метод where() с составным индексом через [field1+field2]
Объединение результатов из нескольких хранилищ вручную
Запросы с inAnyRange()
Использование Collection API: and(), or()
Логика пересечения множеств через intersect()
Запросы на основе курсора через openCursor()
Производительность запросов и выбор стратегии индексирования
Работа со связанными данными
Моделирование отношений один-ко-многим
Моделирование отношений многие-ко-многим
Ручные джойны через Promise.all()
Загрузка связанных записей по внешнему ключу
Каскадное удаление связанных данных
Денормализация как альтернатива джойнам
Хуки и перехватчики
Система хуков в Dexie
Хук creating
Хук reading
Хук updating
Хук deleting
Порядок выполнения хуков
Использование хуков для аудита и логирования
Использование хуков для вычисляемых полей
Отключение хуков
Наблюдение за изменениями (Live Queries)
Концепция реактивности в Dexie
Dexie.liveQuery(): основы
Подписка на изменения в хранилище
Зависимости и перевычисление запроса
Интеграция liveQuery с промисами и асинхронным кодом
Отписка и управление жизненным циклом подписки
Ограничения и подводные камни liveQuery
Интеграция с фреймворками
Использование с React: хук useLiveQuery
Использование с Vue: реактивные обёртки
Использование с Angular: сервисы и зоны
Использование с Svelte: stores и liveQuery
Инициализация базы данных как singleton
Типичные ошибки при интеграции с фреймворками
TypeScript и типизация
Подключение типов Dexie
Типизация схемы через интерфейсы
Расширение класса Dexie для типизированных таблиц
Типизация миграций
Generics в запросах и коллекциях
Частые проблемы с типами и их решения
Синхронизация и репликация
Концепция Dexie Cloud
Аутентификация и авторизация в Dexie Cloud
Синхронизация данных между устройствами
Разрешение конфликтов
Оффлайн-режим и отложенная синхронизация
Зоны доступа и разграничение данных между пользователями
Настройка собственного сервера синхронизации
Протокол синхронизации Dexie Cloud
Производительность и оптимизация
Профилирование операций с IndexedDB
Выбор правильных индексов
Влияние количества индексов на запись
Оптимизация пакетных операций
Стратегии пагинации больших наборов данных
Кэширование результатов запросов
Уменьшение размера хранимых объектов
Работа с большими бинарными данными (Blob, ArrayBuffer)
Обработка ошибок
Типы ошибок в Dexie
ConstraintError и дубликаты ключей
QuotaExceededError и управление квотой
VersionError и конфликты версий
AbortError и прерванные транзакции
Глобальный обработчик ошибок
Отладка в DevTools
Тестирование
Тестирование кода с Dexie в Node.js
Использование fake-indexeddb для unit-тестов
Настройка тестовой базы данных
Изоляция тестов и сброс состояния
Тестирование миграций
Тестирование хуков и live-запросов
Интеграция с Jest и Vitest
Паттерны и архитектура
Repository pattern поверх Dexie
Слой абстракции над схемой
Управление singleton-экземпляром базы данных
Разделение схемы на модули
Версионирование схемы в командной разработке
Работа с несколькими базами данных в одном приложении
Динамическое создание хранилищ