Перейти к содержимому

Svelte: Обзор

Svelte — компилятор, который меняет правила игры 🧡

Заголовок раздела «Svelte — компилятор, который меняет правила игры 🧡»

Привет! Я Яша, и сегодня мы начинаем один из самых захватывающих курсов — Svelte. Если ты раньше работал с React или Vue, приготовься к тому, что твой мозг немного взорвётся. В хорошем смысле 🤯

Svelte — это не просто ещё один фреймворк. Это компилятор, который меняет сами правила игры. Пока React и Vue работают в браузере и создают виртуальный DOM, Svelte делает всю работу на этапе сборки и генерирует чистый, быстрый ванильный JavaScript. Никаких накладных расходов в рантайме!


Svelte — это инструмент для создания интерактивных пользовательских интерфейсов. Но в отличие от React и Vue, Svelte — это компилятор, а не runtime библиотека.

Традиционные фреймворки работают так:

  1. Браузер загружает твой код + код фреймворка (~45kb для React)
  2. Фреймворк запускается в браузере
  3. При изменении данных обновляется виртуальный DOM
  4. Виртуальный DOM сравнивается с реальным (diffing)
  5. Реальный DOM обновляется

Svelte работает иначе:

  1. Ты пишешь .svelte файлы
  2. Компилятор Svelte анализирует код во время сборки
  3. Генерируется ванильный JavaScript (без рантайма фреймворка!)
  4. В браузере работает только твой код + ~1.7kb адаптера
  5. При изменении данных обновляются точно нужные DOM-узлы

Результат? Молниеносная производительность и крошечный размер бандла 🚀


Rich Harris (создатель Svelte) сформулировал ключевую идею так:

«Фреймворки — это не инструменты для организации кода, а инструменты для организации ума»

Но он пошёл дальше и спросил: а зачем вообще платить за фреймворк в рантайме?

Представь разницу между:

  • Переводчик-синхронист — переводит на ходу, требует постоянного присутствия (это React/Vue)
  • Переводчик-редактор — переводит текст заранее, результат работает без него (это Svelte)

Svelte читает твой декларативный код и генерирует императивные DOM-обновления — точечные, эффективные, без посредников.

<!-- Это ты пишешь (декларативно) -->
<script>
let count = $state(0);
</script>
<button onclick={() => count++}>
Нажато {count} раз
</button>
// Это что компилятор генерирует (императивно)
let count = 0;
button.addEventListener('click', () => {
count++;
button_text.data = `Нажато ${count} раз`;
});

Чисто, эффективно, без виртуального DOM!


2016 → Svelte v1 («Магически исчезающий фреймворк»)
Rich Harris создал его, работая в The Guardian
Первая идея: компилятор вместо рантайма
2018 → Svelte v2
Улучшенный синтаксис, лучший компилятор
Всё ещё мало известен
2019 → Svelte v3 ⭐ (Большой перезапуск)
Революционный синтаксис с реактивностью
$: reactive declarations
Доклад «Rethinking Reactivity» — >1М просмотров
Svelte взлетел в популярности!
2021 → SvelteKit (beta)
Полностековый фреймворк на основе Svelte
Аналог Next.js для React
2022 → SvelteKit 1.0
Стабильный релиз, production-ready
2023 → Svelte 4
Улучшения DX, легче и быстрее
2024 → Svelte 5 🚀 (Runes революция)
Полностью новая система реактивности
$state, $derived, $effect, $props
Лучшая TypeScript поддержка
Обратная совместимость с v4

Svelte 5 представил Runes — новую систему реактивности, вдохновлённую сигналами (signals). Если в Svelte 4 реактивность была «магией компилятора», то в Svelte 5 она явная и предсказуемая:

<script>
// Svelte 4 — неявная реактивность
let count = 0; // магия компилятора делала это реактивным
$: doubled = count * 2; // реактивное объявление
</script>
<script>
// Svelte 5 — явные Runes
let count = $state(0); // явно: это реактивное состояние
let doubled = $derived(count * 2); // явно: это вычисляемое значение
$effect(() => { // явно: это побочный эффект
console.log('count изменился:', count);
});
</script>

Четыре основных Rune:

RuneАналог в VueАналог в ReactНазначение
$state()ref()useState()Реактивное состояние
$derived()computed()useMemo()Вычисляемые значения
$effect()watchEffect()useEffect()Побочные эффекты
$props()defineProps()propsПропсы компонента

Если Svelte — это «jQuery на стероидах», то SvelteKit — это Next.js для Svelte-разработчиков. Это полноценный метафреймворк для создания веб-приложений любой сложности:

