Як я свічнувся з .NET на Svelte, або чому цей фреймворк вартий уваги

💡 Усі статті, обговорення, новини про Front-end — в одному місці. Приєднуйтесь до Front-end спільноти!

Привіт, спільното! Мене звати Владислав, я Full Stack Software Engineer. Пів року тому я приєднався до освітньої команди Genesis, де почав багато працювати зі Svelte та SvelteKit — здебільшого саме для розробки нових проєктів. У цій статті хочу поділитися власним досвідом використання Svelte, коротко поговорити про стан фреймворку у 2025 році, а також залишити кілька думок та спостережень.

До Genesis я займався бекенд-розробкою на .NET. Пробував фронтенд — трохи React, трохи Astro. Але саме Svelte став моїм першим повноцінним досвідом роботи з фронтенд-фреймворком і, фактично, стартом у фулстек-розробці.

Цей матеріал не є технічним порівнянням фреймворків чи спробою когось переконати. Лише ділюся історією з практики — про те, як Svelte працює в реальних умовах і чому він підійшов нашій команді.

Трохи статистики про Svelte у 2025 році

Вибір Svelte і його метафреймворку SvelteKit для створення продуктів може здатися не найтиповішим рішенням. Але чи справді він настільки «нішевий», як здається на перший погляд?

Згідно з даними State of JS 2024, Svelte використовують 26% опитаних розробників, а SvelteKit — 16,6%. Для порівняння: React — 81%, Next.js — 54%. І хоча Svelte суттєво поступається провідним фронтенд-фреймворкам — він лише четвертий у рейтингу після React, Vue та Angular, — у 2024 році його використовували удвічі більше розробників, аніж Preact, і втричі більше, аніж SolidJS.

Популярність — не єдиний показник, на який варто зважати. Якщо поглянути на рівень задоволеності серед тих, хто вже працює з фреймворком, картина кардинально відрізняється. У щорічних опитуваннях Stack Overflow з 2021 року Svelte стабільно входить до переліку найулюбленіших інструментів серед розробників.

У нашій команді ініціатором переходу на Svelte був Team Lead Марк Мотлюк, Software Engineer в Genesis. Ось як він пояснює своє рішення:

«Я обрав Svelte через його мінімальність. Фреймворк не нав’язує складні патерни, стейт-менеджмент чи абстракції. Щоб впевнено ним користуватися, потрібно опанувати лише кілька концепцій. Завдяки цьому команда може зосередитися на розробці нового функціоналу, а не витрачати час на рутинний код. Мінімальність також дає гнучкість — архітектуру проєкту можна вибудувати під власні потреби, без жорстких рамок самого фреймворку.

За два роки використання Svelte ми реалізували кілька масштабних технічних продуктів: CRM для керування подіями та їхніми учасниками; платформу для взаємодії між стартапами й фондами; платформу для українських студентів, яка допомагає їм презентувати себе продуктовим IT-компаніям, а також внутрішнє рішення для автоматизації звітності у Head Office».

Практичний кейс використання Svelte

Серед найпоширеніших побоювань і застережень щодо використання фреймворку, які я зустрічав у статтях і коментарях до них, — неготовність Svelte бути гарним production-рішенням.

Втім, наш досвід — протилежний. Наприкінці 2024 року в освітньому департаменті Genesis ми запустили INTRO — онлайн-платформу для студентів і випускників, яка допомагає краще зрозуміти специфіку роботи в продуктовому ІТ, сформувати навички для старту кар’єри та розповісти про себе компаніям з екосистеми.

Цей проєкт нам вдалося реалізувати досить швидко — і без втрати якості. Раніше я не працював зі Svelte, але завдяки його інтуїтивності зміг оперативно розібратися з основами, зрозуміти концепції фреймворку й бути продуктивним уже з перших тижнів.

На момент написання статті платформа складається з трьох основних частин:

  • Анкета-резюме — конструктор резюме з drag-and-drop логікою. Досить складна частина з погляду обʼєму, валідації, умовних полів і edge-кейсів. Однак завдяки кастомності користувачі отримують більш персоналізовані результати.
  • Навчальні матеріали — це мапи професійних траєкторій у продуктовому IT: від дизайну до QA. З технічного боку це було досить цікаве рішення, адже створення цих roadmap потрібно було автоматизувати на базі CMS. В CMS визначаються теми, залежності між ними та сам контент. Далі, на основі тем та їх залежностей генерується код для mermaid-діаграми. У результаті можемо автоматично створювати гарні SvelteFlow-діаграми на базі отриманих координат.
  • Профілі продуктових IT-компаній — дають можливість детальніше ознайомитися з компаніями, їхніми продуктами та досягненнями.

