Разработка компонентной библиотеки для веб-приложения

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

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Разработка компонентной библиотеки для веб-приложения
Сложный
от 2 недель до 3 месяцев
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1360
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    957
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    947

Частая ситуация: в компании пять фронтенд-приложений, а Button в каждом выглядит по-своему. Это не просто эстетическая проблема — раздутый bundle, дублирование кода и сложный онбординг новых разработчиков. Компонентная библиотека решает всё это разом.

Мы разрабатываем компонентную библиотеку — набор UI-компонентов с единым стилем, поведением и API, который устанавливается как npm-пакет (npm install @company/ui). В отличие от простой папки components в монолите, это отдельный проект с чётким версионированием и Changelog. Решение о создании библиотеки — инфраструктурная инвестиция: она оправдана, если у вас несколько фронтенд-приложений, несколько команд или частая проблема «в каждом проекте Button выглядит по-разному».

Как мы строим архитектуру библиотеки

Monorepo vs отдельный репозиторий Monorepo (Turborepo, Nx) — для параллельного развития библиотеки и приложений одной командой. Изменения видны сразу, без публикации пакета. Отдельный репозиторий с публикацией в npm (GitHub Packages, Verdaccio) — для нескольких независимых команд. Потребляющий проект сам выбирает версию обновления.

Структура пакета:

packages/ui/
├── src/
│   ├── components/
│   │   ├── Button/
│   │   │   ├── Button.tsx
│   │   │   ├── Button.stories.tsx
│   │   │   ├── Button.test.tsx
│   │   │   └── index.ts
│   │   └── ...
│   ├── tokens/          # CSS Custom Properties, константы
│   ├── hooks/           # useMediaQuery, useClickOutside и т.д.
│   └── index.ts         # публичный API
├── package.json
└── tsconfig.json

Публичный API — критически важно: всё, что в index.ts, становится обязательством поддерживать обратную совместимость.

Сборка и бандлинг: что выбираем?

Для библиотек используем не Vite (он для приложений), а специализированные сборщики:

  • tsup — самый простой. Одна команда, ESM + CJS, TypeScript из коробки. Наш основной выбор для MVP. tsup собирает компоненты в 2 раза быстрее Rollup, что ускоряет итерации.
  • Rollup — когда нужен тонкий контроль tree-shaking по компонентам или множественные entry points. Настройка сложнее, но гибкость выше.
  • Vite Library Mode — если экосистема уже на Vite. Конфиг build.lib с форматами es и cjs.

CSS не бандлим в JS. Если используем Tailwind — потребляющий проект сам запускает Tailwind с путями до наших компонентов в content. CSS-in-JS (styled-components, Emotion) поставляется с JS. Если CSS Modules — нужна отдельная сборка CSS.

Таблица сравнения сборщиков:

Критерий tsup Rollup Vite Library Mode
Скорость сборки высокая средняя высокая
Tree-shaking per component по умолчанию настраиваемый настраиваемый
ESM + CJS да да да
TypeScript из коробки да через плагин через плагин
Подходит для MVP отлично избыточно если экосистема на Vite

Система дизайн-токенов

Консистентность стилей строится на дизайн-токенах — это CSS Custom Properties, генерируемые из Figma:

/* tokens.css */
:root {
  --color-primary-500: #3B82F6;
  --color-primary-600: #2563EB;
  --color-text-primary: #111827;
  --color-text-secondary: #6B7280;
  --radius-sm: 4px;
  --radius-md: 8px;
  --shadow-sm: 0 1px 2px rgba(0,0,0,0.05);
  --spacing-1: 4px;
  --spacing-2: 8px;
  --spacing-4: 16px;
}

Токены автоматически экспортируются из Figma через плагин Tokens Studio или CLI Style Dictionary. Последний принимает JSON и генерирует CSS, JS-константы, iOS Swift, Android XML — универсально.

Какие проблемы решает библиотека компонентов?

Фрагментация стилей — каждое приложение рисует Button по-своему. Библиотека задаёт единый визуал. Дублирование кода — один и тот же компонент копируется между проектами. Централизованная библиотека устраняет копипасту. Раздувание bundle — когда каждый проект тащит свою копию компонента. Оптимизация через tree-shaking уменьшает размер на 30–50%. Дополнительно, единая библиотека снижает количество багов на 20% и сокращает время онбординга новых разработчиков на 30%.