SvelteKit возможности:
├── 📄 File-based routing (как Next.js App Router)
├── 🔄 SSR, SSG, SPA — любой режим рендеринга
├── ⚡ API Routes (серверные endpoints)
├── 📝 Form Actions (без JavaScript!)
├── 🔒 Hooks (middleware)
├── 🌍 Адаптеры: Vercel, Netlify, Node, Cloudflare
└── 🎯 TypeScript из коробки

Структура SvelteKit проекта:

src/
├── routes/
│ ├── +page.svelte ← страница /
│ ├── +layout.svelte ← общий лэйаут
│ ├── +page.server.ts ← серверная логика (load)
│ ├── +server.ts ← API endpoint
│ └── about/
│ └── +page.svelte ← /about
└── lib/
├── components/ ← переиспользуемые компоненты
└── stores.ts ← глобальное состояние

Svelte Экосистема
├── 🚀 SvelteKit — full-stack фреймворк
├── 📱 Svelte Native — мобильные приложения (NativeScript)
├── 🎨 Svelte Transitions — встроенные анимации и переходы
├── 💾 Svelte Stores — глобальное состояние
│ ├── writable() — изменяемое хранилище
│ ├── readable() — только для чтения
│ └── derived() — вычисляемые хранилища
├── 🎭 Svelte Motion — tweened и spring анимации
├── 🔧 Vite — рекомендуемый сборщик
├── 🧪 Vitest + Testing Library — тестирование
└── 📦 UI библиотеки
├── shadcn-svelte (headless + Tailwind)
├── Flowbite Svelte
├── Skeleton UI
└── Melt UI (headless)

КритерийSvelteReactVueAngular
ТипКомпиляторRuntimeRuntimeFull FW
Рантайм~1.7kb~45kb~34kb~103kb
Virtual DOM
Производительность⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Кривая обучения🟢 Лёгкая🟡 Средняя🟢 Лёгкая🔴 Крутая
TypeScript✅ нативно✅ нативно
Full-stackSvelteKitNext.jsNuxtAnalog
Шаблоны.svelteJSXSFCHTML+TS
СостояниеRunes/StoresHooksCompositionServices
Сообщество🌱 Растёт🌳 Огромное🌳 Большое🌳 Большое
СоздательRich HarrisMetaEvan YouGoogle

ТемаЧто изучим
📖ОбзорЧто такое Svelte, история, экосистема
1Что такое SvelteКомпилятор vs фреймворк, философия
2Установка и ViteНастройка проекта, структура файлов
3Базовый синтаксис.svelte файлы, интерполяция, атрибуты
4РеактивностьRunes: $state, $derived, $effect
5Props$props(), передача данных вниз
6Событияon:click, dispatch, кастомные события
7Привязкиbind:value, bind:checked, bind:this
8LifecycleonMount, onDestroy, beforeUpdate
9Storeswritable, readable, derived
10Derived StoresКастомные хранилища и паттерны
11Логические блоки{#if}, {#each}, {#await}
12Переходыtransition:, animate:, motion
13Actionsuse: директивы, кастомные actions
14Slots и SnippetsSvelte 5: {#snippet}, {@render}
15Context APIsetContext, getContext
16Спецэлементыsvelte:head, svelte:self, svelte:component
17TypeScript<script lang="ts">, типизация компонентов
18ТестированиеVitest, Testing Library, компонентные тесты
19Svelte 5: RunesГлубокое погружение в новую реактивность
20Svelte 5: РеактивностьПаттерны работы с Runes
21SvelteKit: ВведениеЧто такое SvelteKit, структура проекта
22SvelteKit: МаршрутизацияFile-based routing, layouts, groups
23SvelteKit: load()Загрузка данных, серверные функции
24SvelteKit: FormsForm Actions, прогрессивное улучшение
25SvelteKit: APIServer endpoints, REST и +server.ts
26SvelteKit: AuthАутентификация, сессии, защита роутов
27SvelteKit: ДеплойАдаптеры, Vercel, Netlify, Node
28ПроизводительностьОптимизация, lazy loading, profiling
29Svelte vs React/VueКогда что выбирать, миграция
30Будущее SvelteSvelte 6, roadmap, сообщество

Курс построен от простого к сложному. Я советую идти по порядку, но если ты уже знаешь основы, можешь прыгнуть прямо к интересующей теме.

Начнём с урока 1: Что такое Svelte: компилятор, а не фреймворк 🚀

Там я подробно объясню философию Svelte, покажу как работает компилятор, и ты сразу почувствуешь что-то особенное в этом инструменте. Погнали! 🧡