Storybook — это популярный инструмент для разработки UI-компонентов в изоляции. Его основная цель — предоставить разработчику возможность сосредоточиться на создании компонентов без необходимости интеграции с основной логикой приложения. Это также отличная среда для демонстрации и тестирования компонентов. Использование Storybook вместе с Stencil позволяет эффективно разрабатывать, тестировать и документировать компоненты веб-приложений, созданных с использованием Stencil.
Stencil сам по себе является фреймворком для создания веб-компонентов, которые можно использовать в любом приложении. Storybook идеально подходит для визуального тестирования этих компонентов, их документирования и демонстрации. Интеграция этих двух инструментов позволяет улучшить процесс разработки, делая его более гибким и удобным.
Для начала работы потребуется два основных компонента: сам Storybook и библиотека Stencil. Если проект еще не настроен, нужно выполнить несколько шагов:
Установка Stencil: Stencil можно установить с помощью npm или yarn. В корне проекта выполняется следующая команда:
npm init stencil
Это создаст новый проект, настроенный для разработки веб-компонентов.
Установка Storybook: Для интеграции с Stencil Storybook следует установить как dev-зависимость:
npx sb init
Эта команда инициализирует Storybook в проекте и создает нужные конфигурации для работы.
После установки Storybook важно настроить его для правильной работы с компонентами, созданными с помощью Stencil. Это делается через настройку конфигурации Storybook.
Установка необходимых зависимостей: Для того чтобы Storybook мог корректно отображать компоненты Stencil, необходимо установить дополнительные зависимости:
npm install --save-dev @storybook/web-components @storybook/addon-docs
Это добавит необходимые плагины и настроит Storybook для работы с веб-компонентами, включая те, которые созданы с помощью Stencil.
Обновление конфигурации Storybook: В файле
.storybook/main.js нужно указать, что Storybook будет
использовать веб-компоненты для рендеринга. Пример конфигурации:
module.exports = {
stories: ['../src/components/**/*.stories.tsx'],
addons: ['@storybook/addon-docs'],
framework: '@storybook/web-components',
};
В этой конфигурации мы указываем путь к файлам с историями
(stories), а также включаем аддон для документации, который
будет генерировать подробные описания компонентов.
Создание истории (stories) для компонентов: Для
каждого компонента необходимо создать файл с расширением
.stories.tsx, в котором будут описаны различные состояния
компонента. Пример истории для простого компонента
my-button:
import { html } from 'lit-html';
import { MyButton } from './my-button';
export default {
title: 'UI/MyButton',
component: 'my-button',
};
const Template = (args) => html`<my-button .label=${args.label}></my-button>`;
export const Default = Template.bind({});
Default.args = {
label: 'Click me!',
};
В этом примере мы создаем шаблон для компонента
my-button, который принимает пропс label. Мы
также указываем, что компонент должен отображаться с данным значением по
умолчанию.
Storybook предлагает встроенные инструменты для документирования
компонентов, и Stencil поддерживает их благодаря аддону
addon-docs. Для того чтобы компоненты автоматически
отображались с документацией, достаточно добавить JSDoc комментарии к
каждому элементу.
Пример использования JSDoc для компонента Stencil:
import { Component, Prop, h } from '@stencil/core';
/**
* Кнопка, которая отображает переданный текст
*/
@Component({
tag: 'my-button',
styleUrl: 'my-button.css',
shadow: true,
})
export class MyButton {
/**
* Текст, который будет отображаться на кнопке
*/
@Prop() label: string;
render() {
return <button>{this.label}</button>;
}
}
С помощью JSDoc Storybook автоматически сгенерирует описание пропсов и их типов, что улучшает документацию и позволяет другим разработчикам легче понять, как использовать компоненты.
Несмотря на гибкость и простоту интеграции, могут возникнуть некоторые проблемы при работе с Stencil и Storybook.
Отсутствие стилей: Иногда компоненты, созданные
с помощью Stencil, не отображаются с нужными стилями в Storybook. Это
может происходить из-за того, что Storybook не всегда корректно
обрабатывает стили, добавленные в Shadow DOM. Чтобы решить эту проблему,
можно использовать глобальные стили в файле preview.js:
import '../src/global/styles.css';
Это подключит глобальные стили, которые будут применяться ко всем компонентам внутри Storybook.
Ошибки при загрузке компонентов: В случае, если компоненты не загружаются или не рендерятся, можно попробовать изменить конфигурацию Storybook или пересобрать проект. Важно следить за тем, чтобы компоненты экспортировались правильно и имели корректные типы.
Поддержка TypeScript: Stencil использует TypeScript, а Storybook — JavaScript, что может вызывать проблемы с типами. Для решения этих проблем важно настроить Storybook на использование TypeScript, добавив в конфигурацию соответствующие настройки:
module.exports = {
typescript: {
reactDocgen: 'react-docgen',
},
};Storybook также поддерживает тестирование компонентов с помощью
различных аддонов, таких как @storybook/addon-actions,
который позволяет отслеживать взаимодействие с компонентами, или
@storybook/addon-essentials, который добавляет набор
полезных инструментов для тестирования и анализа.
Для Stencil компонентов можно также интегрировать Storybook с тестовыми фреймворками, такими как Jest, чтобы проверять логику компонентов и их взаимодействие с пользователем. Таким образом, можно автоматизировать тестирование UI компонентов в реальном времени.
Интеграция Stencil с Storybook позволяет создать мощную систему для разработки, тестирования и документирования веб-компонентов. Это решение повышает эффективность разработки, улучшает качество компонентов и облегчает работу с ними. Storybook предоставляет визуальный интерфейс для проверки и демонстрации компонентов, а Stencil обеспечивает создание современных и высокопроизводительных веб-компонентов.