Компонентная библиотека в SvelteKit строится вокруг повторно используемых UI-компонентов, которые инкапсулируют логику и стили. Архитектура таких библиотек обычно включает следующие уровни: базовые компоненты, композиционные компоненты, тема и стили, утилиты и хелперы.
Базовые компоненты — это строительные блоки интерфейса: кнопки, инпуты, чекбоксы, модальные окна, тултипы. Они должны быть максимально универсальными и независимыми от контекста приложения.
Ключевые принципы разработки базовых компонентов:
<Button size="large" variant="primary" disabled={true} />.createEventDispatcher
для взаимодействия с родительским кодом.Пример базового компонента кнопки в SvelteKit:
<script lang="ts">
import { createEventDispatcher } from 'svelte';
export let size: 'small' | 'medium' | 'large' = 'medium';
export let variant: 'primary' | 'secondary' = 'primary';
export let disabled: boolean = false;
const dispatch = createEventDispatcher();
function handleClick(event: MouseEvent) {
if (!disabled) dispatch('click', event);
}
</script>
<button class={`btn ${size} ${variant}`} on:click={handleClick} disabled={disabled}>
<slot />
</button>
<style>
.btn { padding: 0.5rem 1rem; border-radius: 4px; }
.small { font-size: 0.8rem; }
.medium { font-size: 1rem; }
.large { font-size: 1.2rem; }
.primary { background-color: #0070f3; color: white; }
.secondary { background-color: #eaeaea; color: #333; }
button:disabled { opacity: 0.5; cursor: not-allowed; }
</style>
Комплексные интерфейсные элементы строятся на основе базовых компонентов. Например, формы, карточки, таблицы данных состоят из комбинации кнопок, инпутов, чекбоксов и тултипов.
Особенности композиционных компонентов:
<slot> позволяет вставлять произвольный контент,
делая компонент гибким.Пример карточки с кнопкой и текстом:
<Card>
<h3 slot="header">Заголовок карточки</h3>
<p slot="body">Описание элемента</p>
<Button slot="footer" variant="primary">Действие</Button>
</Card>
Компонентные библиотеки в SvelteKit используют систему темизации, которая позволяет задавать глобальные цвета, типографику и отступы.
--color-primary, --spacing-base).Пример переменных темы:
:root {
--color-primary: #0070f3;
--color-secondary: #eaeaea;
--font-size-base: 16px;
--spacing-base: 1rem;
}
Для упрощения разработки и единообразного поведения компонентов используются вспомогательные функции:
clsx,
classnames) для динамического формирования классов.Пример использования стор для управления модальным окном:
import { writable } from 'svelte/store';
export const isModalOpen = writable(false);
// В компоненте
<script lang="ts">
import { isModalOpen } from './stores';
</script>
<button on:click={() => isModalOpen.set(true)}>Открыть модалку</button>
<Modal bind:open={$isModalOpen}>Контент модалки</Modal>
Для больших библиотек структура играет ключевую роль. Рекомендуется делить на модули:
src/
components/
base/
Button.svelte
Input.svelte
composite/
Card.svelte
Form.svelte
styles/
theme.css
variables.css
utils/
formatters.ts
classnames.ts
stores/
themeStore.ts
modalStore.ts
Такое разделение упрощает поддержку, повторное использование и масштабирование библиотеки.
Компонентные библиотеки должны быть совместимыми с маршрутизацией, серверным рендерингом и адаптивной загрузкой компонентов SvelteKit:
index.ts для удобного
импорта:export { default as Button } from './base/Button.svelte';
export { default as Card } from './composite/Card.svelte';
Архитектура SvelteKit UI библиотек строится на модульности, повторном использовании, управляемости темой и интеграции со стором, что делает разработку крупных интерфейсов гибкой и устойчивой.