В SvelteKit компоненты являются ключевым строительным блоком
приложения. Каждый компонент — это отдельный файл с расширением
.svelte, который может содержать разметку HTML,
стили CSS и скрипты JavaScript/TypeScript. Структура
компонентов строится вокруг трёх основных секций:
Скриптовая секция <script>
Здесь объявляются переменные, функции, импорты других компонентов и
библиотек. Переменные, экспортируемые с помощью export let,
становятся свойствами (props) компонента:
<script>
export let title = 'Заголовок';
let counter = 0;
function increment() {
counter += 1;
}
</script>Секция разметки HTML Отвечает за визуальное
представление компонента. Разметка может содержать динамические
выражения, связывание данных (bind:), события
(on:) и условные блоки ({#if ...}):
<h1>{title}</h1>
<button on:click={increment}>
Нажато {counter} раз
</button>
{#if counter > 5}
<p>Вы превысили пять нажатий!</p>
{/if}Секция стилей <style>
Встроенные стили применяются только к текущему компоненту. Использование
:global() позволяет создавать глобальные правила:
<style>
h1 {
color: #2c3e50;
}
:global(body) {
margin: 0;
font-family: sans-serif;
}
</style>SvelteKit поощряет композицию компонентов, когда один компонент импортирует и использует другие. Это позволяет создавать модульную архитектуру:
<script>
import Button from './Button.svelte';
</script>
<div class="card">
<h2>Карточка</h2>
<Button label="Нажми меня"/>
</div>
Ключевые аспекты:
export let.createEventDispatcher.{#each} и условных блоков {#if}.Одним из сильных инструментов SvelteKit является реактивность
переменных. Реактивные выражения объявляются с помощью
$::
<script>
let a = 2;
let b = 3;
$: sum = a + b; // sum автоматически обновляется при изменении a или b
</script>
<p>Сумма: {sum}</p>
Также возможно двустороннее связывание с элементами формы:
<script>
let name = '';
</script>
<input bind:value={name} placeholder="Введите имя"/>
<p>Привет, {name}!</p>
Для глобального состояния SvelteKit использует store. Основные типы:
Writable store – изменяемое состояние:
import { writable } from 'svelte/store';
export const counter = writable(0);Readable store – только для чтения, часто используется для данных из API.
Derived store – вычисляемое состояние на основе других сторов.
Подключение к компоненту происходит через
$storeName:
<script>
import { counter } from './stores.js';
</script>
<button on:click={() => counter.update(n => n + 1)}>
Нажато {$counter} раз
</button>
Слоты позволяют компонентам быть контейнерами для произвольного контента:
<!-- Modal.svelte -->
<div class="modal">
<slot></slot>
</div>
<!-- App.svelte -->
<Modal>
<h2>Заголовок модального окна</h2>
<p>Содержимое внутри модалки</p>
</Modal>
<slot name="header">.В SvelteKit часто придерживаются следующей схемы каталогов:
src/
├─ lib/
│ ├─ components/
│ │ ├─ Button.svelte
│ │ ├─ Card.svelte
│ │ └─ Modal.svelte
│ ├─ stores/
│ │ └─ counter.js
│ └─ utils/
├─ routes/
│ └─ index.svelte
Для передачи событий из дочернего компонента вверх используется
createEventDispatcher:
<script>
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
function notify() {
dispatch('message', { text: 'Привет из компонента!' });
}
</script>
<button on:click={notify}>Отправить сообщение</button>
На родительском компоненте:
<ChildComponent on:message={(e) => console.log(e.detail.text)} />
SvelteKit полностью поддерживает TypeScript в компонентах:
<script lang="ts">
export let count: number;
function increment(): void {
count += 1;
}
</script>
Популярные UI-библиотеки (например, Svelte Material UI, Flowbite Svelte, Skeleton) предоставляют готовые компоненты, которые легко интегрируются с архитектурой компонентов:
.svelte файлы.Пример использования компонента Button из Svelte Material UI:
<script>
import Button from 'svelte-material-ui/Button';
</script>
<Button raised on:click={() => alert('Нажато!')}>
Кнопка Material
</Button>
lib/components, routes)
обеспечивает модульность и переиспользуемость.$: и двустороннее связывание упрощают
управление состоянием локально.Эта структура формирует основу для надежных, легко поддерживаемых и расширяемых приложений на SvelteKit.