Storybook
Storybook — это инструмент с открытым исходным кодом для разработки и тестирования пользовательских интерфейсов (UI) методом изолированных компонентов. Он позволяет создавать, просматривать и документировать отдельные элементы интерфейса (кнопки, формы, модальные окна, целые страницы) независимо от основного приложения, что ускоряет разработку, упрощает регрессионное тестирование и улучшает взаимодействие в команде. Storybook поддерживает большинство современных фронтенд-фреймворков, включая React, Vue, Angular, Svelte и другие.
История
Storybook был создан в 2016 году разработчиками из компании Kadira (позже переименованной в Chromatic) — Ником Болтоном, Томом Коулманом и Норвигом Гарднером. Первоначально проект назывался React Storybook и предназначался исключительно для React. Идея возникла из потребности в инструменте, который позволял бы разрабатывать компоненты в изоляции, без необходимости запуска всего приложения и настройки сложных состояний.
В 2017 году проект был переименован в Storybook и расширил поддержку на другие фреймворки. В 2018 году вышла версия 4.0, которая представила новую архитектуру на основе плагинов и улучшенную поддержку TypeScript. Версия 5.0 (2019) добавила поддержку документации в формате MDX (Markdown + JSX). Версия 6.0 (2020) ввела концепцию «нулевой конфигурации» (zero-config) и улучшенную интеграцию с инструментами сборки, такими как Webpack 5 и Vite. Версия 7.0 (2022) добавила поддержку Vite по умолчанию, улучшенную производительность и новый интерфейс.
Архитектура и принцип работы
Storybook работает как отдельное приложение, которое запускается параллельно с основным проектом. Он использует собственную систему сборки на основе Webpack, Vite или другого бандлера, чтобы изолировать компоненты и отображать их в браузере.
Основные концепции
- Story (история) — это функция, которая возвращает состояние компонента с определёнными пропсами и контекстом. Каждая история представляет собой один вариант отображения компонента (например, «Кнопка с текстом», «Кнопка в состоянии загрузки», «Кнопка с иконкой»). Истории пишутся на JavaScript или TypeScript в файлах с расширением
.stories.js,.stories.tsили.stories.mdx. - Component Story Format (CSF) — стандартный формат для написания историй, принятый с версии 5.2. CSF использует экспорт по умолчанию для метаданных компонента и именованные экспорты для отдельных историй.
- Addon (дополнение) — плагин, расширяющий функциональность Storybook. Существуют аддоны для отображения документации, тестирования доступности, изменения темы, просмотра пропсов в реальном времени, записи снэпшотов и интеграции с инструментами тестирования (Jest, Cypress, Playwright).
- Decorator (декоратор) — функция, оборачивающая историю в дополнительный контекст, например, для предоставления темы, маршрутизатора или Redux-стейта.
Жизненный цикл
- Разработчик создаёт файл
.stories.jsрядом с компонентом. - Storybook сканирует проект на наличие таких файлов (по умолчанию в папке
srcилиstories). - Для каждой истории Storybook собирает изолированное окружение, включая CSS, шрифты и контекст, и отображает компонент в своём интерфейсе.
- Разработчик может просматривать, переключать состояния, изменять пропсы через панель управления (Controls) и тестировать компонент в реальном времени.
Возможности и функциональность
Разработка в изоляции
Storybook позволяет разрабатывать компоненты без необходимости запускать всё приложение. Это особенно полезно для сложных состояний (ошибки, пустые списки, загрузка), которые трудно воспроизвести в реальном приложении.
Документация
Storybook автоматически генерирует документацию для каждого компонента на основе его пропсов (типов, значений по умолчанию) и написанных историй. Формат MDX позволяет вставлять пояснительный текст, примеры кода и ссылки. Документация может быть опубликована как статический сайт.
Тестирование
- Визуальное регрессионное тестирование: с помощью аддона Chromatic (разработанного той же командой) или интеграции с Percy, Applitools. Каждая история сравнивается с эталонным снимком экрана, и изменения подсвечиваются.
- Модульное тестирование: истории можно использовать как тестовые случаи для Jest или Vitest, проверяя, что компонент рендерится без ошибок и соответствует ожидаемой структуре.
- Интерактивное тестирование: с помощью аддона Interaction Testing (на основе Testing Library) можно имитировать действия пользователя (клики, ввод текста) и проверять результаты.
- Тестирование доступности: аддон a11y проверяет компоненты на соответствие стандартам WCAG (Web Content Accessibility Guidelines).
Интеграция с инструментами
Storybook интегрируется с популярными инструментами экосистемы фронтенда:
- Сборщики: Webpack, Vite, esbuild.
- Фреймворки: React, Vue, Angular, Svelte, Next.js, Nuxt.js, Gatsby.
- Тестирование: Jest, Cypress, Playwright, Testing Library.
- Дизайн-системы: Figma (через плагин), Zeplin.
- CI/CD: GitHub Actions, GitLab CI, Jenkins.
Применение
Storybook широко используется в разработке дизайн-систем и библиотек компонентов. Крупные компании, такие как Airbnb, Uber, Shopify, BBC, Adobe и Microsoft, применяют Storybook для создания и поддержки своих UI-библиотек. В России Storybook используется в проектах Яндекса, Сбербанка, Тинькофф и других крупных технологических компаний.
Примеры использования
- Дизайн-система Material-UI: использует Storybook для демонстрации своих компонентов.
- React Aria от Adobe: документация и тестирование доступности.
- Chakra UI: все компоненты имеют соответствующие истории в Storybook.
Критика и ограничения
Несмотря на популярность, Storybook имеет ряд недостатков:
- Сложность настройки: хотя последние версии стремятся к «нулевой конфигурации», для сложных проектов (с кастомными сборщиками, нестандартными CSS-решениями) настройка может потребовать значительных усилий.
- Производительность: при большом количестве историй (сотни и тысячи) время сборки и запуска может быть высоким, особенно на медленных машинах.
- Зависимость от экосистемы: Storybook привязан к конкретным версиям бандлеров и фреймворков, что может вызывать конфликты при обновлении.
- Избыточность для малых проектов: для простых приложений с несколькими компонентами использование Storybook может быть излишним, так как требует дополнительного времени на настройку и поддержку.
Альтернативы
- Ladle — лёгкая альтернатива для React, ориентированная на скорость и простоту.
- Histoire — инструмент для Vue и Vite, похожий по концепции, но с фокусом на производительность.
- Framer — платформа для дизайна и прототипирования, которая также позволяет создавать интерактивные компоненты.
- Backlight — облачная платформа для разработки дизайн-систем с поддержкой Storybook.
Источники
- Официальная документация Storybook (storybook.js.org)
- Репозиторий проекта на GitHub (github.com/storybookjs/storybook)
- Статья «Introducing Storybook 7.0» в блоге Chromatic
- Документация Component Story Format (CSF)
- Статья «Storybook: A Complete Guide» на сайте LogRocket
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →