Рендеринг веб-страниц на стороне сервера, как знают многие читатели, вышел из употребления уже лет 10 как. "Перезагрузка страниц занимает ощутимое время, при этом пользователю не показывается даже спиннер! Что об этом говорят наши UX гайдлайны?" - таким вопросом задавались IT компании, принимая решение немедленно переезжать на single-page application.

Долгие годы никто не решался идти против веяний эпохи, пока лет 5 назад затишье не нарушил популярный веб-фреймворк Phoenix для языка Elixir (курица в капле на моей картинке). Его авторы считали, что обладающая сверхспособностями Erlang VM сумеет развеять предрассудки о якобы тормознутом серверном рендеринге.

Что ж - они не ошиблись: Phoenix Live View получила популярность, и теперь является для поклонников языка Elixir свидетельством преимуществ их рантайма. Сервер с клиентом общаются исключительно по вебсокету, html генерируется на сервере, коэффициент полезной информации в передаваемом трафике близок к 100%. Видимо, у авторов Phoenix - не только вера в возможности рантайма, но ещё и прямые руки.

Возвращение к серверным шаблонам в Python сообществе стало для некоторых неожиданностью - я, конечно, про фреймворк htmx. Я смотрел их демо на DjangoCon - у них обычный сайт на django, они даже вебсокеты используют только в крайнем случае. Сайт, при этом, отзывчивый - перезагрузок страницы не происходит. (Как это работает? А что, так можно было?)

htmx - это вообще говоря, клиентский код - npm пакет. Он расширяет набор атрибутов в html тэгах для добавления логики (так же делают многие js-фреймворки). Каждый компонент - это такая псевдо-форма (иногда - настоящая форма). При определённых событиях, она шлёт на сервер запросы и - частый случай - перезаписывает своё содержимое на то, что пришло в ответе с сервера.

Вот пример простого компонента:

<div hx-target="this" hx-swap="outerHTML">
    <div><label>First Name</label>: Joe</div>
    <div><label>Last Name</label>: Blow</div>
    <div><label>Email</label>: joe@blow.com</div>
    <button hx-get="/contact/1/edit" class="btn btn-primary">
    Click To Edit
    </button>
</div>

Клик на кнопку заменяет поля на редактируемые, причём запрос на сервер, скорее всего, опять вернёт перезаписываемый компонент.

Почему эта магия работает? Потому что обычный reactive фреймворк делает, по сути, то же самое: при определённых событиях он вызывает логику, которая решает, изменится ли его состояние. Эта логика чаще всего предполагает запрос на сервер. А в htmx запрос на сервер делается всегда (и урл этого запроса явно прописан в соответствующем атрибуте).

<button hx-delete="/account">Соцсети не для меня</button>

В клиент-ориентированном фреймворке onclick был бы функцией, но без запроса на сервер всё равно бы не обошлось. А если нет разницы, зачем платить больше?

Ещё один пример: пусть у нас есть большая страничка, которую мы рендерим по серверному шаблону. Пусть она состоит из 5 визуальных компонентов. В результате действий пользователя, 2 компонента "сообразили", что информация в них больше не актуальна, и им нужен апдейт. Что они сделают? Конечно, гет-запрос на свой урл - и обновятся. Как компонент может сообразить, что ему нужен апдейт? По наступлению какого-то события. В htmx есть события на все случаи жизни - в том числе, можно заводить кастомные. Флаг наступления события может установить как предыдущий ответ с сервера - с помощью хедеров, так и нотификация по вебсокету, например.

Несмотря на простоту концепта, кроме htmx - такое впечатление, что никто до этого не додумался. (UPDATE: есть ещё Hotwire, который построен на похожих принципах)

В общем, если Вы сомневаетесь, использовать ли для django-админки SPA или серверные шаблоны - то не сомневайтесь и берите htmx. Если Вы адепт full-stack разработки на Python - тоже. Разделение труда - единственный весомый контраргумент для меня: серверные разработчики обычно не очень разбираются в вёрстке, вне зависимости от используемого языка.

А теперь - о самом интересном аспекте (на мой взгляд). Интересующиеся мобильной разработкой или читающие блог Яндекса, наверно, видели анонс о выходе в опен-сорс фреймворка divkit. Кроме хабра и ютуба , о нём не очень много можно найти за пределами Яндекса (сам я не из Яндекса). В демо на ютубе девушка несколько раз упоминает фреймворк как "дивный кит". Лично мне название нравится - осталось только кита на логотипе фреймворка изобразить.

divkit - это что-то вроде такого универсального html (точнее, json), который он (divkit) умеет отображать на Android, iOS и на вебе. Таким образом, клиентский код сводится к минимуму, а задача сервера - как раз, формировать этот самый json. Получается, в Яндексе тоже используют рендеринг на сервере - для мобилок! (замахнулись на их нативную природу, не иначе)

