Реактивность в контексте Dexie.js означает автоматическое обновление вычисляемых значений и представлений данных при изменении состояния IndexedDB. В отличие от классического императивного подхода, где состояние запрашивается вручную, реактивная модель строится вокруг подписок на изменения и потоков обновлений.
IndexedDB изначально не предоставляет встроенного механизма наблюдения за изменениями данных. Поэтому реактивность в Dexie реализуется поверх транзакционной модели базы данных и строится как дополнительный слой абстракции. Этот слой позволяет связывать чтение данных с их жизненным циклом и автоматически повторно выполнять запросы при изменениях.
Ключевая особенность реактивности в Dexie заключается в том, что она не является частью ядра IndexedDB, а реализуется через наблюдателей, обёртки запросов и систему подписок.
В экосистеме Dexie.js существует несколько механизмов, которые формируют реактивное поведение:
Каждый из этих механизмов решает отдельную задачу: от локального отслеживания изменений до построения потоков данных уровня приложения.
liveQuery является ключевым инструментом реактивности в
Dexie.js. Он преобразует обычный запрос к IndexedDB в поток значений,
который пересчитывается при изменении зависимых данных.
Модель работы можно описать следующим образом:
Таким образом, liveQuery фактически реализует
реактивную пересборку запроса, а не дифф изменений.
Если данные изменяются через add, put,
delete, то Dexie фиксирует факт изменения транзакции. После
завершения транзакции происходит проверка затронутых таблиц. Если они
совпадают с зависимостями активного liveQuery, выполняется
повторный расчёт.
Реактивность в Dexie.js тесно связана с транзакциями IndexedDB.
Каждая операция изменения данных:
Это означает, что реактивные обновления не происходят «по каждому шагу», а только после завершения транзакции. Такой подход исключает промежуточные состояния и обеспечивает консистентность данных.
Плагин Dexie.Observable расширяет возможности реактивности в Dexie.js через глобальный механизм событий.
Он вводит концепцию:
Этот механизм особенно важен в приложениях, где одна и та же база открыта в нескольких вкладках.
Хотя хуки в Dexie.js не являются реактивностью в строгом смысле, они формируют основу наблюдаемого поведения данных.
Система hooks включает:
creatingupdatingdeletingreadingХуки позволяют вмешиваться в жизненный цикл данных, создавая предсказуемые точки наблюдения.
Хуки сами по себе не вызывают обновления UI, но они:
В реактивной архитектуре хуки часто используются как слой подготовки
данных перед их попаданием в поток liveQuery.
Реактивная система Dexie.js опирается на стратегию инвалидации, а не диффинга.
Вместо вычисления точечных изменений:
Это упрощает модель и снижает сложность отслеживания изменений.
Внутренний механизм реактивности в Dexie.js основан на фиксации зависимостей во время выполнения запроса.
Когда выполняется liveQuery:
Этот подход похож на реактивные системы с автоматическим трекингом зависимостей, но адаптирован под IndexedDB.
Dexie.js часто используется совместно с UI-фреймворками, где реактивность базы данных становится частью общего состояния приложения.
Типичная интеграция:
liveQuery → поток данных;В такой архитектуре база данных становится источником истины, а UI — реактивным отображением.
IndexedDB допускает конкурентные операции, и реактивность в Dexie.js учитывает это через сериализацию обновлений.
Особенности:
Это предотвращает гонки данных на уровне реактивных подписок.
Реактивность в Dexie.js имеет ряд архитектурных ограничений:
Эти ограничения компенсируются простотой модели и предсказуемостью поведения.
В архитектуре Dexie.js реактивность не является частью базы данных, а представляет собой отдельный слой:
Такое разделение позволяет менять реактивную стратегию без изменения структуры данных.