Помешательство
Может быть, писал про это раньше, лень искать.
Допустим, у нас современное веб-приложение: на сервере только REST API, а рендер силами JavaScript. Одна из апишек отдает сведения о покупках: число, сумму и дату последней покупки. Что-то вроде такого:
{
"total_orders": 7,
"total_sum": "523626",
"last_order_date": "2023-12-23T12:23:55Z"
}
(сумма в копейках, если что)
Ожидается, что на клиенте мы покажем эту информацию так:
Вы совершили семь покупок на сумму 5.236 рублей 26 копеек. Последний раз вы покупали 23 декабря, 20 дней назад.
Чтобы отрендерить этот блок, нам понадобятся:
- библиотека “число прописью”, чтобы 7 стало “семь”;
- склонение с учетом числительных: 1 покупка, 3 покупки, 5 покупок;
- форматирование суммы;
- форматирование дат;
- вычитание дат (20 дней назад);
- возможно, мультиязычные шаблоны, если в приложении несколько языков.
И думаю: есть же люди, которые всерьез делают это на JavaScript(!) в браузере(!!). Подключают тонны библиотек из npm, пишут экраны кода, компилируют мегабайтные бандлы. Запускают всю эту машинерию, кодят месяц и в итоге получают что-то похожее на результат. Который, конечно, работает только в Хроме на 4К-мониторе. На мобиле обрежется, в Фаерфоксе разъедется, в Сафари будет белый экран.
Что движет этими людьми, интересно? И кто за них отвечает? Что за извращенное удовольствие: из всех вариантов выбрать самый хрупкий и тяжелый?
Похоже на массовое помешательство.
Нашли ошибку? Выделите мышкой и нажмите Ctrl/⌘+Enter
Tamirlan, 24th Jul 2024, link
А как должно быть? На бэкенде это делать и возвращать? Или другой формат данных использовать?
Ivan Grishaev, 25th Jul 2024, link
Я бы просто на сервере рендерил и отдавал готовую фразу в отдельном поле JSON.
Ivan Vasilev, 26th Jul 2024, link
Иван, по вашим постам понятно, что вы не любите современный фронтенд. Но кроме нелюбить, вы ещё и не очень в него погружаетесь, видимо. Зачем это делать, не очень понятно. Почти все описанные задачи в браузере уже довольно давно решаются встроенным Intl API. Кажется, в стандартной библиотеке кложи и близко такого нет и придется “подключать тонны библиотек” и писать простыни кода. Это примерно как я бы писал, имея довольно ограниченный опыт работы с языком и экосистемой, что вот в кложе бардак везде, в какой проект не придешь, все по своему работает, макросов понаписали, ни черта не понятно.
Я в целом понимаю вашу боль от кода, написанного плохими разработчиками. Но почему так избранно только про фронт?
Ivan Grishaev, 26th Jul 2024, link
Конечно, во втроенной библиотеке Кложи этого нет, и нужно ставить библиотеки. Разница в том, что всю логику я могу покрыть тестами и без проблем прогонять их при малейшем изменении. Потом, мне не нужно думать о браузере. Клиент может зайти из IE 9 на Windows 7, и увидит все как надо. А вы будете показывать попапы “ваш браузер не поддерживается”.
Ivan Vasilev, 27th Jul 2024, link
Но подождите, на клиентский код тоже пишут тесты. И мы опять возвращаемся к тому, что дело не во фронте, а в разработчиках. За 15 лет разработки не припомню ни разу, чтобы я делал попап “ваш браузер не поддерживается”. Было такое, что мы делали приложение, которое работало только в Chrome. Но это потому, что он был единственным, кто давал доступ к каким-то API, нужным для печати на билетном принтере, это да.
Но в остальном попап про браузеры это точно не про задачу “отрендерить число в строку”. Это про браузерные апишки, которых в старых браузерах может не быть. Например, HTML Media Capture. И никакой рендер на бэке не спасет вашего клиента с IE9, если ему нужно фотку лица с камеры загрузить.
Ну и то, что кто-то зайдёт с IE9 это слабый аргумент из разряда статистической погрешности, потому что на нем уже даже почту вряд ли посмотришь. Подсказываю более надежный: а если зайдут с выключенным javascript? Это точно шах и мат.
Я понимаю, сейчас модно фронтенд хейтить. Но если ваши фронты делают сайт со статическим контентом на реакте, обмазывают его либами и не пишут тестов ни на что, это не значит что весь фронт это отстой, это значит что ваши разработчики не умеют его готовить.
Блог начал напоминать сайд проект Тонского, только на серьезных щщах. =)
Ivan Grishaev, 27th Jul 2024, link
Вы не сможете прогнать тесты во всех браузерах и во всех операционках. Это будет матрица (Chrome, FF, Safari) X (Windows, Linux, MacOS). Настроить столько прогонов на CI будет затратно и тяжело в поддержке. А еще версии: сегодня в Хроме одно, а завтра вышел апдейт, который поломает этот Intl API.
Кроме других недостатков, клиентский рендер замедляет мой браузер. Я не понимаю, с каких щщей вычисления переносят на мою машину.
Ivan Grishaev, 27th Jul 2024, link
Вот кстати: если у вас обычный файл-инпут, то человек перетащит фотку на комп и подгрузит формой с POST-запросом. Это работает даже в IE6. А вы со стороны фронтенда просто пошлете его на хер.
Ivan Vasilev, 28th Jul 2024, link
Иван, ваши высказывания лишь подтверждают то, что вы плохо разбираетесь в теме. Браузеры уже очень давно не ломают API, которые вошли в стандарт. Всё обратно совместимо. И пользователи тоже не хотят уже давно делать фотку, сохранять ее на диск и перетаскивать в форму. Они хотят посмотреть в камеру, нажать кнопочку и больше не видеть этой фотки.
С одной стороны клиентский рендер замедляет ваш браузер, с другой стороны, перерендер всей страницы с контентом, чтобы поменять число на счетчике в верхнем углу страницы не ускоряет рендер тоже никак.
Я повторю свою точку зрения, которую вы игнорируете упорно: есть задачи, для которых уместен серверный рендер, есть задачи, для которых он ну ни как не подходит и без клиентского кода не обойтись. А то, что у вас негативный опыт с клиентскими приложениями, то это не во всех приложениях дело, а в тех, с которыми имели дело вы и в разработчиках, которые их делали.