← Назад к вопросам

Разрабатывал ли библиотеку по своей дизайн-системе

2.2 Middle🔥 131 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Мой опыт разработки библиотеки компонентов для дизайн-системы

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

Архитектурные решения и ключевые компоненты

Библиотека была построена на React с использованием TypeScript, что обеспечивало строгую типизацию и автодополнение в IDE. Для стилизации мы выбрали CSS-in-JS подход с Styled-components, что давало несколько преимуществ:

// Пример компонента кнопки из нашей библиотеки
import React from 'react';
import styled, { css } from 'styled-components';

interface ButtonProps {
  variant: 'primary' | 'secondary' | 'outline';
  size: 'small' | 'medium' | 'large';
  disabled?: boolean;
  fullWidth?: boolean;
}

const StyledButton = styled.button<ButtonProps>`
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: ${({ theme }) => theme.borderRadius.medium};
  font-family: ${({ theme }) => theme.typography.fontFamily};
  font-weight: 500;
  cursor: ${({ disabled }) => (disabled ? 'not-allowed' : 'pointer')};
  transition: all 0.2s ease;
  width: ${({ fullWidth }) => (fullWidth ? '100%' : 'auto')};

  // Варианты кнопок
  ${({ variant, theme }) => {
    switch (variant) {
      case 'primary':
        return css`
          background-color: ${theme.colors.primary.main};
          color: white;
          border: none;
          
          &:hover:not(:disabled) {
            background-color: ${theme.colors.primary.dark};
          }
        `;
      case 'outline':
        return css`
          background-color: transparent;
          color: ${theme.colors.primary.main};
          border: 2px solid ${theme.colors.primary.main};
        `;
      default:
        return css`
          background-color: ${theme.colors.gray[100]};
          color: ${theme.colors.gray[800]};
          border: none;
        `;
    }
  }}

  // Размеры
  ${({ size, theme }) => {
    switch (size) {
      case 'small':
        return css`
          padding: ${theme.spacing.xs} ${theme.spacing.sm};
          font-size: ${theme.typography.fontSize.sm};
        `;
      case 'large':
        return css`
          padding: ${theme.spacing.md} ${theme.spacing.lg};
          font-size: ${theme.typography.fontSize.lg};
        `;
      default:
        return css`
          padding: ${theme.spacing.sm} ${theme.spacing.md};
          font-size: ${theme.typography.fontSize.md};
        `;
    }
  }}
`;

export const Button: React.FC<ButtonProps & React.ButtonHTMLAttributes<HTMLButtonElement>> = ({
  children,
  variant = 'primary',
  size = 'medium',
  disabled = false,
  fullWidth = false,
  ...props
}) => {
  return (
    <StyledButton
      variant={variant}
      size={size}
      disabled={disabled}
      fullWidth={fullWidth}
      {...props}
    >
      {children}
    </StyledButton>
  );
};

Основные принципы разработки

Система дизайн-токенов стала фундаментом нашей библиотеки. Мы создали централизованный объект тем, который включал:

  • Цветовую палитру с семантическими именами
  • Типографику (шрифты, размеры, межстрочные интервалы)
  • Пространственные единицы (spacing)
  • Значения скруглений (border-radius)
  • Тени и эффекты

Композиционный подход позволял создавать сложные компоненты из простых базовых:

// Композиция компонентов
import { Button, Icon, Text } from './ui-library';

const SubmitButton = () => (
  <Button variant="primary" size="large">
    <Icon name="check" size={20} />
    <Text as="span" ml="sm">Отправить</Text>
  </Button>
);

Инфраструктура и инструменты разработки

Для обеспечения качества и удобства разработки мы внедрили:

Storybook как основную платформу для:

  • Документирования компонентов с примерами использования
  • Изолированной разработки и тестирования
  • Визуального тестирования изменений

Автоматизированное тестирование включало:

  • Unit-тесты с Jest и React Testing Library
  • Визуальные тесты с помощью Percy
  • Тесты на доступность (a11y)

Система версионирования с Semantic Versioning и автоматическим CHANGELOG:

{
  "name": "@company/design-system",
  "version": "2.1.0",
  "scripts": {
    "build": "rollup -c",
    "test": "jest",
    "storybook": "start-storybook -p 6006",
    "release": "standard-version"
  }
}

Вызовы и решения

Согласованность API - мы разработали конвенции именования пропсов, чтобы все компоненты имели предсказуемый интерфейс:

  • variant для вариантов стилизации
  • size для размеров
  • Префикс on для обработчиков событий

Производительность - оптимизировали бандлы через tree-shaking, динамические импорты и мемоизацию:

// Динамический импорт тяжелых компонентов
const HeavyComponent = React.lazy(() => import('./HeavyComponent'));

export const Modal: React.FC<ModalProps> = (props) => {
  return (
    <React.Suspense fallback={<Loader />}>
      <HeavyComponent {...props} />
    </React.Suspense>
  );
};

Доступность (a11y) - все компоненты реализовывали WAI-ARIA спецификации, поддерживали keyboard navigation и screen readers.

Результаты внедрения

После внедрения дизайн-системы мы достигли:

  • 70% снижения времени разработки новых фич
  • 90% согласованности UI между разными командами
  • 40% уменьшения размера бандла благодаря повторному использованию
  • Упрощения onboarding новых разработчиков

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

Разрабатывал ли библиотеку по своей дизайн-системе | PrepBro