Для розробки платформи ми використовували метафреймворк SvelteKit та Svelte 5. Щодо інструментів та бібліотек:

  • стилізація — TailwindCSS;
  • бібліотека компонентів — shadcn-svelte (порт shadcn/ui на Svelte);
  • форми — sveltekit-superforms;
  • для редагування блоків анкети у профілі — svelte-dnd-action.

Більшість додаткових бібліотек — звичайні JavaScript-рішення, які легко інтегруються без потреби у специфічних обгортках. Це ще один плюс Svelte як фреймворку: інтеграція з vanilla JS-екосистемою UI-компонентів абсолютно безболісна.

Що стосується взаємодії з Back-end, ось як описує підхід Марк:

«У SvelteKit нативні способи взаємодії з Back-end досить обмежені — це лише load-функції (виконуються на сервері перед рендером сторінки) та form actions (серверна обробка форм). Через це ми також використовуємо tRPC — він забезпечує зручну роботу з Back-end ендпоінтами, гарантуючи безпеку типів (end-to-end type safety).

Також на одному з внутрішніх проєктів ми впровадили Telefunc — бібліотеку, яка дозволяє викликати серверні функції прямо з клієнтського коду, ніби вони локальні.

Підхід колокації Back-end та Front-end, реалізований в інструментах на кшталт tRPC, Telefunc та самому SvelteKit, суттєво спрощує та прискорює процес розробки».

Що саме сподобалося у Svelte та SvelteKit

SvelteKit пропонує класний developer experience. Особисто мені подобаються підхід до розробки, інструменти та філософія, що він пропонує.

Структура проєкту

У SvelteKit реалізований file-based routing. Згідно з цією системою, кожна сторінка визначається всередині теки /routes в окремому файлі +page.svelte. +page префікс використовується і в назві файлів, що належати до цієї сторінки. Наприклад, +page.server.ts (визначає серверну логіку) та +page.ts (код, що може виконуватись і на сервері, і у браузері перед рендером сторінки).

У цих файлах можна створювати функції load, що дозволяють завантажувати дані на сторінку. Для визначення лейаутів використовується префікс «+layout»: +layout.svelte, +layout.server.ts, +layout.ts. Досить інтуїтивно та зрозуміло.

Ось, наприклад, view частинки файлової системи на проєкті INTRO:

src/
├── lib/
├── params/
├── routes/
│   ├── (auth)/
│   ├── api/
│   ├── companies/
│   ├── learning/
│   ├── profile/
│   │   ├── +page.server.ts
│   │   └── +page.svelte
│   ├── +error.svelte
│   ├── +layout.server.ts
│   ├── +layout.svelte
│   └── +page.svelte

Компоненти

Як і сторінки, компоненти у Svelte визначаються кожен в окремому файлі (Single-File Component), і експортуються за замовчуванням. Код у компонентах підтримує TypeScript і є «реактивним» out of the box. Ось невеличкий приклад компонента на Svelte 5, для загального розуміння структури:

<script lang="ts">  
  import { onMount } from 'svelte';  
  
  type Props = {  
    name: string;  
  };  
  
  let { name }: Props = $props(); // отримуємо аргументи компонента  
  
  let isOpen = $state(false); // так можна створити реактивну змінну  
  
  onMount(() => { // відпрацьовує при ініціалізації компонента  
    console.log('Component mounted');  
  });  
  
  // реактивна функція, викликається при зміні залежностей, тут - isOpen та name 
  $effect(() => {  
    if (isOpen) {  
      console.log(`${name} is open`);  
    }  
  });  
</script>  
  


<button onclick={() => isOpen = !isOpen}>
  {isOpen ? "Закрити" : "Відкрити"}
</button>

