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

30. Будущее Svelte

Привет! 👋 Svelte 5 только что вышел — и это было большое событие. Но история не заканчивается! Сообщество продолжает расти, появляются новые паттерны, и у Svelte есть несколько интересных направлений развития.

Думай о Svelte как о стартапе-единороге 🦄: он ещё не такой большой как React (Fortune 500), но растёт быстрее, инновирует смелее, и разработчики, которые его используют, остаются с ним навсегда.


Svelte 5 вышел в октябре 2024 года — это был крупнейший релиз за историю фреймворка:

Svelte 5 ключевые изменения:
✅ Runes ($state, $derived, $effect, $props)
✅ Snippets вместо именованных слотов
✅ Fine-grained реактивность (signals-based)
✅ Реактивные классы
✅ Лучший TypeScript вывод типов
✅ Компонентные инстансы через $bindable
✅ Событие с $host()
✅ Улучшенный HMR
Принятие (2024):
- Svelte 5 как дефолтный для новых проектов
- Svelte 4 → 5 миграция через codemod инструмент
- Обратная совместимость для старых паттернов (stores работают!)
- SvelteKit 2 полностью совместим с Svelte 5

Статистика роста:

npm downloads:
2022: ~500K/неделю
2023: ~700K/неделю
2024: ~900K/неделю
Тренд: +80% за 2 года
GitHub Stars:
2022: 60k
2024: 77k+
Тренд: устойчивый рост
State of JS 2023:
Retention (придут снова): 95% (ПЕРВОЕ МЕСТО!)
Interest (хотят изучить): 78%

SvelteKit 2 вышел в декабре 2023 и продолжает развиваться:

// Новые возможности SvelteKit 2:
// 1. Shallow routing — изменение URL без навигации
import { pushState, replaceState } from '$app/navigation';
import { page } from '$app/stores';
function openModal(id: string) {
// Меняем URL без перехода на новую страницу
pushState(`/items/${id}`, { showModal: true, itemId: id });
}
// В +page.svelte:
let state = $derived($page.state);
// { showModal: true, itemId: '123' }
// 2. Улучшенный streaming с Promise
// 3. Лучшая поддержка Cloudflare Workers
// 4. Улучшенная документация TypeScript
// 5. Preload improvements
// +page.server.ts с улучшенным streaming:
export const load = async ({ params }) => {
const product = await db.product.findUnique({ where: { id: params.id } });
return {
product,
reviews: getReviews(params.id), // Promise стримится
ai: generateDescription(product), // Promise стримится
};
};

Svelte Native позволяет создавать нативные iOS/Android приложения:

Окно терминала
npm install -g nativescript
npx degit halfnelson/svelte-native-template my-app
cd my-app
npm install
<!-- App.svelte — нативный компонент -->
<script lang="ts">
import { navigate } from 'svelte-native';
let count = $state(0);
let message = $derived(`Нажато ${count} раз`);
</script>
<!-- NativeScript XML элементы, не HTML! -->
<Page class="page">
<ActionBar title="Svelte Native App" />
<StackLayout class="home-panel">
<Button
text={message}
on:tap={() => count++}
class="btn btn-primary"
/>
<Label
text="Svelte + NativeScript = 🔥"
textWrap={true}
/>
</StackLayout>
</Page>

Нативные API через NativeScript:

<script lang="ts">
import { Geolocation } from '@nativescript/geolocation';
let location = $state<string>('');
async function getLocation() {
const loc = await Geolocation.getCurrentLocation({
desiredAccuracy: 3,
updateDistance: 10,
timeout: 20000
});
location = `${loc.latitude.toFixed(4)}, ${loc.longitude.toFixed(4)}`;
}
</script>

Svelte отлично поддерживает создание Web Components — кастомных HTML элементов, которые работают в любом фреймворке:

<!-- MyButton.svelte — компилируется как Web Component -->
<svelte:options
customElement={{
tag: 'my-button',
shadow: 'open',
props: {
label: { type: 'String', attribute: 'label' },
variant: { type: 'String', attribute: 'variant' },
disabled: { type: 'Boolean' },
},
}}
/>
<script lang="ts">
let {
label = 'Click me',
variant = 'primary',
disabled = false,
} = $props();
</script>
<button
class="btn btn-{variant}"
{disabled}
onclick={() => dispatch('click')}
>
{label}
</button>
<style>
/* Стили инкапсулированы в Shadow DOM */
.btn {
padding: 8px 16px;
border: none;
border-radius: 6px;
cursor: pointer;
font-family: inherit;
}
.btn-primary {
background: #ff3e00;
color: white;
}
.btn-secondary {
background: #333;
color: white;
}
</style>

Использование Web Component в любом фреймворке:

<!-- В обычном HTML: -->
<my-button label="Нажми меня" variant="primary"></my-button>
<!-- В React: -->
<my-button label="React тоже!" variant="secondary" />
<!-- В Vue: -->
<my-button label="Vue тоже!" />
<!-- В Angular: -->
<my-button label="Angular тоже!" />
vite.config.ts
// Сборка Web Components:
import { svelte } from '@sveltejs/vite-plugin-svelte';
export default defineConfig({
plugins: [
svelte({
compilerOptions: {
customElement: true, // Глобальная компиляция как Web Components
},
}),
],
});

Svelte и D3.js — идеальная пара для создания интерактивных визуализаций:

