Storybook предоставляет мощную среду для разработки UI-компонентов, позволяя работать с ними изолированно от основного приложения. В SvelteKit интеграция Storybook осуществляется через официальные пакеты и настройки, адаптированные под Svelte.
Для начала необходимо установить зависимости:
npm install --save-dev @storybook/svelte @storybook/addon-essentials @storybook/addon-actions @storybook/addon-links
После установки создается конфигурация Storybook с помощью команды:
npx sb init
В main.js конфигурации указываются поддерживаемые
фреймворки и пути к компонентам:
module.exports = {
framework: '@storybook/svelte',
stories: ['../src/lib/**/*.stories.@(js|ts|svelte)'],
addons: [
'@storybook/addon-essentials',
'@storybook/addon-links',
'@storybook/addon-actions'
],
};
Ключевой момент: для SvelteKit необходимо добавить поддержку Vite, чтобы Storybook корректно обрабатывал Svelte-файлы:
const { mergeConfig } = require('vite');
const svelteConfig = require('../svelte.config');
module.exports = {
async viteFinal(config) {
return mergeConfig(config, {
...svelteConfig,
});
},
};
Файлы сториз в Svelte создаются рядом с компонентами и имеют
расширение .stories.svelte или
.stories.js/.ts. Основной принцип — описывать каждый
компонент с несколькими состояниями (args).
Пример компонента Button:
<script>
export let label = 'Кнопка';
export let disabled = false;
</script>
<button disabled={disabled}>{label}</button>
Файл Button.stories.js:
import Button from './Button.svelte';
export default {
title: 'UI/Button',
component: Button,
argTypes: {
label: { control: 'text' },
disabled: { control: 'boolean' },
},
};
const Template = (args) => ({
Component: Button,
props: args,
});
export const Default = Template.bind({});
Default.args = {
label: 'Нажми меня',
disabled: false,
};
export const Disabled = Template.bind({});
Disabled.args = {
label: 'Недоступно',
disabled: true,
};
Важно: использование argTypes позволяет
автоматически создавать контролы в панели Storybook и изменять пропсы в
реальном времени.
Storybook поддерживает расширения для улучшения разработки компонентов. Основные:
on:click в Svelte.Пример применения addon-actions:
<script>
import { action } from '@storybook/addon-actions';
export let label = 'Кнопка';
</script>
<button on:click={action('clicked')}>{label}</button>
Storybook позволяет создавать документацию в формате MDX, интегрированную с самими сториз. Это упрощает демонстрацию API компонентов и визуальных примеров.
Пример Button.stories.mdx:
import { Meta, Story, Canvas, ArgsTable } from '@storybook/addon-docs';
import Button from './Button.svelte';
<Meta title="UI/Button" component={Button} />
# Кнопка
<Canvas>
<Story name="Default" args={{ label: 'Нажми меня' }} />
<Story name="Disabled" args={{ label: 'Недоступно', disabled: true }} />
</Canvas>
<ArgsTable story="Default" />
args и
argTypes — позволяет легко тестировать различные
состояния UI.@storybook/testing-library для написания
визуальных тестов.При использовании сторонних UI-библиотек, таких как
Svelte Material UI или Flowbite Svelte,
Storybook позволяет:
addon-actions.Пример интеграции с Svelte Material UI:
import Button from 'svelte-material-ui/Button';
export default {
title: 'Material/Button',
component: Button,
};
export const Raised = {
args: { raised: true, label: 'Поднятая кнопка' },
};
Storybook в SvelteKit превращается в полноценный инструмент для визуального тестирования и разработки UI, предоставляя мощные возможности для изоляции компонентов, документирования их API и проверки поведения в различных состояниях. Такой подход особенно полезен при работе с большими UI-библиотеками, где визуальное качество и консистентность компонентов критичны.