Разработали шаблон фронтенд-приложения React + Next.js и теперь быстрее стартуем проекты

Привет, это Лиза из «Лиги А.»! Раньше мы тратили много времени на сбор архитектуры под каждый проект. У нас не было единого подхода и понимания в сборке важных деталей. Поэтому взялись за разработку своего шаблона. Рассказываем небольшую историю о том, как мы улучшили процесс старта проектов.

Разработали шаблон фронтенд-приложения React + Next.js и теперь быстрее стартуем проекты

Коротко о том, что сделали

Если просто, то мы смешали опыт всех разработчиков Лиги, добавили принципов Feature-Sliced Design и получили модульную архитектурную модель. Установили базовые пакеты, которые всегда используем на проектах. Плюс настроили линтеры и Prettier для автоматизации контроля качества кода.

Сейчас мы имеем структуру и базовые устоявшиеся пакеты/настройки.

Предыстория

Когда нужно было начинать новый проект, мы заново собирали под него папки и пакеты. Также использовали create-next-app и имели простую структуру, которую приходилось каждый раз дорабатывать или использовать решения с других проектов.

Собирать новую архитектуру под каждый проект иногда даже лучше, чем иметь шаблон — задачи клиентов могут отличаться и для кого-то нужны совсем другие решения. Но всё-таки мы пришли к тому, что для разработчиков многообразие библиотек только усложняет погружение в проект, а свобода в реализации и проектировании захламляет кодовую базу.

Андрей, React-разработчик Лиги

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

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

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

Проект просто терял структурность.

Проблемы, которые мешали нам работать

👉🏻 Не было сформулировано чёткого архитектурного подхода к разработке веб-приложений

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

👉🏻 Структура на проектах иногда отличалась

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

Начали с изучения архитектурной методологии

Посмотрели в сторону известной методологии Feature slide design (FSD), в которой используется 3 уровня абстракции — слои, слайсы и сегменты. Проще говоря, это сборник правил и соглашений по организации кода.

Для шаблона мы взяли только иерархию и слои.

Так выглядит схема слоёв и иерархия. Картинка с официального сайта FSD — https://feature-sliced.design/ru/
Так выглядит схема слоёв и иерархия. Картинка с официального сайта FSD — https://feature-sliced.design/ru/

Каталоги верхнего уровня в FSD называются «слоями» — это первый уровень. Суть в том, что у нас есть строго определённое число возможных слоёв:

— Shared. Содержит ресурсы для повторного использования, которые не зависят от функционирования бизнес-логики. Например, инструменты для работы с UI.

— Entities. Содержит специфичные бизнес-объекты. Например, User, Payments, Products.

— Features. Содержит пользовательские истории. Например, ChangePassword, MakePayment.

— Widgets. Содержит компоненты, из которых составляются объекты и фичи. Например, UserSettings.

— Pages. Содержит страницы приложения. Это композиционный уровень, который мы собираем из виджетов, фич и объектов.

— Processes. Содержит сложные внутристраничные сценарии. Например, механизмы аутентификации и капчу.

— App. Содержит настройки приложения, стили и провайдеры.

У слоёв есть свои зоны и ответственности со ступенчатой иерархией. Она строится так, чтобы получился понятный однонаправленный поток данных.

Так, например, выглядит структура проекта e-commerce. На сайте можно найти много примеров проектов — https://feature-sliced.design/examples
Так, например, выглядит структура проекта e-commerce. На сайте можно найти много примеров проектов — https://feature-sliced.design/examples

Мы используем Next.js в качестве фреймворка по умолчанию. Это накладывает некоторые ограничения на использование слоёв FSD, потому что каталоги app и pages зарезервированы. Поэтому мы решили не копировать нейминг и сократить количество слоёв в нашем шаблоне.

Так выглядит наша структура. Здесь видно, как мы повторяем иерархию слоёв из методологии FSD
Так выглядит наша структура. Здесь видно, как мы повторяем иерархию слоёв из методологии FSD

Как нам помогла методология FSD

Мы закрыли задачу сформировать универсальную масштабируемую структуру с понятной иерархией слоёв и сущностей. Получили порядок, который теперь можем применять на проектах.

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

Как мы работаем с шаблоном

У нас есть ключевой слой, который мы назвали modules. Он может иметь свои изолированные компоненты, стейты, бизнес логику и прочее. По сути, является аналогом слоя widgets и имеет slices и segments по аналогии с FSD.

Мы закинули сюда инструменты и пакеты, которые используем везде на проектах
Мы закинули сюда инструменты и пакеты, которые используем везде на проектах
По умолчанию используем легковесный стэйт менеджер Jotai, библиотеку для написания запросов Axios и заранее написанные хуки 
По умолчанию используем легковесный стэйт менеджер Jotai, библиотеку для написания запросов Axios и заранее написанные хуки 

Добавили дополнительные системы контроля за кодом — Prettier и Linter

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

Представьте ситуацию, когда один разработчик пишет код по-своему — использует 10 пробелов и кривые строчки. А второй — любит минимализм и чистоту в коде. Так вот, они оба могут писать код как им угодно, потому что в конечном итоге Prettier заберёт правила, которые мы прописали и поменяет весь код под них.
Андрей, React-разработчик
Показываем, как работает Prettier

ESLint — отвечает за правила написания кода. С его помощью разработчики могут обнаруживать и устранять потенциальные проблемы в коде, а также поддерживать высокие стандарты качества.

Показываем, как работает ESLint
Показываем, как работает ESLint

Немного автоматизации

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

В итоге, тратим на создание компонентов 10 секунд
В итоге, тратим на создание компонентов 10 секунд

Это базовый шаблон, который мы продолжаем дорабатывать

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

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

Мы активно следим за обновлениями версий пакетов. Например, скоро выйдет новый React и мы займёмся миграцией на свежую версию.

Чуть не забыли рассказать немного о себе

Мы — агентство разработки. Делаем проекты для дизайн-студий, диджитал-агентств и продуктовых команд. Работаем с разными форматами — от простых лендингов до сложных сервисов.

Ведём телеграм канал и другие соцсети про нашу айтишную жизнь — пишем о проектах, клиентах и работе с дизайнерами. Заходите)

66
2 комментария

Унифицированный подход к архитектуре помогает сократить время на подготовку проектов и повысить их структурность.

1
Ответить

Так точно 🙂‍↕️

Ответить