Немного мыслей про SPA-приложения и серверный рендеринг. Еще каких-то 10 лет назад, весь рендеринг был серверный, а веб работал как и задумывалось. Клик по гиперссылке загружал новую страницу, которая представляла из себя уже готовый к отображению HTML. Клик = новая страница =>
В такой схеме (тонкий клиент) все было просто и понятно. Браузер автоматически знал как делать навигацию вперед/назад и в целом был заточен под такую схему. Плюс она идеально подходит для поисковиков. Индексация процесс, который не вызывал никаких вопросов. Но потом поехало =>
Появилась задача делать сайты более интерактивными, например создавать редакторы, или формы, изменяющиеся без перезагрузки. Сначала это делалось виджетами, которые встраивали кусок js в конкретное место на странице. Потом, постепенно это переросло в SPA, а бек превратился в API
Революцию в этом смысле сделал Gmail еще в далеком 2004 году. Это был первый по настоящему SPA сервис, который дал такой опыт взаимодействия, что все ахнули и побежали создавать фреймворки и интерактивные сайты. И оно много где было нужно, посмотрите на тот же Airbnb или Twitter
Еще одно место где без SPA почти нереально это сервисы с двухсторонним взаимодействием, например любые виды чатов и любых совместных штук. Совместное редактирование, рисование, кодирование и так далее. Все это требует серьезного клиентского кода. Плюс производительность =>
Все это подкреплялось идеей о том, что SPA сайты работают быстрее. И правда, нам ведь нужно загружать только сырые данные, все остальное делается на клиенте. Со временем этот аргумент почти перестал работать. Сильно шагнул вперед HTTP и браузеры, плюс, опять же, кеширование
Но дальше начались проблемы. Оказалось что SPA-приложения входят в конфликт с тем как устроен веб. Так как изменение содержимого и страниц теперь происходит на клиенте с помощью JS, то браузер потерял возможность за этим следить. То что раньше просто, стало сложно =>
Теперь если программист специально не следит за историей переходов, то кнопки назад/вперед работать не будут. Если специально не менять урл, то он всегда будет оставаться одним и тем же, что не дает возможность отправить ссылку на какую-то страницу.
Появилось много сетевого взаимодействия, что привело к большому количеству ошибок, которые надо правильно обрабатывать. Неадекватное поведение при сбоях в сети это бич современных SPA-сайтов. И автоматика тут мало поможет, нужно ручками все это обрабатывать.
Появились проблемы с ожиданиями. Что делать пока идет процесс? Нужно ли сначала обновить UI, или ждать пока не придет ответ от сервера? SPA приложения часто злоупотребляют спиннерами. Создается ощущение постоянных тупняков и постоянной загрузки чего-то.
Оказалось что приходится дублировать логику бекенда на фронтенде. Валидация? И там и тут. Какие-то бизнес правила? Возможность что-то сделать? Все это стало повторяться. В два раза больше программистов на те же самые задачи что и раньше.
Самое страшное что скорость разработки упала в разы. Это знают все кто когда-либо работал с классическими бекенд фреймворками. Тут у нас и сложность событийной модели (сложнее клиент-серверной модели) и выделение нового вида программистов и новые проблемы описанные выше
React, кстати, в этом смысле немного приблизил фронтенд разработку к принципам работы бекенда. Подход "каждый раз с нуля" совершенно точно отражает то, как устроен серверный рендеринг в бекенд-фреймворках, где шаблон формирует HTML, который отправляет в браузер.
Но по настоящему камнем преткновения стали две вещи: 1. индексация важная для SEO 2. Скорость первой отрисовки, которая из-за тяжести кода стала ну просто нереально долгой (классические сайты громко смеются). Эти проблемы привели к тому, что мы вернулись к серверному рендерингу
Был где-то смешной твит на тему того, что вот эта эволюция сайтов в чистый SPA была ошибкой, раз мы все равно откатились назад. Правда откатились на новом уровне. Сначала появился просто способ рендерить фронтовые штуки на сервере. Он до сих пор популярен и продолжает развиваться
Так мы решаем проблему первой загрузки и SEO, добавляя при этом новой сложности. В этой части я правда не очень силен, поэтому не могу говорить исходя из опыта. Тут сами скажите насколько это больно/сложно/прозрачно/понятно. Я скорее добавлю про следующий уровень
А дальше появилась старая-новая идея. Раз у нас вебсокеты, HTML5, HTTP/3 и нам нужен серверный рендеринг. Почему-бы не вернуться к идее классической серверной генерации HTML, средствами бекенд фреймворков, а вместо js мы начнем использовать data-атрибуты. И немного js если надо
И понеслась. Одним из первых был htmx.org > htmx gives you access to AJAX, CSS Transitions, WebSockets and Server Sent Events directly in HTML, using attributes, so you can build modern user interfaces with the simplicity and power of hypertext
То есть концепция в том, что бек нам возвращает HTML, который мы вставляем в DOM. Делается это самим фреймворком, а нам надо только формировать правильный HTML на сервере. Большая часть кода управляется data-атрибутами, но при необходимости можно писать JS на спец фреймворках
К таким фреймворкам относится например stimulus.hotwired.dev Он нужен для того самого интерактива, который нельзя сделать через серверный рендеринг. Кстати stimulus является частью hotwired.dev крайне рекомендую посмотреть видосы использования этого решения
Подобные фреймворки уже строятся из принципа что есть готовый html, в который мы внедряемся через обычные атрибуты. То есть эти фреймворки заточены под серверную генерацию HTML. То есть возврат в JQuery мир, но с другого входа :)
Кстати, уже выросло поколение людей, которые не видели в глаза классический серверный рендеринг и не знают про подобные шаблонизаторы для бекенд языков: haml.info
Так вот что я хочу сказать. Не знаю куда все придет, но видно что мы сейчас на пороге нового витка. Кажется что индустрию бросало от чистого серевра до чистого клиента и только сейчас формируется гибридный подход, который найдет баланс и станет наиболее универсальным.
На текущий момент, мы на Хекслете делаем так: большая часть интерактива это виджеты в рамках классического рендеренга Rails. У нас есть SPA и это редактор. Плюс сейчас местами начинаем внедрять Stimulus, там где хочется переиспользовать готовый HTML, благо hotwire интегрирован
А глобально моя стратегия такая:
1. Можно сделать через серверный рендеринг => Делаем без js 2. Не можем сделать без клиента => Используем виджет 3. Нужно оживить текущий HTML => Stimulus 4. Нужен сквозной (страницы) и сложный интерактив => SPA
Оу забыл добавить. Есть же еще один путь развития в сторону написания фронта на любом языке на серверной стороне. Тут все начиналось с GWT и сейчас благодаря WebAssembly продолжает развиваться с утроенной силой. Скорее всего, вес фронт расползется по разным стекам.
• • •
Missing some Tweet in this thread? You can try to
force a refresh
Ну что мои маленькие любители кода, готовы? Тред про то почему используют вим и как это делают. Я расскажу про то как майкрософт сделал революцию в мире редакторов и почему это меняет все. Для тех кому реально интересно попробовать и понять как это - доминировать над коллегами :D
Начнем с дисклеймера. Этот тред для тех, кому по-настоящему интересно узнать почему кто-то использует вим и есть ли в этом смысл для них. Но я не пытаюсь и не хочу убеждать ни в чем людей, которые считают что за рамками IDE жизни нет. Погнали!
За свою карьеру (с 2007 года) я попробовал много всяких редакторов и двигался в сторону от тяжелых IDE в сторону редакторов. Была попытка пересесть на emacs и я даже освоил его сборку spacevim. Пробовал vscode сам по себе и с плагином vim, но в итоге все равно вернулся на vim
Около 13 лет я работаю (программирую и пишу все тексты) в виме на 13 дюймовом мониторе моего ноутбука. Те кто не видел меня за работой говорят "это же не удобно", те кто видел - "можно медленнее, а то я не успеваю". Давно хотел про это рассказать, тред об эффективности =>
Сразу дисклеймер. Мне действительно бывает неудобно на 13 дюймах, когда я занимаюсь отладкой чего-либо в браузере, но в остальном это вопрос организации пространства. Я много работаю в пути и у меня нет одного места, поэтому изначально все это была вынужденная мера, а потом =>
В какой-то момент удалось придумать систему, которая за годы особо не меняется несмотря на развитие технологий, так как она довольно универсальна. Она базируется на некоторых особенностях, которые далеко не все смогут себе адаптировать, но по крайней мере появится представление
Есть у меня список принципов, которых я придерживаюсь когда пишу код. Кратким списком они есть тут ru.hexlet.io/pages/principl… но без раскрытия, а у людей появляются вопросики. Пришла пора ответить за слова. Лайк, тред, инфлюенс =>
"Язык — это инструмент" банально, но факт. Не прикипайте к языкам, язык для души и работы это разные вещи. Я не люблю го, но буду использовать там где он силен, я люблю кложу, но не буду использовать почти нигде (:D) PHP сила, TypeScript могила
"Программирование — это не язык" tldr: вычислительное мышление. Задача => избавляемся от лишнего (Абстракция) => разбиваем на подзадачи (Декомпозиция) => Находим закономерности (pattern recognition) => строим алгоритм. ru.wikipedia.org/wiki/%D0%92%D1…
А замутим-ка мы тред про Zero Downtime Deployment или как деплоится и не беспокоиться. У вас как с этим?
Небольшой ликбез. Деплой – процесс выкладки новой версии кода. В простом случае выглядит как: закрыли сайт с сообщением "мы обновляемся" > накатили изменения в базу данных (миграции) > обновили код на серверах > рестартанули сервер > открыли сайт. У кого так лайкаем)
Если это происходит редко, то такая схема вполне позволительна, правда тогда возникает вопрос, почему редко? Деплоиться надо часто, чтобы не копились изменения и баги. А если деплои как положено хочется делать непрерывно? Тогда постоянные простои начинают мешать и раздражать
Скинули сегодня вот такую статью: vc.ru/claim/348250-g… Несмотря на задницу, которая происходит во многих сервисах, все же образовательные площадки продают не курсы. Давайте тред, о том, почему торренты и ютуб не конкуренты платному обучению. Какой ваш личный топ?
Поехали. Есть наблюдения, в которых сходятся специалисты в образовании. Только 7% людей самомотивированы. Они достигают успеха практически всегда, независимо от способа обучения. Им не сможет помешать никакой плохо проведенный курс. Они больше всех топят за самообразование
Примерно такую картину мы наблюдаем в любой учебной группе. Есть несколько человек которые как тараны идут вперед, дальше середнячки и большая часть где-то позади и постепенно отваливается (если есть такая возможность). Школа, универ, опять же курсы. Это все на поверхности
Давайте тред. Про то как значительно упростить интеграции между вашим проектом и сторонними системами. Все что касается событий, рекламных кабинетов, crm, аналитик, слака и кучи других систем. Вы используете сервисы типа Zapier?
Сначала про задачу. В любом SaaS сервисе, помимо самого продукта и его фич, есть много всего вокруг. CRM для продаж, система сквозной аналитики, рекламные кабинеты, событийная анилитка, автоматизация маркетинга (email, боты), виджеты на сайте и так далее. Тонны систем
И все они работают в связке. Когда на сайте оставляют заявку, она должна попасть в CRM продавцам, должна попасть в рекламный кабинет и систему сквозной аналитики для анализа эффективности, а еще нужна нотификация в слак и тикет на работу с клиентов после того как сделка закрылась