Storybook и библиотека компонентов: как ускорить фронтенд-разработку
Добавить YuSMP как предпочитаемый источник в Google

Коротко. Storybook — бесплатный open-source инструмент (лицензия MIT), в котором UI-компоненты разрабатывают, документируют и тестируют изолированно от приложения. Каждое состояние компонента описывается отдельной story. Инструмент окупается, когда во фронтенде работают 2+ разработчика, компонентов больше 20 или несколько продуктов живут на одной дизайн-системе. Базовое внедрение по нашему опыту занимает от 1–2 недель.
Пакет storybook скачали из npm около 13,6 млн раз только за неделю с 12 по 18 октября 2026 года (страница пакета в npm), а у репозитория на GitHub больше 91 тыс. звёзд. Актуальная ветка — Storybook 10, вышедший в октябре 2025 года (анонс в блоге Storybook). Иначе говоря, это стандартный инструмент индустрии для работы с библиотекой компонентов, а не нишевая игрушка.
Проблема, которую он решает, знакома любой команде, где продукт живёт дольше года. В интерфейсе появляется семь вариантов одной кнопки, модалки в разных разделах ведут себя по-разному, а новый разработчик неделю выясняет, какой компонент можно переиспользовать, а какой сломает соседнюю страницу. Когда мы ведём frontend-разработку на заказ, библиотеку компонентов в Storybook закладываем с первых спринтов: она снимает эти вопросы до того, как они превращаются в технический долг.
Ниже разберём, как устроен Storybook и чем он отличается от UI kit и дизайн-системы, что нового в версиях 9 и 10, как внедрить его по шагам, тестировать компоненты и публиковать витрину в CI. В конце сравним альтернативы, честно перечислим минусы и посчитаем, когда внедрение окупается.
Что такое Storybook и как он устроен
Storybook — это среда для изолированной разработки UI-компонентов: отдельное веб-приложение, в котором каждый компонент открывается сам по себе, во всех своих состояниях, без запуска основного продукта, бэкенда и реальных данных. Его часто называют витриной или «мастерской» компонентов. Storybook ставится в существующий проект рядом с кодом приложения и читает те же исходники, поэтому в витрине вы видите ровно тот компонент, который уйдёт в продакшн.
Работает это так: разработчик запускает npm run storybook, открывается локальный сайт с деревом компонентов слева и «холстом» справа. На холсте компонент рендерится с заданными параметрами, а панели внизу позволяют менять свойства, смотреть события, проверять доступность и адаптив. Ту же витрину можно собрать в статический сайт и выложить по ссылке для всей команды.