<script lang="ts">
import * as d3 from 'd3';
import { onMount } from 'svelte';
let { data }: { data: { name: string; value: number }[] } = $props();
let svgElement: SVGSVGElement;
let width = $state(400);
let height = $state(300);
// Svelte + D3 паттерн: D3 для расчётов, Svelte для DOM
let xScale = $derived(
d3.scaleBand()
.domain(data.map(d => d.name))
.range([0, width])
.padding(0.1)
);
let yScale = $derived(
d3.scaleLinear()
.domain([0, d3.max(data, d => d.value) ?? 0])
.range([height, 0])
);
let bars = $derived(
data.map(d => ({
x: xScale(d.name) ?? 0,
y: yScale(d.value),
width: xScale.bandwidth(),
height: height - yScale(d.value),
name: d.name,
value: d.value,
}))
);
let hoveredBar = $state<string | null>(null);
</script>
<svg bind:this={svgElement} {width} {height}>
{#each bars as bar}
<rect
x={bar.x}
y={bar.y}
width={bar.width}
height={bar.height}
fill={hoveredBar === bar.name ? '#ffba00' : '#ff3e00'}
onmouseenter={() => hoveredBar = bar.name}
onmouseleave={() => hoveredBar = null}
style="transition: fill 0.2s"
/>
<text
x={bar.x + bar.width / 2}
y={bar.y - 5}
text-anchor="middle"
fill="white"
font-size="12"
>
{bar.value}
</text>
{/each}
</svg>

Почему Svelte + D3 лучше чем React + D3:

React + D3:
- Два разных DOM управления → конфликты
- Нужен useEffect для D3 операций
- Re-render уничтожает D3 state
Svelte + D3:
- Svelte управляет DOM, D3 только считает
- $derived для scales и calculations
- Реактивность без useEffect
- Плавные transitions через Svelte

// SvelteKit + AI streaming response
import { StreamingTextResponse } from 'ai'; // Vercel AI SDK
export const POST = async ({ request }) => {
const { messages } = await request.json();
const response = await openai.chat.completions.create({
model: 'gpt-4',
messages,
stream: true, // Стриминг!
});
// SvelteKit стримит ответ напрямую:
return new StreamingTextResponse(response.toReadableStream());
};
<!-- AI чат компонент на Svelte -->
<script lang="ts">
import { useChat } from 'ai/svelte'; // Vercel AI SDK для Svelte
const { messages, input, handleSubmit, isLoading } = useChat();
</script>
<div class="chat">
{#each $messages as message}
<div class="message {message.role}">
{message.content}
</div>
{/each}
{#if $isLoading}
<div class="typing">
<span></span><span></span><span></span>
</div>
{/if}
</div>
<form on:submit={handleSubmit}>
<input bind:value={$input} placeholder="Спроси что угодно..." />
<button type="submit">Отправить</button>
</form>

2024-2025 тренды в экосистеме Svelte:
UI библиотеки:
✅ shadcn-svelte (shadcn/ui для Svelte)
✅ Skeleton UI (активная разработка)
✅ Melt UI (headless компоненты)
✅ Flowbite Svelte
✅ DaisyUI (TailwindCSS + Svelte)
Мета-фреймворки:
✅ SvelteKit 2 (стабильный)
🔄 Elder.js (SSG/SSR)
Инструменты:
✅ svelte-check (TypeScript проверка)
✅ svelte-inspector (DevTools)
✅ Svelte REPL (онлайн playground)
Тестирование:
✅ Vitest + @testing-library/svelte
✅ Playwright (интеграционные тесты)
✅ Storybook поддержка Svelte
Формы и валидация:
✅ Superforms (мощная библиотека форм)
✅ SvelteKit Superforms + Zod
✅ Felte (легковесные формы)
State Management:
✅ Svelte Stores (встроен)
✅ XState (state machines)
🔄 Jotai-svelte
Анимации:
✅ svelte/motion (встроен)
✅ svelte/transition (встроен)
✅ AutoAnimate
✅ GSAP

🎯 Почему учить Svelte СЕЙЧАС — правильное решение

Заголовок раздела «🎯 Почему учить Svelte СЕЙЧАС — правильное решение»
1. ПЕРВОЕ МЕСТО по retention в State of JS 3 года подряд
→ Разработчики, которые попробовали, остаются
2. Vercel поддерживает разработку
→ Ресурсы, стабильность, долгосрочная перспектива
3. Svelte 5 решил главные проблемы
→ Reusable logic (runes работают вне компонентов)
→ Лучший TypeScript
→ Предсказуемость
4. SvelteKit == полный стек
→ Один фреймворк от frontend до backend
→ Не нужен отдельный Express/Fastify
5. Растущий рынок труда
→ +30% вакансий год к году
→ Нишевое знание = более высокая ценность
6. Хорошая документация
→ Официальные туториалы на svelte.dev
→ Активное Discord сообщество

Официального roadmap для Svelte 6 пока нет, но вот что обсуждается в сообществе:

Возможные улучшения в Svelte 6 (спекуляция):
- Дальнейшая оптимизация компилятора
- Улучшенная поддержка Web Components
- Лучшая интеграция с TypeScript LSP
- Возможно: async компоненты
- Возможно: partial hydration (как Astro)
- Улучшение devtools
Что точно будет улучшаться:
✅ SvelteKit — активное развитие
✅ svelte/reactivity (новые утилиты)
✅ svelte/animate улучшения
✅ Экосистема библиотек
✅ Tooling и DevX

Ресурсы для обучения и новостей:
📖 svelte.dev — официальная документация
📺 Svelte Society YouTube
🎧 Svelte Radio подкаст
📰 This Week in Svelte
💬 Discord: svelte.dev/chat
🐦 Rich Harris (@Rich_Harris на X/Twitter)
🐦 Svelte Society (@SvelteSociety)
📦 svelte.dev/blog — официальный блог
Инструменты:
🔧 svelte.dev/repl — онлайн playground
🔧 learn.svelte.dev — интерактивный туториал
🔧 svelte-check — TypeScript проверка