typical startup thinking about technology
typical startup thinking about technology

Давайте попробуем собрать свой идеальный 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.

JS framework stars
JS framework stars

Тут можно видеть, как vue был в какой-то момент популярнее react или как постепенно теряет популярность jQuery. Помимо звездочек, согласно данным из опроса stackowerflow, Node.js и React.js — наиболее распространенные веб-технологии, используемые всеми респондентами.

Учитывая тренды, можно сказать, что React (на первом слайде представлен как мета-фреймворк Next.js) не дает кому-либо себя обогнать.

next.js + react
next.js + react

Мы будем использвать React + Next.js, так как это самый популярный набор для старта.

С чего начать разбираться? Если вы ничего не знаете о React, то лучше всего — с https://react.dev/learn. А для Next.js лучше всего начать с https://nextjs.org/docs

Но одного фреймворка мало. Для быстрой разработки нам понадобится UI библиотека.

UI библиотека

Хороший обзор React UI библиотек с подробным описанием есть в блоге prismic.

mui vs antd
mui vs antd

Фактически есть два лидера: MUI (Material UI) и Ant. MUI имеет платную версию с расширенным набором компонентов. Например, если вы хотите иметь возможность сортировать колонки таблицы используя Drag & Drop, то для MUI вам понадобится pro версия, в то время как в Ant это доступно без оплаты в примерах. В целом, в Ant чуть больше примеров и готовых компонентов.

Bootstrap & остальные

Я не стал выделять Bootstrap, хотя у него и есть пример на базе Next.js. У него мало сложных B2B компонентов. Стоит обратить внимание на примеры форм и таблиц, это наиболее сложные компоненты. И тут снова выигрывает Ant со своими примерами.

Стартовый набор b2b компонентов

Чтобы нам не изобретать Layout, Auth и Permission компоненты, не заниматься созданием библиотеки для получения данных и не создавать свои тулы для realtime обновления данных, мы можем взять refine.

refine
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)


  1. IgorAlentyev
    20.06.2024 19:46

    Выбор ui либ странный, есть же chadcn, mantine, chakra, prime.

    Так же еще хорошо бы бекенд какой то иметь, не все можно сделать на клиентской стороне


  1. belirofon
    20.06.2024 19:46
    +2

    Автор, продолжай, тема очень интересная и актуальная!


  1. LyuMih
    20.06.2024 19:46
    +1

    По ui либам.

    Между Material UI и Ant рекомендую брать Ant.
    Причина - в Ant есть компоненты, которые в MUI закрыты за "платной" лицензией.
    Например, RangePicker . Чтобы собрать похожий функционал на MUI, нужно потратить +- несколько часов на отладку, т.к. он собирается из двух не связанных между собой DatePicker из бесплатной версии. Это может быть критичным в рамках хакатона.

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

    Настроить тему Ant под проект можно в Theme Editor

    Если нужны графики и чарты, к анту идёт ant-charts , что тоже может пригодиться в некоторых кейсах.


  1. novoselov
    20.06.2024 19:46

    Что с поддержкой мобильной версии? Почему не Flutter стек?


    1. pahaz Автор
      20.06.2024 19:46

      Базовая поддержка мобильной верстки есть у Ant и Refine. Можно посмотреть в демо.

      Вторая часть вопроса религиозная. Часть ответа есть тут. Можно было бы и на Flutter.

      Работа с таблицами

      Мы собираем стартовый набор для B2B-приложений, где важна работа с таблицами и сложными формами. Не хочется тратить время на проектирование и разработку таких компонентов с нуля. На Reddit есть тред, где ищут готовые компоненты для работы с таблицами для Flutter. Для таблиц, нужны функции сортировки и фильтрации по колонкам, возможность перестановки колонок, "инлайн" редактирование и работа с "горячими клавишами" из коробки.

      Можно создать эти компоненты самостоятельно или купить их, например, у Syncfusion. В Ant эти функции доступны из коробки под лицензией MIT.

      Примеры B2B-интерфейсов

      Хочется иметь доступ к типовым админкам с открытым исходным кодом (лицензия MIT), чтобы не начинать с чистого листа и не разрабатывать все компоненты самостоятельно.

      Можно также приобрести готовые решения на CodeCanyon для Flutter.

      Итог

      В целом, можно использовать Flutter, если вас устраивает размер сообщества, тренд развития и популярность Dart.


  1. pahaz Автор
    20.06.2024 19:46

    Вижу, что возникают вопросы: почему не "Х" или мой любимый фреймворк? Чтобы избежать дискуссий на тему "моя религия лучше", подчеркну основные тезисы статьи:

    Разрабатывать веб-приложение можно на любых технологиях: Flutter, Angular, Vue, BEM или mol.

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

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

    Размер сообщества и популярность технологий влияют на наличие специалистов с релевантными знаниями, что снижает временные затраты на их обучение.

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