Stories и Component Story Format
Story (история) — это описание одного состояния компонента: «основная кнопка», «кнопка в состоянии загрузки», «заблокированная кнопка». Stories пишутся в файлах *.stories.tsx рядом с компонентом в формате Component Story Format (CSF). Текущий стандарт — CSF 3: файл экспортирует метаданные компонента и набор именованных stories, а параметры задаются через args. По этим же args Storybook автоматически строит панель Controls, где свойства меняются прямо в браузере.
// Button.stories.tsx
import type { Meta, StoryObj } from '@storybook/react-vite';
import { Button } from './Button';
const meta = {
component: Button,
args: { children: 'Оформить заказ' },
} satisfies Meta<typeof Button>;
export default meta;
type Story = StoryObj<typeof meta>;
export const Primary: Story = { args: { variant: 'primary' } };
export const Disabled: Story = { args: { disabled: true } };
export const Loading: Story = { args: { loading: true } };
В Storybook 10 появились CSF Factories — типобезопасный вариант того же формата для React (пока в статусе preview). Он лучше подсказывает типы в редакторе и убирает часть шаблонного кода, но переходить на него срочно не нужно: CSF 3 продолжает работать.
Аддоны: Docs, Controls, Actions, Viewport, a11y, Interactions
Аддоны расширяют витрину. Самые используемые:
- Docs — автоматически собирает страницу документации из типов пропсов и stories; можно дописать MDX-страницы с правилами использования.
- Controls — интерактивная панель для изменения args без правки кода.
- Actions — показывает, какие события (клики, отправка формы) вызвал компонент.
- Viewport — переключает ширину экрана, чтобы проверить адаптив.
- a11y — проверяет доступность компонента правилами axe-core.
- Interactions — пошагово показывает выполнение play-функции, то есть сценария взаимодействия с компонентом.
Какие фреймворки поддерживает Storybook
Storybook работает с React, Vue 3, Angular, Svelte, Web Components, Preact, Ember, Qwik, SolidJS, чистым HTML и React Native — полный список есть в репозитории проекта. Под капотом витрину собирает сборщик (builder): по умолчанию Vite, для проектов на Webpack есть отдельный builder. Для Next.js существуют готовые фреймворк-пакеты, которые подтягивают роутер, шрифты и картинки Next. Запросы вида «storybook react» — самые частые, но на Vue или Angular процесс внедрения такой же.
Зачем фронтенд-команде библиотека компонентов в Storybook
Библиотека компонентов в Storybook нужна, чтобы интерфейс собирался из проверенных и задокументированных деталей, а не писался заново под каждый экран. На практике это даёт команде несколько вещей одновременно:
- Изолированная разработка. Компонент можно сделать и проверить до того, как готовы API, авторизация и тестовые данные. Фронтенд перестаёт ждать бэкенд.
- Живая документация. Документация собирается из кода и не устаревает молча, в отличие от страниц в вики.
- Единый источник правды. Дизайнер, разработчик и тестировщик смотрят на одну и ту же витрину, а не на скриншоты разной свежести.
- Быстрый онбординг. Новый разработчик за час видит все готовые компоненты и их состояния вместо того, чтобы искать их по коду.
- Переиспользование. Если компонент есть в витрине, его берут оттуда — дубли перестают плодиться.
- Меньше регрессий. Stories становятся основой для interaction-, визуальных и a11y-тестов.
- Ревью UI до мержа. Опубликованная по ссылке витрина позволяет дизайнеру, менеджеру продукта и заказчику проверить изменения до релиза.
Масштаб, к которому приходят команды, хорошо виден на открытом кейсе QIC digital hub: в их статье на Хабре описана библиотека из 28 компонентов, для которых написано 200 stories. Это нормальная пропорция: у одного компонента обычно 5–10 значимых состояний, и каждое из них полезно видеть отдельно.
Чем Storybook отличается от UI kit и дизайн-системы
Storybook — это инструмент для показа и проверки компонентов, а не сама дизайн-система и не UI kit. Путаница возникает потому, что все три понятия описывают одни и те же кнопки и поля, но на разных уровнях. UI kit — набор готовых элементов интерфейса, обычно в Figma; подробно мы разбирали это в статье что такое UI kit. Дизайн-система шире: это правила, токены, принципы и процессы, которые связывают дизайн и разработку, — о ней в материале дизайн-система продукта: что это и зачем бизнесу.
| Что сравниваем | UI kit в Figma | Дизайн-система | Библиотека компонентов в коде | Storybook |
| Что это | набор макетов элементов интерфейса | правила, токены, компоненты и процессы | переиспользуемые компоненты на React, Vue и т. п. | витрина, документация и тестовый стенд для компонентов |
| Кто владеет | дизайнеры | дизайн и разработка вместе | фронтенд-команда | фронтенд-команда |
| Артефакт | файл Figma | гайдлайны, токены, UI kit и код | папка в репозитории или npm-пакет | статический сайт с stories и docs |
| Кто пользуется | дизайнеры | вся продуктовая команда | разработчики | разработчики, дизайнеры, QA, менеджеры |
Удобная схема: дизайн-система — это договорённость, UI kit — её отражение в макетах, библиотека компонентов — её реализация в коде, а Storybook — окно, через которое эту реализацию видно и проверяют. Структуру самой библиотеки часто строят по принципам атомарного дизайна: атомы (кнопки, поля), молекулы (поле с подписью и ошибкой), организмы (форма, шапка). Как работает этот подход, мы описали в статье что такое атомарный дизайн; в Storybook такая иерархия ложится прямо в дерево stories.
Что изменилось в Storybook 9 и 10 (2025–2026)
Главные изменения последних двух версий — облегчение установки, встроенное тестирование через Vitest и переход на ESM. Если вы видели Storybook несколько лет назад как тяжёлую и медленную витрину, стоит посмотреть на него заново.
| Версия | Дата | Ключевые изменения |
| Storybook 9 | июнь 2025 | установка на 48% легче, чем у v8; интеграция с Vitest с watch-режимом; interaction-тесты, тесты доступности на axe-core (WCAG), визуальные тесты через Chromatic, отчёты о покрытии |
| Storybook 10 | октябрь 2025 | только ESM — единственное ломающее изменение; размер установки ещё на 29% меньше; Node.js 20.16+, 22.19+ или 24+; модульный автомокинг sb.mock для Vite и Webpack; CSF Factories для React (preview); поддержка Next 16 и Vitest 4; QR-код для открытия витрины на телефоне |
| Storybook 10.6.x | октябрь 2026 | текущая версия пакета в npm (10.6.3), развитие в рамках ветки 10 |
Подробности — в анонсах Storybook 9 и Storybook 10. Там же есть характерная цифра: TypeScript используют более чем в 80% проектов на Storybook, поэтому типобезопасность — приоритет разработчиков инструмента.
Практический вывод: если проект сидит на Storybook 7 или 8, миграция — это плановая задача, а не переписывание. Команда npx storybook@latest upgrade обновляет пакеты и запускает автоматические codemod'ы; руками обычно остаётся перевести конфиги на ESM и проверить кастомные аддоны.
Как внедрить Storybook в проект: пошаговая инструкция
Внедрение Storybook — это не установка пакета, а смена процесса: компоненты начинают жить в витрине, и команда договаривается её поддерживать. Мы делаем это в восемь шагов:
- Проведите аудит компонентов. Соберите список существующих компонентов, найдите дубли и выберите первые 10–15 самых используемых: кнопки, поля ввода, модальные окна, карточки.
- Установите Storybook. Выполните в корне проекта
npx storybook@latest init: команда определит фреймворк и сборщик, поставит зависимости и создаст папку.storybookс примерами. - Настройте main.ts и preview.ts. В
main.tsукажите, где лежат stories и какие аддоны подключены, вpreview.tsподключите глобальные стили, шрифты, темы и дизайн-токены, чтобы компоненты выглядели как в приложении. - Напишите stories для всех состояний. Для каждого компонента опишите отдельные stories: default, disabled, loading, error, пустые данные и длинный текст — именно на последних двух чаще всего ломается вёрстка.
- Включите документацию. Включите autodocs, чтобы страница документации собиралась из типов и stories, и добавьте MDX-страницы с правилами: когда какой вариант кнопки использовать, а когда нельзя.
- Подключите тесты. Подключите
addon-vitestдля interaction-тестов, аддон a11y для проверки доступности и при необходимости визуальные регрессионные тесты. - Соберите и опубликуйте. Соберите статическую версию командой
storybook buildи публикуйте её в CI на каждый merge request, чтобы дизайнер и менеджер могли проверить интерфейс по ссылке. - Закрепите правило в Definition of Done. Добавьте в Definition of Done правило «нет story — нет компонента»: новый или изменённый компонент принимается в ревью только вместе с актуальными stories.
Минимальный конфиг для React на Vite выглядит так:
// .storybook/main.ts
import type { StorybookConfig } from '@storybook/react-vite';
const config: StorybookConfig = {
stories: ['../src/**/*.stories.@(ts|tsx|mdx)'],
addons: ['@storybook/addon-docs', '@storybook/addon-a11y', '@storybook/addon-vitest'],
framework: '@storybook/react-vite',
};
export default config;
Шаг 8 важнее, чем кажется. Без него витрина за полгода превращается в музей устаревших stories, и команда перестаёт ей доверять. С ним Storybook становится частью обычного цикла разработки, а не отдельным проектом «когда будет время».
Как тестировать компоненты в Storybook
Тестирование в Storybook строится на простой идее: story уже описывает состояние компонента, значит, её можно проверить автоматически. Начиная с девятой версии это делается через Vitest прямо из витрины или из командной строки, без отдельной тестовой инфраструктуры.
Interaction-тесты
Interaction-тест — это story с play-функцией: сценарий, который после рендера кликает, вводит текст и проверяет результат. Аддон @storybook/addon-vitest превращает такие stories в компонентные тесты Vitest, которые выполняются в реальном браузере через Playwright, а не в эмуляции DOM.
import { expect } from 'storybook/test';
export const SubmitsForm: Story = {
play: async ({ canvas, userEvent }) => {
await userEvent.type(canvas.getByLabelText('Email'), 'test@example.ru');
await userEvent.click(canvas.getByRole('button'));
await expect(canvas.getByText('Спасибо!')).toBeVisible();
},
};
Визуальные регрессии
Визуальный тест делает скриншот каждой story и сравнивает его с эталоном: съехавший отступ или поменявшийся цвет видно сразу. Самый распространённый сервис — Chromatic от команды Storybook: облачный, с бесплатным лимитом снимков и оплатой сверх него. Open-source альтернатива — Loki, который снимает скриншоты локально или в CI в Docker-контейнере.
Доступность
Аддон a11y прогоняет каждую story через axe-core и показывает нарушения правил WCAG: недостаточный контраст, поля без подписей, кнопки без доступного имени. В Storybook 9+ эти проверки можно запускать как тесты в CI, а не только смотреть глазами.
Coverage и моки
Отчёт о покрытии показывает, какой код компонентов не задействован ни одной story. Для компонентов, которые ходят в API или читают сессию, в Storybook 10 появился модульный автомокинг: sb.mock(import('../src/api.ts')) в preview.ts подменяет модуль во всех stories, и компонент можно показать без живого бэкенда.
| Вид теста | Что ловит | Инструмент |
| Interaction | сломанное поведение: клики, формы, валидация | play-функция, addon-vitest, Playwright |
| Визуальный | сдвиги вёрстки, цвета, шрифты | Chromatic, Loki |
| Доступность | контраст, подписи, роли, фокус | addon-a11y (axe-core, WCAG) |
| Coverage | непокрытые ветки кода компонентов | Vitest coverage в Storybook |
| Smoke-рендер | компонент падает при рендере | любая story, запущенная через Vitest |
Как публиковать Storybook: CI/CD и хостинг
Публикация Storybook — это сборка витрины в статический сайт и выкладка его по постоянной ссылке. Команда storybook build складывает результат в папку storybook-static, которую можно разместить на любом статическом хостинге: GitLab Pages, GitHub Pages, Netlify, Vercel, S3-совместимом хранилище или в Chromatic.
Типовой пайплайн, который мы настраиваем:
- На каждый merge request — установка зависимостей и
storybook build. - Запуск тестов stories через Vitest: interaction, a11y, при необходимости визуальные.
- Публикация превью-версии витрины и ссылка на неё в merge request — для ревью дизайнером и менеджером.
- После мержа в основную ветку — публикация постоянной версии витрины.
- Если библиотека переиспользуется в нескольких проектах — выпуск npm-пакета компонентов с семантическим версионированием.
# .gitlab-ci.yml (фрагмент)
storybook:
stage: build
image: node:22
script:
- npm ci
- npm run build-storybook
artifacts:
paths: [storybook-static]
pages:
stage: deploy
script:
- mv storybook-static public
artifacts:
paths: [public]
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
Для монорепозитория с несколькими продуктами удобна схема, где библиотека компонентов — отдельный пакет со своим Storybook, а приложения подключают её как зависимость. Тогда изменения в компонентах проходят ревью один раз, а продукты обновляются на новую версию осознанно, по semver.
Альтернативы Storybook: Ladle, Histoire, Styleguidist
Альтернативы Storybook — более лёгкие инструменты с той же идеей витрины компонентов, но с меньшей экосистемой. Они имеют смысл, когда Storybook кажется избыточным, а нужна только быстрая витрина.
| Инструмент | Фреймворки | Сильная сторона | Ограничение | Когда выбирать |
| Storybook | React, Vue, Angular, Svelte и др. | крупнейшая экосистема аддонов, встроенные тесты, документация | тяжелее альтернатив, требует поддержки конфигурации | продукт на годы, несколько разработчиков, дизайн-система |
| Ladle | React | лёгкий и быстрый, работает на Vite, совместим с форматом CSF | только React, мало аддонов | небольшой React-проект, где нужна только витрина |
| Histoire | Vue 3, Svelte | нативен для экосистемы Vite и Vue | меньше сообщество и интеграций | Vue- или Svelte-проект без потребности в тестах из витрины |
| React Styleguidist | React | документация, собранная из кода и Markdown | развивается медленнее, нет современного тестового стека | поддержка старого проекта, где он уже стоит |
| Docz | React | документация на MDX | проект фактически заброшен | для новых проектов не рекомендуем |
Благодаря совместимости с CSF миграция между Ladle и Storybook сравнительно безболезненна: stories переносятся почти без правок. Поэтому стартовать с лёгкого инструмента и перейти на Storybook при росте команды — рабочая стратегия.
Минусы и сложности Storybook и как их обойти
Минусы Storybook связаны не столько с самим инструментом, сколько с дисциплиной: витрина приносит пользу, только пока её поддерживают. Типичные проблемы и решения:
- Накладные расходы на stories. Каждое изменение компонента требует обновить stories. Решение — писать stories одновременно с компонентом и оценивать их в задаче, а не «потом».
- Тяжёлая сборка в больших монорепо. Сотни stories собираются заметно дольше. Решение — Vite-builder, сборка Storybook только для изменённых пакетов и кэш в CI.
- Конфликты конфигов при апгрейдах. Переход на ESM-only в v10 ломает старые CommonJS-конфиги и самописные аддоны. Решение — обновляться регулярно через
npx storybook@latest upgrade, а не прыгать через несколько мажорных версий. - Устаревшие stories. Компонент поменялся, story осталась старой. Решение — запуск stories как тестов в CI: сломанная story роняет пайплайн.
- Сопротивление команды. «Ещё один инструмент, ещё одна обязанность». Решение — правило в Definition of Done и показ пользы на первых 10–15 компонентах.
- Нет владельца. Если библиотека общая, но ничья, она деградирует. Решение — назначить ответственного за библиотеку компонентов и ревью изменений в ней.
Когда Storybook окупается и сколько стоит внедрение
Storybook окупается там, где интерфейс большой и долгоживущий: время, сэкономленное на дублях, регрессиях и онбординге, превышает время на поддержку stories. Для маленьких и одноразовых проектов он избыточен.
| Ситуация | Нужен ли Storybook |
| Лендинг на 5 экранов, промо-сайт на один сезон | рано: компонентов мало, переиспользования почти нет |
| MVP с одним фронтендером и сроком в пару месяцев | можно позже: заложите компонентную структуру, витрину добавите после запуска |
| SaaS, личный кабинет, админка с десятками экранов | нужен: много повторяющихся компонентов и состояний |
| Несколько продуктов на одной дизайн-системе | нужен обязательно: библиотека как npm-пакет плюс витрина |
| Команда из 2+ фронтендеров или регулярный онбординг новых людей | нужен: витрина заменяет устные объяснения |
Сам Storybook бесплатен: лицензия MIT, без ограничений по числу пользователей. Платите вы только за часы команды и, при желании, за сторонние сервисы вроде Chromatic. По нашему опыту, стартовый набор из 15–20 компонентов со stories, документацией и сборкой в CI — это ориентировочно 1–2 недели работы одного фронтендера. Точный срок зависит от состояния кода: если компоненты завязаны на глобальное состояние и запросы к API, часть времени уйдёт на их развязку, и это само по себе полезный рефакторинг.
Если библиотеку компонентов нужно построить вместе с продуктом с нуля, её проще заложить в архитектуру сразу — так мы делаем в проектах по разработке веб-приложений: витрина появляется на первом спринте и растёт вместе с интерфейсом.
Найдем лучшее решение для вас
Частые вопросы о Storybook
Storybook бесплатный?
Да. Storybook — open-source проект под лицензией MIT, его можно использовать в коммерческих проектах без оплаты и без ограничений по числу разработчиков. Платными бывают только сторонние сервисы вокруг него, например облачный Chromatic для визуальных тестов и хостинга при выходе за бесплатный лимит.
Можно ли подключить Storybook к существующему проекту?
Да, это основной сценарий. Команда npx storybook@latest init ставит Storybook в уже работающее приложение и не меняет его код. Дальше stories добавляют постепенно: начинают с 10–15 самых используемых компонентов и покрывают остальные по мере доработок.
Работает ли Storybook с Vue, Angular, React Native?
Да. Кроме React Storybook поддерживает Vue 3, Angular, Svelte, Web Components, Preact, Ember, Qwik, SolidJS, чистый HTML и React Native. Для веба основной сборщик — Vite, также поддерживается Webpack.
Чем story отличается от unit-теста?
Story описывает одно состояние компонента и служит одновременно примером и документацией: её видно глазами. Unit-тест проверяет логику и ничего не показывает. Если добавить в story play-функцию и подключить addon-vitest, story становится компонентным тестом, который запускается в реальном браузере через Playwright.
Нужен ли Storybook, если есть дизайн-система в Figma?
Да, это разные слои. Figma хранит макеты и правила для дизайнеров, а Storybook показывает реальный код компонентов, который попадёт в продукт. Без Storybook макет и код со временем расходятся. Связать их можно аддоном Designs, который показывает макет из Figma рядом со story.
Какие требования у Storybook 10?
Storybook 10 распространяется только как ESM-пакеты и требует Node.js версии 20.16 и выше, 22.19 и выше или 24 и выше. Старые конфигурации в формате CommonJS нужно перевести на ESM; большую часть изменений делает автоматическая миграция npx storybook@latest upgrade.
Соберём библиотеку компонентов для вашего продукта
Настроим Storybook, перенесём ключевые компоненты, подключим тесты и публикацию в CI — фронтенд будет развиваться быстрее и без визуальных регрессий.


