Давайте попробуем собрать свой идеальный boilerplate для full-stack разработки. В статье мы будем постепенно собирать шаблон для быстрого запуска стартапов.
Сразу предупреждаю, что статья будет холиварной, всех хейтеров прошу в комменты, предлагайте решения со ссылкой на публичные кейсы.
Что будем собирать?
Мы будем собирать шаблон для B2B веб-приложения. Начнем с выбора технологий для front-end части. Сфокусируемся на скорости разработки, наличии готовых примеров и размере community. Не будем использовать какие-либо вендорлок библиотеки, наш проект не должно зависеть от конкретного сервис-провайдера. Мы будем использовать 100% Open Source технологии без дополнительных коммерческих сборов и платных лицензий. Никаких Vendor Lock-in и заказных обзоров от вендоров!
Дисклеймер про опыт автора статьи
Так получилось, что мне приходилось разрабатывать проекты с back-end на python/django, python/flask, python/asyncio, node/express и даже ruby/rails. Я вел курс по веб-разработке в университете.
Работал в крупных компаниях, где несколько команд работают над одним продуктом. И стартапах, где одна команда делает то, что не может enterprise. Видел микросервисы и монолиты.
Этот опыт будет влиять на выбор технологий, от этого не избавиться.
Нужно понимать, если наш стартап будет успешным, то нам бы не хотелось переписывать все с нуля из-за плохого выбора технологий, это дорого.
Front-end
Все чаще принято говорить про «мета-фреймворк» (front-end meta-frameworks). На сегодня можно выделить Angular, Astro, Next.js, Remix, Nuxt, SolidStart, SvelteKit. Все они смотрят друг за другом, впитывают и адаптируют идеи и подходы друг друга. Если вам интересно детеальнее сравнить фичи, то я бы порекомендовал доклад Addy Osmany c Google I/O 2024 (слайд взят оттуда), плюс есть статья в блоге prismic "Understanding the JavaScript Meta-framework Ecosystem" с поверхностным озором мета фреймворков, ну и целая куча статей сравнений react vs vue, svelt vs react и др. Эти статьи имеют ограниченное время жизни, они теряют свою актуальность с каждым новым релизом, так как фреймворки берут особенности и идеи друг у друга.
Есть неплохое сравнение популярности на основе «звездочек» на гитхабе, оно коррелирует с размером community и трендами в мире JavaScript.
Тут можно видеть, как vue был в какой-то момент популярнее react или как постепенно теряет популярность jQuery. Помимо звездочек, согласно данным из опроса stackowerflow, Node.js и React.js — наиболее распространенные веб-технологии, используемые всеми респондентами.
Учитывая тренды, можно сказать, что React (на первом слайде представлен как мета-фреймворк Next.js) не дает кому-либо себя обогнать.
Мы будем использвать React + Next.js, так как это самый популярный набор для старта.
С чего начать разбираться? Если вы ничего не знаете о React, то лучше всего — с https://react.dev/learn. А для Next.js лучше всего начать с https://nextjs.org/docs.
Но одного фреймворка мало. Для быстрой разработки нам понадобится UI библиотека.
UI библиотека
Хороший обзор React UI библиотек с подробным описанием есть в блоге prismic.
Фактически есть два лидера: MUI (Material UI) и Ant. MUI имеет платную версию с расширенным набором компонентов. Например, если вы хотите иметь возможность сортировать колонки таблицы используя Drag & Drop, то для MUI вам понадобится pro версия, в то время как в Ant это доступно без оплаты в примерах. В целом, в Ant чуть больше примеров и готовых компонентов.
Bootstrap & остальные
Я не стал выделять Bootstrap, хотя у него и есть пример на базе Next.js. У него мало сложных B2B компонентов. Стоит обратить внимание на примеры форм и таблиц, это наиболее сложные компоненты. И тут снова выигрывает Ant со своими примерами.
Стартовый набор b2b компонентов
Чтобы нам не изобретать Layout, Auth и Permission компоненты, не заниматься созданием библиотеки для получения данных и не создавать свои тулы для realtime обновления данных, мы можем взять refine.
Это набор React компонентов, которые так или иначе приходится изобретать для любого B2B-приложения. Я рекомендую пройти официальный tutorial, чтобы понять основную концепцию и базовые абстракции, используемые в Refine.
У Refine есть набор шаблонов для админ-панелей с поддержкой ant и mui, который можно использовать для быстрого старта. Это подойдет для быстрого старта b2b-стартапа.
Поддержка переводов
Мы будем сразу делать наш продукт международным и нам понадобится что-то для интернационализации. Но, если вы боретесь за размер front-end бандла, то можно вообще не использовать переводы или использовать что-то свое на vanilla-js. Я люблю библиотеки с возможностью выгрузки переводов в сервис, чтобы отдать это профессиональному переводчику или ChatGPT.
Какие есть варианты? В документации Next.js собраны все популярные i18n библиотеки. Из этого списка можно выделить react-i18next, lingui и tolgee, они связаны с облачными сервисами для переводов. Выберем react-i18next, тк в ней есть возможность поднять свой сервис переводов с некоторой логикой и не зависеть от облачного провайдера и примеры интеграции с refine.
Сборка
Мы выбрали технологии, теперь осталось все это собрать в одном месте.
Мы будем использовать монорепозиторий, т.к. у нас не будет времени переключаться между проектами и упражняться с рефакторингом в нескольких репозиториях одновременно. Если наш проект станет большим, то мы всегда сможем его разделить.
Для организации работы в монорепозитории мы будем использовать workspaces. А чтобы наш проект собирался быстрее, мы будем использовать turbo, он позволит ускорить сборку проекта и хорошо работает с Next.js.
Пара слов про Nx и Lerna
Есть еще несколько интересных тулов для работы в монорипозитории, о которых можно упомянуть:
Nx является более сложным инструментом сборки для работы с монорепозиториями, поддерживающим множество языков. Имеет гибкую систему плагинов на все случаи жизни. Позволяет задавать ограничение на использование внутренних библиотек в рамках монорепозитория. Это более зрелый проект, который включает в себя много дополнительных возможностей. Пока нам все это не понадобится. Нам нужна быстрая инкрементальная сборка без каки-либо усложнений. Не хочется проходить курс по nx, чтобы просто ускорить сборку проета. Можно прочитать сравнение nx vs turbo от авторов nx. Из нюансов: Nx может добавлять особенностей в работе с монорепозиторием и не все библиотеки могут работать с Nx из коробки. Есть еще пара ссылок по теме: 1, 2.
Lerna часто используется вместе с Nx, добавляет удобные возможности для публикации пакетов в NPM, автоматическое увеличение версий пакетов, генерация changelog, создание релизов на GitHub и т. п.
Выделяйте все внешние зависимости в пакеты. У нас будет packages/ui — для всех внешних UI библиотек и React компонентов и packages/i18n — для переводов. Код нашего фронта мы поместим в apps/web.
Что получилось?
Я собрал монорепозиторий для фронта, на базе React, Refine, Antd, i18next, Next.js. В проекте есть поддержка переводов и детектирование языка пользователя. Поддержка стилизации компонентов Antd с возможность переключения темы dark и light.
Результат можно посмотреть в github репозитории и демо, развернутом на Vercel.
Статья получилась объемной и затрагивает только front-end, если она наберет популярность, то я продолжу сборку, и мы посмотрим на то, какие есть варианты для back-end.
Да начнется холивар в комментах. Пишите свои предложения и мысли.
Комментарии (6)
LyuMih
20.06.2024 19:46+1По ui либам.
Между Material UI и Ant рекомендую брать Ant.
Причина - в Ant есть компоненты, которые в MUI закрыты за "платной" лицензией.
Например, RangePicker . Чтобы собрать похожий функционал на MUI, нужно потратить +- несколько часов на отладку, т.к. он собирается из двух не связанных между собой DatePicker из бесплатной версии. Это может быть критичным в рамках хакатона.
Также Ant имеет более упрощённый вариант к работе с формами - это позволяет делать немого быстрее валидацию полей формы, что тоже может оказать на результат хакатона, т.к. там обычно в конце не хватает пары часов на исправление багов.
Настроить тему Ant под проект можно в Theme Editor
Если нужны графики и чарты, к анту идёт ant-charts , что тоже может пригодиться в некоторых кейсах.
novoselov
20.06.2024 19:46Что с поддержкой мобильной версии? Почему не Flutter стек?
pahaz Автор
20.06.2024 19:46Базовая поддержка мобильной верстки есть у Ant и Refine. Можно посмотреть в демо.
Вторая часть вопроса религиозная. Часть ответа есть тут. Можно было бы и на Flutter.
Работа с таблицами
Мы собираем стартовый набор для B2B-приложений, где важна работа с таблицами и сложными формами. Не хочется тратить время на проектирование и разработку таких компонентов с нуля. На Reddit есть тред, где ищут готовые компоненты для работы с таблицами для Flutter. Для таблиц, нужны функции сортировки и фильтрации по колонкам, возможность перестановки колонок, "инлайн" редактирование и работа с "горячими клавишами" из коробки.
Можно создать эти компоненты самостоятельно или купить их, например, у Syncfusion. В Ant эти функции доступны из коробки под лицензией MIT.
Примеры B2B-интерфейсов
Хочется иметь доступ к типовым админкам с открытым исходным кодом (лицензия MIT), чтобы не начинать с чистого листа и не разрабатывать все компоненты самостоятельно.
Можно также приобрести готовые решения на CodeCanyon для Flutter.
Итог
В целом, можно использовать Flutter, если вас устраивает размер сообщества, тренд развития и популярность Dart.
pahaz Автор
20.06.2024 19:46Вижу, что возникают вопросы: почему не "Х" или мой любимый фреймворк? Чтобы избежать дискуссий на тему "моя религия лучше", подчеркну основные тезисы статьи:
Разрабатывать веб-приложение можно на любых технологиях: Flutter, Angular, Vue, BEM или mol.
Выбор технологий в статье основан на размере сообщества, драйверах роста популярности и личном опыте.
Если вы создаете стартап, важно не тратить время на обучение новым технологиям, а сосредоточиться на захвате рынка.
Размер сообщества и популярность технологий влияют на наличие специалистов с релевантными знаниями, что снижает временные затраты на их обучение.
Сейчас, если что-то популярно, ChatGPT, скорее всего, об этом знает и может дать более релевантные ответы.
IgorAlentyev
Выбор ui либ странный, есть же chadcn, mantine, chakra, prime.
Так же еще хорошо бы бекенд какой то иметь, не все можно сделать на клиентской стороне