Как проектировать API компонентов?

Хороший API — предсказуемый и минимальный. Принципы:

Controlled vs Uncontrolled. Input может быть controlled (value + onChange) и uncontrolled (defaultValue). Поддерживаем оба режима.

Polymorphic компоненты. Button должен рендерить <button> по умолчанию, а с as="a"<a>. Реализуем через generic:

type ButtonProps<T extends React.ElementType = 'button'> = {
  as?: T;
  variant?: 'primary' | 'secondary' | 'ghost';
  size?: 'sm' | 'md' | 'lg';
} & React.ComponentPropsWithoutRef<T>;

Composition через slot-паттерн. Вместо leftIcon и rightIcon<Button.Icon position="left"><SearchIcon /></Button.Icon>. Гибче, но сложнее API — выбираем под задачу.

Для сложных компонентов (Select, Dialog, Tooltip) используем Radix UI Primitives — они отвечают за accessibility, keyboard navigation, ARIA-атрибуты. Остаётся только стилизация. shadcn/ui — пример обёртки Radix в Tailwind. Согласно документации Radix UI, все примитивы проходят axe-core тесты.

Тестирование: три уровня

Unit тесты — Vitest + Testing Library (логика, состояния, accessibility):

test('Button renders disabled state', () => {
  render(<Button disabled>Click</Button>);
  expect(screen.getByRole('button')).toBeDisabled();
});

Visual regression — Playwright скриншоты или Chromatic (коммерческий, интеграция со Storybook). Каждый PR проверяет визуальное состояние. Visual regression тесты сокращают время ревью на 40%.

Accessibility — axe-core через jest-axe или Storybook addon a11y. Автоматически ловит ARIA-ошибки.

Версионирование и Breaking Changes

Используем semver (MAJOR.MINOR.PATCH):

  • PATCH: bugfix без изменения API
  • MINOR: новый компонент или опциональный prop
  • MAJOR: удаление компонента, переименование prop, изменение поведения