{#if isOpen}
<h2 class="name">  
  Hello, {name}!  
</h2>
{/if}

<!-- Так можна визначати scoped-стилі для компонента -->
<style>  
  .name {  
    font-size: 2rem;  
    color: #333;  
  }  
</style>

Також у Svelte є two-way data binding, який, якщо ним не зловживати, є досить зручним. Щоб позначити аргумент як «bindable» використовується руна $bindable():

<script lang="ts">  
  let { value = $bindable(), ...props } = $props();  
</script>  
  
<input bind:value={value} {...props} />

Відповідно тепер, при зміні значення value, воно зміниться й у parent-компоненті.

Перфоманс

SvelteKit має класний performance «з коробки» та імплементує чимало способів оптимізації сторінок. Окремо варто виділити:

  • автоматичний preloading посилань під час ховеру;
  • об’єднання різних серверних load-запитів в один HTTP-запит;
  • можливість пререндеру (prerender) статичних сторінок (можна налаштувати для кожного роуту);
  • паралельне завантаження не пов’язаних load-функцій.

Більше про перфоманс та те, яким чином SvelteKit оптимізує вебсайт, можна почитати на сторінці в документації (доки у Svelte, до речі, досить гарні та зрозумілі).

Головний виклик Svelte

Наразі Svelte справді має меншу спільноту та екосистему, ніж React або навіть Vue. Попри те, що фреймворк уже використовується у чималій кількості production-проєктів — зокрема таких, як Apple Music, Yahoo Finance та Stack Overflow, — він усе ще сприймається як менш перевірений або менш універсальний варіант, особливо під час вибору стеку для масштабних продуктів. У більшості випадків вибір, найімовірніше, схилиться до популярніших рішень — навіть попри те, що Svelte може виявитися зручнішим і швидшим у розробці.

Менша кількість production-кейсів також означає й меншу кількість спеціалістів на ринку, які вже мають досвід роботи зі Svelte. І це, на мою думку, — основний бар’єр, що стримує ширше впровадження фреймворку.

Попри це, для нашої команди цей вибір спрацював.

Ось як це пояснює Марк:

«Хоча ринок досвідчених Svelte-спеціалістів наразі обмежений, для нас це не стало перешкодою під час масштабування команди. Ми шукаємо не просто Svelte-розробників, а насамперед талановитих інженерів-універсалів. Пріоритет — здатність розв’язувати складні задачі та створювати якісний продукт, а не володіння конкретним стеком.

Тестове завдання на Svelte для нас — ще один фільтр, який допомагає виявити розробників, здатних швидко розібратися з новою технологією та гнучко мислити».

Висновки

Чи варто обирати Svelte як фронтенд-фреймворк — це питання, відповідь на яке залежить від конкретного проєкту, команди та контексту. Так, Svelte справді поступається React чи Vue за популярністю й розміром екосистеми. Також знайти спеціаліста з досвідом саме у Svelte може бути складніше.

Але не варто відкидати Svelte лише через скептичне ставлення до нього як до не «production ready» інструмента — наш досвід свідчить про інше.

Особисто для мене Svelte виявився легким та інтуїтивним у вивченні. Його логіка зрозуміла, він пропонує чимало інструментів та налаштувань «з коробки». Через свою мінімалістичність та підхід до розробки, він дозволяє досить оперативно будувати навіть складні вебзастосунки.

Тож якщо ви — команда інженерів-універсалів і шукаєте ефективний, легкий у старті та гнучкий у використанні інструмент для фронтенду — спробуйте Svelte. Цілком можливо, він вас приємно здивує.

👍ПодобаєтьсяСподобалось6
До обраногоВ обраному1
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

это фреймворк хайповался более 5 лет назад dou.ua/forums/tags/Svelte тройку ангуляр-реакт-вью он так и не смог перебить, следовательно он не нужен в проектах, как и поддерживать тоже

Заголовок по-дібільному написаний, наче чєл з бекенда на фронт перейшов і ще і радий

Цікаво дізнатися про недоліки самого фреймворку, як об’єкта. Я розумію соціальні недоліки, такі як: маленьке ком’юніті, мало розробників і тд, але які саме недоліки інструмента?

З власного досвіду, об’єктивних недоліків у порівнянні з Next.js (React) та Nuxt (Vue) я не знайшов:
— продуктивність помітно краща (здебільшого завдяки дуже малим JS-бандлам на виході та якісному автоматичному code-splitting);
— коду потрібно писати менше (швидше пишеться, легше читається): component-party.dev/compare/react-vs-svelte
— дублювання коду немає (особливо як раніше при роботі з Redux у React);
— є багато більш глибокого функціоналу (наприклад, не виникає проблем при налаштуванні роутингу з підтримкою багатомовності).

Одразу зауважу, що йдеться саме про SvelteKit, який робить Svelte повноцінним інструментом. Адже якщо порівнювати безпосередньо фреймворки (Svelte, React, Vue) між собою — різниця не така суттєва.

Єдиний об’єктивний недолік — менша кількість плагінів. Адже замість налаштування готового плагіна за 15 хвилин доведеться витратити години на реалізацію відсутнього. Простих плагінів, як-от datepicker, уже достатньо, а от для складніших — наприклад, редактора коду — вибір обмежений.

Особисто я ще хотів би мати можливість детально налаштовувати компресію статики, а не просто вмикати/вимикати її. А також — додати кешування для динамічних сторінок (щоб HTML не рендерився заново, якщо дані не змінилися). Але подібне мало кого хвилює. А кого хвилює — тим не складно реалізувати це власноруч.

Щоправда, я не можу нічого сказати про зручність написання бекенду на SvelteKit (завжди пишу його як окремий API). Адже якщо писати API-ендпоінти на SvelteKit (або Next.js/Nuxt), це для бекенду означає втрату продуктивності разів у 10. Писати бекенд безпосередньо на SvelteKit можна, хіба що, для невеликих проєктів, де продуктивність не має значення.

Так склалося, що React, Vue та Angular вже поділили ринок фреймворків. Вони непогані (про Angular не знаю, досвіду не маю). Загалом, Svelte не настільки кращий, щоб на нього потрібно було терміново переходити. Тому зараз його використовують лише ті, хто точно знає, навіщо він їм потрібен (здебільшого для продуктивності та простішого коду).

Одразу зауважу, що йдеться саме про SvelteKit, який робить Svelte повноцінним інструментом

Ви так кажете що нібито Next.js також робить React повноцінним інструментом 😅

Щоправда, я не можу нічого сказати про зручність написання бекенду на SvelteKit (завжди пишу його як окремий API)

SvelteKit, Next, Nuxt це не фулстек фреймворки не зважаючи на те що вони «працюють на сервері». Це просто (намагання винайти наново php) фронтенд.

Дякую за розгорнуту відповідь!

Для себе виділив відсутність кешування статичних файлів (ака фото), в нексті це реалізовано під капотом і гірший LLM автоклмпліт

Чи не могли б ви детальніше розписати, про що йдеться щодо кешування статики?

Адже кешування статики здійснюється на рівні сервера. Наприклад, при розміщенні сайту на VPS запити перехоплює Nginx. Він віддає статичні файли, додаючи заголовки кешування, а запити до динамічного контенту перенаправляє до SvelteKit.

В деплої next.js на serverless кешування реалізовано під капотом, нічого не потрібно конфіжити

У Svelte також можна використовувати можливості serverless-платформ. Ось приклад для зображень (зокрема, налаштування часу кешування) на Vercel: svelte.dev/...​vercel#Image-Optimization

Зміст обирати svelte а не vue — десь як у виборі preact замість react.

Для більш повної картини хотілося б також прочитати розділ

Що саме НЕ сподобалося у Svelte та SvelteKit

:)

Якщо стисло про недоліки Svelte в порівнянні з React або Vue:
— менше плагінів
— менше вакансій
— менше розробників

Із суб’єктивного, що не подобається деяким розробникам:
— роутинг на основі директорій
— 5-та версія Svelte, в якій з’явились руни (більш очевидне оголошення станів, що вимагає писати трохи більше коду): component-party.dev/...​ompare/svelte4-vs-svelte5

— менше плагінів
— менше вакансій
— менше розробників

Це ви про екосистему в цілому. А я більше хотів би дізнатися про DX, що конкретно бува дратує (таке ж 100% повинно бути).

Ну от роутінг на основі директорій це ж не Svelte а SvelteKit, бо такий роутінг це де факто стандарт в подібних метафреймворках (Next, Nuxt, etc).

Я зі Svelte ознайомлювався, але не робив нічого більшого за TodoList, але він мені здався доволі «магічним» як і в позитивному так і негативному значенні цього слова. Тому й хотілося б почути інфу від тих хто в ньому вже по вуха.

Більш детально написав вище: dou.ua/...​rums/topic/53560/#2962329

Ще забув додати, що з суб’єктивного не подобається деяким розробникам — це синтаксис блоків (if/else/each).

Підписатись на коментарі