chunk_norris - мощная библиотека Dart для прогрессивной гидратации JSON. Она позволяет работать с JSON-данными, поступающими фрагментами, используя плейсхолдеры, которые обрабатываются по мере поступления данных. Идеально подходит для потоковых API, событий, отправляемых сервером, и любых сценариев, где требуется обработка частичной загрузки данных.
Вдохновением для создания и экспериментов послужила статья Дена Абрамова о Progressive JSON. Кратко о концепции:
Now imagine you want to transfer it over the wire. Because the format is JSON, you’re not going to have a valid object tree until the last byte loads. You have to wait for the entire thing to load, then call
JSON.parse
, and then process it.The client can’t do anything with JSON until the server sends the last byte. If a part of the JSON was slow to generate on the server (e.g. loading
comments
took a slow database trip), the client can’t start any work until the server finishes all the work.Would you call that good engineering? And yet it’s the status quo—that’s how 99.9999%* of apps send and process JSON. Do we dare to improve on that?
Суть подхода в том, чтобы вместо ожидания загрузки и обработки большого JSON, мы получаем "скелет" ответа, где отсутствующие данные заменены на "плейсхолдеры", которые по мере поступления новых чанков данных будут обрабатываться и заменять собой плейсхолдеры.
Фичи chunk_norris
Потоковая обработка JSON: инкрементальная обработка чанков по мере поступления данных
Плейсхолдеры: используйте
$1,
$2
в качестве "заглушек" или собственныеRegExp-паттеры
Type safety: Строго типизированный доступ к вашим данным с автоматической десериализацией
Встроенная поддержка работы с потоковыми источниками данных (SSE, WebSockets и т. д.)
Менеджмент состояний: отслеживание состояний загрузки (pending, loaded, error) для каждого чанка
Гибкий API: работа с необработанным JSON или строго типизированными объектами
Обработка ошибок: Комплексная обработка ошибок с fallback-механизмами
Области применение chunk_norris
Server-Sent Events, WebSockets (SSE, WS)
Идеально подходит для потоковой передачи данных в режиме реального времени, когда первоначальный ответ содержит скелет, а последующие события дополняют детали.
Progressive Web Apps
Сначала загрузите критически важные данные, а затем расширьте их дополнительной информацией по мере ее появления.
Оптимизация API
Сократите время начальной отрисовки UI, отправляя часть данных немедленно и передавая оставшуюся часть в потоковом режиме.
Агрегация данных из нескольких источников
Объедините данные из разных источников (баз данных, API, файлов) в единую унифицированную модель. Мгновенно загружайте доступные данные и заполняйте недостающие фрагменты по мере их появления из более медленных источников.