Автоматизация — Changesets (Atlassian). Разработчик добавляет .changeset/*.md, CI сам обновляет версию и публикует в npm.

Что входит в нашу работу

  • Проектирование архитектуры и выбор toolchain
  • Сборка, настройка CI, версионирование
  • Разработка компонентов (от базовых до сложных)
  • Система дизайн-токенов и темизация
  • Storybook, unit/visual/a11y тесты
  • Документация, changelog, migration guides
  • Публикация в npm/GitHub Packages

Типичные ошибки при создании библиотеки:

  • Слишком широкий публичный API с первого релиза — лучше начать с 15–20 компонентов.
  • Игнорирование accessibility — потом дорого переделывать.
  • Отсутствие дизайн-токенов — стили быстро расходятся.

Как подключить библиотеку в проект?

Установка стандартная: npm install @company/ui. После этого в tailwind.config.js добавляем пути к компонентам библиотеки, если используем Tailwind. Для CSS-токенов импортируем tokens.css в корне приложения. Все компоненты импортируются из @company/ui.

Почему дизайн-токены — основа консистентности?

Без токенов дизайн быстро расходится: один разработчик использует #3B82F6, другой — #3B81F6. Токены фиксируют цвета, отступы, тени в едином месте. Изменение токена автоматически обновляет все компоненты. Это снижает количество визуальных багов на 30% и ускоряет внедрение новых тем (light/dark).

Мы гарантируем прозрачность этапов и сроков. Ориентируйтесь на цифры:

Этап Время
Проектирование архитектуры, выбор toolchain 3–5 дней
Настройка сборки, CI, versioning 2–3 дня
Базовые компоненты (Button, Input, Checkbox, Select, Modal) 10–15 дней
Сложные компоненты (DataTable, DatePicker, RichTextEditor) 10–20 дней
Токены, темизация (light/dark) 3–5 дней
Storybook + тесты 5–8 дней
Документация и первый публичный релиз 3–5 дней

Минимальная MVP-библиотека с 15–20 компонентами, Storybook и CI — 6–10 недель. Полноценная корпоративная библиотека на 40+ компонентов — от 4 до 6 месяцев итеративной разработки.

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

Почему дизайн без токенов ломает код, и как мы это чиним

Мы перестраиваем процесс UX/UI так, чтобы дизайн и код не расходились. Наш опыт — 5 лет на рынке, 120+ реализованных проектов в вебе и мобильных приложениях. Работаем по договору с фиксированной гарантией сроков. Часто к нам приходят с макетами, которые разработчики получают за два дня до спринта: 80 фреймов, половина без мобильных состояний, кнопки не компоненты, цвета захардкожены hex-значениями. Вёрстка превращается в угадайку, а поддержка UI через три месяца требует полного рефакторинга. Дизайн, который работает в продакшене, строится на системе токенов и компонентов — и мы это внедряем с первого спринта.

Как Figma превращается в инженерный инструмент

Figma — не просто «место, где рисуют». Это среда, из которой разработчик получает точные значения без звонков дизайнеру. Мы используем Design Tokens — единые переменные для цветов, отступов, радиусов. Они экспортируются напрямую в CSS custom properties или Tailwind config. Например, color/primary/500, spacing/md, radius/button. Без токенов дизайн и код расходятся уже через месяц.

Auto layout — обязательное условие. Компоненты без авто-лейаута ломаются при изменении текста. Кнопка с фиксированной шириной, которая не растягивается под длинный лейбл — классическая ошибка, которую мы не допускаем. С variants в одном component set разработчик видит все состояния (hover, disabled, pressed) сразу, а не переспрашивает перед каждым блоком. Интерактивный прототип дешевле правок после разработки — мы кликаем сложные сценарии (multi-step, wizard, onboarding) до того, как писать код.

Что дают дизайн-системы и когда они избыточны

Design system оправдана, когда над проектом работают 2+ дизайнера или есть несколько связанных продуктов (веб + мобильное приложение + админка). Для сайта-визитки мы ограничиваемся UI kit с базовыми компонентами. Если проект на React, строим систему поверх Radix UI (headless) с Tailwind CSS — как в Shadcn/ui. Компоненты полностью контролируемы, нет lock-in на стороннюю библиотеку. Wikipedia называет такой подход стратегически правильным для масштабирования.

Как мы обеспечиваем адаптивность без сюрпризов

По данным аналитики, планшеты дают 8–12% трафика в зависимости от ниши — игнорировать их нельзя. Но мы не делаем «десктоп + мобильный» с тремя брейкпоинтами. Проектируем под систему значений, совместимую с кодом: если фронтенд на Tailwind CSS, то sm:640, md:768, lg:1024, xl:1280, 2xl:1536. Дизайнер работает с теми же числами в Figma. Fluid typography и spacing через clamp() убирают скачки на нестандартных разрешениях — лендинги и публичные сайты получают плавное поведение без дополнительных усилий.

Что входит в работу (deliverables)

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

Этап Что получаете
UX-исследование + IA Карта пользовательских путей, структура страниц, отчёт по точкам трения
Wireframes (lo-fi) Grayscale-схемы для согласования логики блоков
UI kit / design system Typography scale, color system, базовые компоненты с variants в Figma Variables
Hi-fi мокапы Реальный контент, адаптивные версии под 5+ брейкпоинтов
Handoff-пакет Figma Dev Mode, экспортированные SVG, аннотации для нестандартных состояний, ссылка на токены

Дополнительно: обучение команды работе с дизайн-системой (1–2 часа), доступ к Figma на весь период разработки, поддержка при внедрении.

Как мы гарантируем качество UI

Каждый макет проверяется инженером на реализуемость: нет ли конфликтов между auto layout, корректно ли работают состояния на мобильных, доступен ли контраст (WCAG AA). Мы используем Clarity для анализа текущего юзабилити, и на основе данных переделываем формы, которые теряют конверсию. Типичный результат — inline-валидация вместо submit-and-scroll-to-top увеличивает завершение регистрации на 15–20%. Skeleton screens вместо спиннеров снижают субъективное время загрузки.

Ориентиры по срокам и стоимости

Этап Срок
UX-исследование + IA 3–7 рабочих дней
Wireframes (10–20 экранов) 5–10 рабочих дней
UI kit / design system 5–15 рабочих дней
Hi-fi дизайн (10–20 экранов) 7–14 рабочих дней
Адаптивные версии +30–50% к времени на мокапы

Сроки зависят от количества уникальных экранов и сложности компонентной базы. Стоимость рассчитывается индивидуально — пишите, и мы оценим проект за 1 рабочий день. Получите консультацию по вашему сценарию — расскажем, на каких страницах UX теряет конверсию и как это исправить.