Как стать автором
Обновить

Как улучшить UX в PWA на React с помощью потокового Backend-Driven UI — личный опыт

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров2.1K
Всего голосов 5: ↑5 и ↓0+5
Комментарии15

Комментарии 15

Насколько я понял, с сервера приходит огромный JSON, описывающий все элементы интерфейса. Загружается он долго, и вы решаете проблему так:

  1. Парсинг JSONа по кусочкам по мере загрузки и немедленный рендер полученных элементов.

  2. Создание низкоуровневых ReactElement вручную, в обход стандартных механизмов Реакта.

Если первое еще как-то можно оправдать безальтернативным и неизменяемым бэкэндом, то второе вряд ли даст вам что-то, кроме потенциальных проблем.

ИМХО, целесообразнее

  1. Разделить запросы на каркас и контент

  2. Загружать каркас первым, потом то, что above the fold, показывать скелетоны вместо единого спиннера и т.д.

  3. Юзать HTTP/2 Push, 103 Early Hints и т.п.

В статье рассматривается концепция BDUI. Безусловно, подход спорный, но на практике многие компании в той или иной форме применяют его, что позволяет им существенно бустить производительность разработки.

Понятно, что если у вас чистая PWA без нативного мобильного приложения, то BDUI, скорее всего, вам не нужен. Однако в мультиплатформенной среде он может дать ощутимую выгоду.

Теперь по поводу вашего комментария. Могли бы вы подробнее рассказать, каким образом вы планируете реализовать описанную вами логику в рамках BDUI? Допустим, у вас есть JSON, описывающий интерфейс. Как именно вы собираетесь разделить этот JSON на каркас (skeleton/layout) и остальную структуру?

Обратите внимание, что этот же JSON используется и нашей мобильной командой. Унификация данных между платформами помогает нам существенно ускорять внедрение новых фич и снижать дублирование логики.

А каким тут боком тэг Си++ тут стоит?
Нам, плюсовикам, немного чуждый ваш мир фронт-энда. Хотя, прочитав статью, нашёл нечто похожее, что делали в играл, которые на С/С++, чтобы грузить уровень не целиком, ожидая полминуты, а по ходу пьесы.

Сори, тег не туда ушёл, не уследил. Вторая статья на хабре, я только учусь)

Настораживает, что в «стало» нет ни одного числа. А в «было» числа есть. Подозреваю, что не так хорошо получилось, как автор нам рассказывает.

На демо-стенде показало 30% прирост к скорости. Точных цифры могут варьироваться в зависимости от реальных условий и объёма данных на живом проекте. Плюс по перфоманс профайлу есть видимость, что сборщик мусора срабатывает реже, что тоже ускоряет загрузку.

Извините, но 30% это по сути ни о чем. Оно было так плохо, что нужен прирост скорости в 300% (уменьшение время отклика на 66%), (из 15с до 5с) чтобы стало «просто плохо». Чтобы стать «хорошо» время реакции нужно меньше чем 2с, а 1с – «прекрасно». А это уже 1500% ускорения.

Так что статью надо понимать как руководство как делать не надо.

Как я понял, вы ориентируетесь на замеры в локальной среде без сетевых ограничений. 15 секунд закладывается на загрузки с учётом условий мобильной сети у реальных пользователей. В таких условиях получить 1 секунду — невозможно. Указанные 30% — это показатели, снятые с мобильных устройств.

Обсуждать скорость загрузки в контексте статьи — всё равно что обсуждать сферического коня в вакууме. Всё, конечно, упирается в размер JSON и итогового JS-бандла: чем больше логики и кода, тем дольше загрузка.

Тем не менее, никого ни к чему не призываю и не пытаюсь переубедить. Было бы интересно узнать про ваш опыт с BDUI, если есть: какие цифры получались у вас и что для этого делали.

В таких условиях получить 1 секунду — невозможно.

Ну, почему сразу «невозможно». Конечно это зависит и от того что вы хотите показать на эту страницу. Но у меня например часто получаются время отклика ниже секунды в реальных условиях. Но я начинаю оптимизировать, когда время отклика выше 3 секунд.

Для первой итерации я бы исходил из реальной потребности для первого рендера. Предполагаю что в большой JSONке есть ключи и при желании можно запрашивать с бэка нужный ключ, а не всю. А потрм можно сервис воркер подключить для префетча остального.

Куда мы катимся... Сотни килобайт ТЕКСТОВОГО содержимого, которое надо распарсить, а ещё js и прочее содержимое. Да-да, есть сайты ещё хуже, тянущие десятки и даже сотни мегабайт js-содержимого и это далеко не ноунеймы, я знаю, но... Эх, в какой момент всё стало настолько плохо? И люди, которые говорят, что загрузка страницы за 10 сек вместо 15 это хорошо - это как понимать? Вообще-то это катастрофа, знаете ли! Хотите обижайтесь, хотите нет, но не надо себе и нам пытаться втюхать, что это «нормально».

Как писал классик:
Если звёзды зажигаются — значит, это кому-нибудь нужно.

Вы не учли важный момент: инструменты всегда выбираются из контекста задачи.

Когда мы говорим о достаточно большом объёме JavaScript-кода, за такими решениями, как правило, стоят нетривиальные проблемы.

Давайте порассуждаем. Представим трейдинговую платформу с:

  • реалтайм-обновлениями через WebSocket,

  • REST API,

  • банковскими формами,

  • фича-флагами

  • и прочий «радостью».

Как вы собираетесь грузить такую систему с минимальным количеством кода?
И даже если каким-то чудом у вас получится — как вы будете масштабировать это решение на десяток продуктовых команд?

А теперь добавим унифицированную платформу, где вместе с вебом живёт и мобильная разработка. И разработчиков там ещё больше, потому что нужно поддерживать две кардинально разные платформы.

И тут появляется основной барьер для быстрой доставки кода — релизы.

В результате ваше «минималистичное» решение превращается в тот самый ужас, о котором вы и пишете. Вы можете с этим мириться, можете отрицать, но отрицание — это всего лишь одна из стадий принятия неизбежного.

Вопрос про BDUI в целом. Чем отправка виртуального дерева Реакта лучше отправки готового HTML? Асинхронный парсинг и отображение будут работать из коробки. Тем более, что Реакт предоставляет инструмент для преобразования виртуального дерева в HTML на сервере с дальнейшим «оживлением» на клиенте.

Как я понял, вы хотите реализовать SSR с парсингом JSON на сервере, а затем гидрировать это на клиенте? Если так, то такой подход довольно распространён.

Однако возникает вопрос: как в таком случае вы планируете обрабатывать динамические элементы интерфейса — такие как порталы, модалки и прочие компоненты, которые могут быть добавлены или удалены из DOM по мере взаимодействия?

Я встречал похожую реализацию, например, с BDUI на базе Next.js — так что почему бы и нет. Хотя стоит отметить, что тема SSR на Node достаточно холиварная и дискуссионная. Кому-то такой подход в принципе не подходит.

В случае с PWA мы, например, не стремимся выносить логику на сервер — зачем, если основная идея в том, что пользователь «устанавливает» приложение как аналог мобильного, а всё кешируется на уровне service worker’ов?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий