Svelte представляет собой компилируемый фронтенд-фреймворк, в котором значительная часть работы переносится на этап сборки. В отличие от классических библиотек, использующих виртуальный DOM, подход основан на компиляции компонентов в оптимизированный JavaScript-код, минимизирующий накладные расходы во время выполнения.
Ключевая особенность заключается в том, что компонент преобразуется в императивные инструкции обновления DOM. Это исключает необходимость дифф-алгоритма виртуального DOM.
Процесс компиляции включает:
.svelte файлов;Результатом становится код, который напрямую управляет DOM-узлами, обновляя только изменённые части интерфейса.
Компонент в Svelte состоит из трёх основных секций:
<script> — логика и состояние<style> — локальные стилиПример базового компонента:
<script>
let count = 0;
function increment() {
count += 1;
}
</script>
<button on:click={increment}>
Счётчик: {count}
</button>
<style>
button {
padding: 8px 12px;
border-radius: 6px;
}
</style>
Переменная count автоматически связана с интерфейсом без
необходимости ручного вызова функций обновления.
Реактивная модель основана на присваиваниях. Любое изменение значения переменной автоматически инициирует обновление DOM.
Реактивные декларации задаются через метку $::
<script>
let a = 2;
let b = 3;
$: sum = a + b;
</script>
<p>{sum}</p>
Зависимости вычисляются статически на этапе компиляции, что позволяет точно определять, какие части интерфейса требуют обновления.
Реактивные блоки позволяют выполнять код при изменении зависимостей:
<script>
let count = 0;
$: {
if (count > 10) {
console.log("Порог превышен");
}
}
</script>
Блоки компилируются в условные обновления, привязанные к конкретным переменным.
Механизм двусторонней привязки обеспечивает синхронизацию состояния и DOM-элементов.
<script>
let text = "";
</script>
<input bind:value={text} />
<p>{text}</p>
Поддерживаются различные типы привязок:
bind:valuebind:checkedbind:groupbind:thisКомпоненты представляют собой изолированные единицы с локальным состоянием и стилями.
Передача данных осуществляется через props:
<!-- Child.svelte -->
<script>
export let name;
</script>
<h1>{name}</h1>
<!-- Parent.svelte -->
<script>
import Child from './Child.svelte';
</script>
<Child name="Interface" />
Изоляция стилей реализуется автоматически через добавление уникальных атрибутов к DOM-элементам.
Обработка событий использует директивы вида
on:event.
<script>
function handleClick() {
alert("Нажатие");
}
</script>
<button on:click={handleClick}>
Кнопка
</button>
Поддерживается модификация поведения событий:
on:click|preventDefaulton:submit|stopPropagationДля управления состоянием вне компонентов используется система stores.
Базовый writable store:
import { writable } from 'svelte/store';
export const counter = writable(0);
Использование внутри компонента:
<script>
import { counter } from './store.js';
</script>
<button on:click={() => counter.update(n => n + 1)}>
{$counter}
</button>
Подписка на store осуществляется автоматически при использовании
префикса $.
Производные состояния вычисляются на основе других store:
import { derived } from 'svelte/store';
import { counter } from './store.js';
export const doubled = derived(counter, $counter => $counter * 2);
Поддерживаются стандартные хуки жизненного цикла:
onMountbeforeUpdateafterUpdateonDestroyПример:
<script>
import { onMount } from 'svelte';
onMount(() => {
console.log("Компонент инициализирован");
});
</script>
Механизм контекста позволяет передавать данные без явного прокидывания через props.
<script>
import { setContext } from 'svelte';
setContext('theme', 'dark');
</script>
<script>
import { getContext } from 'svelte';
const theme = getContext('theme');
</script>
Встроенная система переходов обеспечивает декларативные анимации появления и исчезновения элементов.
<script>
import { fade } from 'svelte/transition';
let visible = true;
</script>
{#if visible}
<div transition:fade>
Контент
</div>
{/if}
Поддерживаются:
fadeslideflyСтили внутри компонента ограничены областью видимости.
<style>
h1 {
color: red;
}
</style>
Компилятор преобразует селекторы в уникальные комбинации атрибутов, исключая конфликты стилей.
Фреймворк поддерживает серверный рендеринг с последующей гидратацией на клиенте. Это позволяет:
Гидратация связывает уже отрендеренный HTML с интерактивной логикой компонентов.
SvelteKit расширяет базовую модель, добавляя:
Структура проекта в SvelteKit обычно включает:
routes/ — страницы и маршрутыlib/ — переиспользуемые модулиhooks — серверные и клиентские хукиОптимизация достигается за счёт:
Компилятор удаляет неиспользуемый код, сокращая размер бандла и ускоряя выполнение.
Поддержка TypeScript реализуется на уровне препроцессора.
<script lang="ts">
let count: number = 0;
</script>
Типизация улучшает предсказуемость компонентов и снижает количество ошибок при масштабировании приложения.