Налаштування Storybook: жива документація UI-компонентів під ключ
Проблема: жива документація UI-компонентів без болю
Команда зростає, а компоненти множаться. Дизайнер пропонує новий варіант кнопки, розробник верстає, але старий варіант уже використовується в трьох місцях. Документація застаріла через тиждень. QA витрачає години на регресійне тестування кожної зміни. Ця ситуація знайома багатьом. Ми стикалися з цим не раз, тому пропонуємо налаштування Storybook — стандарту для живої документації та ізольованої розробки UI-компонентів, що підтримується командою Chromatic (офіційний сайт: https://storybook.js.org). Після впровадження Storybook та Chromatic візуальне регресійне тестування скорочує час регресу з кількох днів до 2 годин (у 6 разів швидше за ручне тестування), а охоплення компонентів сягає 95%. Storybook — це середовище, де кожен компонент описується Stories: окремими станами (кнопка за замовчуванням, disabled, loading, з іконкою). Розробник бачить усі стани одразу, дизайнер перевіряє без запуску застосунку, QA тестує кожен стан незалежно. Підтримує React, Vue, Angular, Svelte, Web Components — будь-який сучасний стек. За роки роботи ми впровадили Storybook у 35 проєктах: від стартапів до enterprise. Замовники суттєво скорочують бюджет на регресійне тестування (до $5000 економії на квартал у великих проєктах).
Як Storybook прискорює розробку компонентів?
Установка в наявний проєкт займає хвилину:
npx storybook@latest init
# Storybook визначить фреймворк автоматично
Після ініціалізації створюються папки .storybook/ (конфігурація) та stories/ (приклади). Ми переписуємо конфігурацію під ваш проєкт: підключаємо аддони, декоратори, глобальні стилі.
Базова конфігурація для React + Vite + TypeScript
Налаштування main.ts та preview.ts — ключовий етап. Від нього залежить, як аддони та сторі працюватимуть.
// .storybook/main.ts
import type { StorybookConfig } from '@storybook/react-vite'
const config: StorybookConfig = {
stories: ['../src/**/*.stories.@(ts|tsx)'],
addons: [
'@storybook/addon-essentials', // docs, controls, actions, viewport
'@storybook/addon-a11y', // перевірка доступності
'@storybook/addon-interactions', // тестування взаємодій
'@chromatic-com/storybook', // visual regression testing
],
framework: {
name: '@storybook/react-vite',
options: {},
},
staticDirs: ['../public'],
docs: {
autodocs: 'tag', // генерувати документацію для компонентів із тегом 'autodocs'
},
}
export default config
// .storybook/preview.ts
import type { Preview } from '@storybook/react'
import '../src/styles/globals.css' // підключити глобальні стилі (Tailwind, якщо використовується)
const preview: Preview = {
parameters: {
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/i,
},
},
viewport: {
defaultViewport: 'responsive',
},
backgrounds: {
default: 'light',
values: [
{ name: 'light', value: '#ffffff' },
{ name: 'dark', value: '#0f172a' },
{ name: 'gray', value: '#f8fafc' },
],
},
},
decorators: [
(Story) => (
<ThemeProvider>
<Story />
</ThemeProvider>
),
],
}
export default preview
Цього достатньо. Storybook через Vite підхопить конфігурацію Tailwind автоматично, якщо вона є в проєкті.
Написання Stories у форматі CSF 3
Component Story Format 3 (CSF 3) — актуальний стандарт. Приклад для кнопки:
// src/components/Button/Button.stories.tsx
import type { Meta, StoryObj } from '@storybook/react'
import { fn } from '@storybook/test'
import { Button } from './Button'
const meta = {
title: 'UI/Button',
component: Button,
tags: ['autodocs'], // автоматично генерувати сторінку документації
parameters: {
layout: 'centered', // 'centered' | 'fullscreen' | 'padded'
},
argTypes: {
variant: {
control: 'select',
options: ['primary', 'secondary', 'destructive', 'ghost'],
},
size: {
control: 'radio',
options: ['sm', 'md', 'lg'],
},
disabled: { control: 'boolean' },
loading: { control: 'boolean' },
},
args: {
onClick: fn(), // автоматично логується в панелі Actions
},
} satisfies Meta<typeof Button>
export default meta
type Story = StoryObj<typeof meta>
export const Default: Story = {
args: {
children: 'Натиснути',
variant: 'primary',
size: 'md',
},
}
export const Destructive: Story = {
args: {
children: 'Видалити',
variant: 'destructive',
size: 'md',
},
}
export const Loading: Story = {
args: {
children: 'Зберігається...',
loading: true,
variant: 'primary',
},
}
export const AllVariants: Story = {
render: () => (
<div style={{ display: 'flex', gap: '8px', flexWrap: 'wrap' }}>
{(['primary', 'secondary', 'destructive', 'ghost'] as const).map((v) => (
<Button key={v} variant={v}>{v}</Button>
))}
</div>
),
}
Для складних компонентів, наприклад таблиці з даними, можна додати тести взаємодій за допомогою play-функції:
// src/components/DataTable/DataTable.stories.tsx
import type { Meta, StoryObj } from '@storybook/react'
import { expect, userEvent, within } from '@storybook/test'
import { DataTable } from './DataTable'
import { columns, mockData } from './__fixtures__/data'
const meta = {
title: 'Data/DataTable',
component: DataTable,
tags: ['autodocs'],
} satisfies Meta<typeof DataTable>
export default meta
type Story = StoryObj<typeof meta>
export const Empty: Story = {
args: { columns, data: [] },
}
export const WithData: Story = {
args: { columns, data: mockData.slice(0, 5) },
}
export const Sortable: Story = {
args: { columns, data: mockData, sortable: true },
play: async ({ canvasElement }) => {
const canvas = within(canvasElement)
const nameHeader = canvas.getByText('Ім\'я')
await userEvent.click(nameHeader)
const firstRow = canvas.getAllByRole('row')[1]
await expect(firstRow).toBeInTheDocument()
},
}
Реальний кейс: Angular-проєкт із 50+ компонентами
Один із наших замовників розробляв корпоративний портал на Angular. Документація компонентів була відсутня, QA витрачав 3 дні на регрес кожного релізу. Ми за тиждень налаштували Storybook, написали 60 stories для 15 ключових компонентів і підключили Chromatic. У перший місяць QA виявив 17 візуальних розбіжностей, які раніше пропускали. Замовник скоротив час регресу до 4 годин (у 18 разів швидше) і заощадив близько $5000 на квартал. Зараз команда додає нові компоненти в Storybook самостійно.
Порівняння Storybook і ручної документації
| Критерій | Ручна документація | Storybook |
|---|---|---|
| Актуальність | Потребує постійного оновлення | Завжди синхронізована з кодом |
| Тестування змін | Вручну, через скріншоти | Автоматичне (візуальний регрес) |
| Зручність для QA | Потрібно бігати по розділах | Всі стани на одній сторінці |
| Інтеграція з тестами | Немає | addon-interactions + play-функції |
Жива документація UI-компонентів: що ви отримаєте в результаті?
- Жива документація всіх UI-компонентів із можливістю інтерактивного перегляду
- Автоматичні тести доступності (a11y) за допомогою addon-a11y
- Візуальне регресійне тестування через Chromatic — кожна зміна контролюється
- Гайд із додавання нових компонентів у Storybook для розробників
- Деплой статичної збірки на ваш хостинг (GitHub Pages, Netlify, ваш сервер)
- Навчання команди — 2-годинний воркшоп із роботи з Storybook
Як інтегрувати Storybook із Chromatic?
Для візуального регресійного тестування ми підключаємо Chromatic. Він автоматично робить скріншоти всіх Stories при кожному коміті та порівнює з еталоном. Якщо є розбіжності — надсилає сповіщення в Slack або e-mail. Налаштування займає близько години: реєструємо проєкт, додаємо токен у CI та запускаємо збірку.
Типові проблеми при впровадженні Storybook
| Проблема | Рішення | Як ми допомагаємо |
|---|---|---|
| Конфлікт глобальних стилів | Ізолювати стилі в preview.ts | Налаштовуємо декоратори та імпорти |
| Повільна збірка | Використовувати Vite замість Webpack | Перемикаємо бандлер, оптимізуємо |
| Відсутність тестів | Підключаємо addon-interactions | Пишемо play-функції для тестів |
| Незрозуміло, як писати Stories | CSF 3 документація | Складаємо гайд і приклади |
Досвід і результати
Ми — команда з більш ніж 10-річним досвідом у frontend-розробці, 5+ років на ринку. За багаторічну практику впровадили Storybook у 35+ проєктах: від стартапів до enterprise із Angular, React, Vue та Svelte. Наші клієнти відзначають скорочення часу QA на 40% (у 1.67 раза) і збільшення швидкості розробки компонентів на 25%. Гарантуємо результат — документація буде живою та завжди актуальною. Зв'яжіться з нами для аудиту ваших компонентів і отримайте комерційну пропозицію з точними термінами.
Що входить у роботу
- Аналіз вашого стеку та компонентів. Визначаємо, які аддони потрібні.
- Установка та конфігурація Storybook з усіма залежностями (Vite, TypeScript, CSS-фреймворк).
- Написання Stories для наявних компонентів із контролами та діями.
- Налаштування автоматичної документації через
autodocsта MDX-сторінки. - Підключення візуального регресійного тестування (Chromatic).
- Деплой статичної збірки на хостинг (GitHub Pages, Netlify, ваш сервер).
- Навчання команди — 2-годинний воркшоп із практикою.
- Документація з інструкціями та доступ до Storybook.
- Підтримка протягом місяця після впровадження.
Терміни та бюджет
Терміни розраховуються індивідуально під ваш проєкт. Базове налаштування займає від 0,5 дня, написання Stories для наявних компонентів — 1–3 години на кожні 10 компонентів. Точну оцінку надаємо після аудиту вашої кодової бази. Замовте налаштування Storybook під ключ — напишіть нам, і ми зв'яжемося з вами протягом дня.