Так вот, лично я считаю, что для мобилок серверный рендеринг ещё нужнее . Потому что у нас есть две разные платформы, как минимум - сами знаете, какие. Языки для разработки приложений у них - разные, графические библиотеки - тоже, причём, в случае Apple - закрытые. Какое в Яндексе нашли этому решение - писать максимум логики на стороне сервера, логично же?

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

Комментарии (18)


  1. doomguy49
    28.11.2022 01:24
    +1

    Веб состоит из php (go и c# это даже не погрешность) и JavaScript. Какой питон в вебе? Это технологии древних


    1. codecity
      28.11.2022 01:27
      +9

      Как вы меряли то? Или просто в вашем узком кругу?


    1. mrkaban
      28.11.2022 12:33
      +3

      Язык активно используется компанией Google в её поисковой системе, а Youtube в значительной степени написан с использованием Python.

      Действительно, технологии древних


      1. doomguy49
        28.11.2022 13:04
        -2

        Для ИИ - безусловно, но не в качестве шаблонизатора на фронте


        1. mrkaban
          28.11.2022 13:22

          Почитайте подробнее про то, где они применяется и его фреймворки


    1. GothicJS
      29.11.2022 23:09

      Что касается бэка..

      Понятно, что в допотопные времена пхп выделялся тем, что встраивался в html, и это юзали. Но сейчас то? Пхп же популярен скорее по историческим причинам или есть там какая то особая изюминка ?

      Разве не все ли равно, на чем писать сейчас: на Django или Laravel, например ? Или рельсах.

      Питон кстати по сравнению с пхп в вебе может предложить асинхронные фреймворки.


  1. khegay
    28.11.2022 02:29
    +3

    Ну, откровенно говоря, в современном мире фронта, большинство фреймворков работают с DOM-деревом, а для SEO есть SSR всякие, которые отдают две разных версии.

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

    У меня есть элемент с коллапсом, вначале показывается 3 строки текста, а по нажатию на кнопку — 30. Выходит так, что htmx сначала сделает запрос на сервер на 3 строки, а потом еще один запрос на 30?


    1. abetkin Автор
      28.11.2022 02:47

      Про общие вопросы архитектуры, боюсь, я не полностью понял. Что касается элемента с коллапсом - наверно, имеет смысл по нажатию сделать отдельный запрос. Можно, конечно, сразу всё отрендерить, просто держать скрытым - здесь нет ничего невозможного. Можно иногда написать одну строчку джаваскрипта :)


    1. abetkin Автор
      28.11.2022 03:47
      -1

      Я, кажется, понял, о чём Вы. Само собой, некоторые вещи работают только на фронте. Так, и сам htmx вообще-то - фронтовый код, npm пакет


    1. hardtop
      29.11.2022 08:49

      Сначала на сервере сгенерятся N элементов с коллапсом - это 1 запрос. А уж если пользователь кликнул на браузере "Показать далее" , то htmx отправит 2-й запрос и подставит ответ в нужное место.


  1. savostin
    28.11.2022 05:03

    1. abetkin Автор
      28.11.2022 05:13

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


  1. nin-jin
    28.11.2022 05:50
    -4

    Тут сравнение нормального PWA со всякими серверными костылями. Причём qwik не на каждый клик делает запрос. Но проблемы всё те же: плохая отзывчивость на лагающем интернете или загруженном сервере. А при временной потере коннекта, всё превращается в тыкву.


    1. abetkin Автор
      28.11.2022 06:39

      Зачётная музычка. Наверно, каким-то народам Соединённого Королевства принадлежит, нет?)


  1. rg_software
    28.11.2022 08:35
    +1

    Насчёт не додумались -- ну как же, есть ещё hotwire, есть hotwire-django , есть sockpuppet. Это из того, что прямо из головы.


    1. abetkin Автор
      28.11.2022 13:43

      Не знал про hotwire, спасибо! Обязательно потестирую его


  1. dlc
    28.11.2022 10:29
    +1

    Одного не могу понять, почему все такие статьи в заголовке говорят о javascript fatigue, а потом начинают рассказывать, что JSON и запросы говно, а вот старый-добрый HTML и server side это мана небесная?

    • Во-первых, javascript fatigue совсем не про это.

    • Во-вторых, работы с HTML это самая простая часть Web-приложения.

    • В-третьих, все эти прекрасные новомодные решения имеют отвратительную поддержку IDE, что только ухудшает работу с тем же HTML.

    Вот ей богу, сначала люди находят проблему: которой нет: потом исправляют её неподходящими средствами.


  1. moroz69off
    28.11.2022 13:20

    немедленно переезжать на single-page application

    ASP.NET (по мне (as for me)) уже лет 25-30 как работает успешно и не собирается умирать.

    Конечно, если вам нужно мигать призывающими баннерами, докучать юзеру поп-аппами, и подтверждать - что страницу хочется закрыть, напомнить подписаться... и т. д., тогда -- да. Эти идеи новы (нет), а так, для веба вообще -- этот дивный кит будет вызывать тошноту у всех (как и всё остальное от тындекса).