{"id":32753,"date":"2025-12-12T05:00:00","date_gmt":"2025-12-12T04:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=32753"},"modified":"2026-01-14T15:52:27","modified_gmt":"2026-01-14T14:52:27","slug":"pierwsze-kroki-w-svelte-todo-app","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/pierwsze-kroki-w-svelte-todo-app\/","title":{"rendered":"Pierwsze kroki w Svelte \u2013 TODO App"},"content":{"rendered":"\n<p>Je\u015bli interesujesz si\u0119 frontendem, to prawdopodobnie znasz ju\u017c Reacta, Vue czy Angulara. Ka\u017cdy z nich oferuje narz\u0119dzia, ale jednocze\u015bnie wymaga pracy z warstw\u0105, kt\u00f3ra obs\u0142uguje wirtualny DOM, rozbudowane API, a czasem spor\u0105 dawk\u0119 konfiguracji.<\/p>\n\n\n\n<p>Framework <strong>Svelte<\/strong> powsta\u0142 jako odpowied\u017a na te problemy \u2013 z za\u0142o\u017ceniem, \u017ce aplikacje frontendowe mog\u0105 by\u0107 <strong>szybsze, l\u017cejsze i prostsze<\/strong>.<\/p>\n\n\n\n<p>Chcia\u0142bym przedstawi\u0107 Ci jego podstawowe za\u0142o\u017cenia, filozofi\u0119 oraz to, czym r\u00f3\u017cni si\u0119 od pozosta\u0142ych framework\u00f3w. Je\u015bli planujesz spr\u00f3bowa\u0107 czego\u015b nowego \u2013 to ciekawa propozycja. Svelte wci\u0105\u017c zdobywa uznanie w\u015br\u00f3d developer\u00f3w dzi\u0119ki swojej nowatorskiej metodzie tworzenia reaktywnych interfejs\u00f3w u\u017cytkownika, co sprawia, \u017ce rozpocz\u0119cie z nim pracy staje si\u0119 kusz\u0105cym krokiem. Niezale\u017cnie od tego, czy przechodzisz z innego frameworka, czy te\u017c dopiero zaczynasz swoj\u0105 przygod\u0119 z web developmentem, ten <strong>tutorial poprowadzi Ci\u0119 przez konfiguracj\u0119 pierwszego projektu w Svelte<\/strong> i przybli\u017cy podstawowe za\u0142o\u017cenia tego narz\u0119dzia.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Co to jest Svelte?<\/strong><\/h2>\n\n\n\n<p>Svelte to framework JavaScript s\u0142u\u017c\u0105cy do budowy interfejs\u00f3w u\u017cytkownika, podobnie jak React czy Vue. Zosta\u0142 wprowadzony w 2016 roku przez Richa Harrisa jako nowoczesne podej\u015bcie do tworzenia UI, kt\u00f3re wykracza poza tradycyjny wirtualny DOM. W przeciwie\u0144stwie do innych framework\u00f3w (jak React i Angular), Svelte koncentruje si\u0119 na optymalizacji podczas kompilacji, a nie w czasie dzia\u0142ania aplikacji. W jej trakcie narz\u0119dzie generuje wydajny kod JavaScript, dzi\u0119ki czemu dzia\u0142a on szybciej w runtime.<\/p>\n\n\n\n<p>To unikalne podej\u015bcie znacz\u0105co zmniejsza rozmiary pakiet\u00f3w i zwi\u0119ksza wydajno\u015b\u0107, czyni\u0105c Svelte mocnym kandydatem do budowania zar\u00f3wno ma\u0142ych, jak i du\u017cych aplikacji.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Kluczowe cechy Svelte<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Brak wirtualnego DOM<\/strong> \u2013 w przeciwie\u0144stwie do framework\u00f3w korzystaj\u0105cych z wirtualnych DOM do stosowania zmian, Svelte aktualizuje DOM, gdy zmienia si\u0119 stan aplikacji. Efekt:\n<ul class=\"wp-block-list\">\n<li>mniej operacji,<\/li>\n\n\n\n<li>szybsze dzia\u0142anie,<\/li>\n\n\n\n<li>lepsza wydajno\u015b\u0107 na s\u0142abszych urz\u0105dzeniach.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Reaktywny kod<\/strong> \u2013 zamiast zarz\u0105dzania przez biblioteki do zarz\u0105dzania stanem lub hooki, reaktywno\u015b\u0107 w Svelte jest wbudowana w j\u0119zyk, co umo\u017cliwia bezpo\u015brednie podej\u015bcie do aktualizacji element\u00f3w UI. W Svelte reaktywno\u015b\u0107 dzia\u0142a na poziomie zmiennych:<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nlet count = 0;\nfunction increment() {\n  count += 1;\n}\n<\/pre><\/div>\n\n\n<p>Ka\u017cda zmiana count automatycznie aktualizuje widok. Nie ma tu:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>setState(),<\/li>\n\n\n\n<li>reducer\u00f3w,<\/li>\n\n\n\n<li>hook\u00f3w,<\/li>\n\n\n\n<li>klasowych komponent\u00f3w.<\/li>\n<\/ul>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Izolowane style <\/strong>\u2013 komponenty Svelte automatycznie izoluj\u0105 style zdefiniowane w blokach `&lt;style>`, aby zapobiec ich przeciekaniu mi\u0119dzy komponentami, co zapewnia utrzymanie i brak konflikt\u00f3w w CSS.<\/li>\n\n\n\n<li><strong>Efektywna rekompilacja <\/strong>\u2013 dzi\u0119ki przekszta\u0142caniu komponent\u00f3w w kod imperatywny podczas kompilacji, Svelte zmniejsza obci\u0105\u017cenie w czasie dzia\u0142ania i upraszcza optymalizacje.<\/li>\n\n\n\n<li><strong>\u0141atwo\u015b\u0107 u\u017cycia <\/strong>\u2013sk\u0142adnia Svelte jest opisowa, ale zwi\u0119z\u0142a, co pozwala developerom o r\u00f3\u017cnym poziomie do\u015bwiadczenia szybko rozpocz\u0105\u0107 prac\u0119 nad nowym projektem lub wdro\u017cy\u0107 si\u0119 w ju\u017c istniej\u0105cy.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Komponent = HTML, CSS i JS w jednym pliku<\/strong><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;script&gt;\n  let name = &quot;John\u201d\n&lt;\/script&gt;\n\n&lt;style&gt;\n  h1 { color: orange; }\n&lt;\/style&gt;\n\n&lt;h1&gt;Cze\u015b\u0107, {name}!&lt;\/h1&gt;\n<\/pre><\/div>\n\n\n<p>To podej\u015bcie jest bardzo intuicyjne \u2013 wszystko, co dotyczy komponentu, znajduje si\u0119 w jednym miejscu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Sprawd\u017amy, jak to wygl\u0105da w praktyce \u2013 TODO App<\/strong><\/h2>\n\n\n\n<p>Przed kontynuowaniem upewnij si\u0119, \u017ce masz zainstalowany Node.js (https:\/\/nodejs.org\/) na swoim urz\u0105dzeniu. Mo\u017cesz to potwierdzi\u0107, uruchamiaj\u0105c w terminalu polecenia `node -v` i `npm -v`, aby sprawdzi\u0107 zainstalowane wersje.<\/p>\n\n\n\n<p><strong>Krok 1: Zainstaluj template Svelte<\/strong><\/p>\n\n\n\n<p>Prostym sposobem na sklonowanie szablonu startowego jest u\u017cycie narz\u0119dzia `degit`:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nnpx degit sveltejs\/template todo-app\n<\/pre><\/div>\n\n\n<p>To polecenie utworzy nowy projekt Svelte w katalogu `todo-app`.<\/p>\n\n\n\n<p><strong>Krok 2: Przejd\u017a do katalogu i zainstaluj zale\u017cno\u015bci<\/strong><\/p>\n\n\n\n<p>Przejd\u017a do folderu projektu i zainstaluj niezb\u0119dne zale\u017cno\u015bci:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\ncd todo-app\t\nnpm install\n<\/pre><\/div>\n\n\n<p><strong>Krok 3: Uruchom serwer deweloperski<\/strong><\/p>\n\n\n\n<p>Uruchom serwer deweloperski za pomoc\u0105 nast\u0119puj\u0105cego polecenia:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nnpm run dev\n<\/pre><\/div>\n\n\n<p>Twoja aplikacja dzia\u0142a teraz pod adresem<a href=\"http:\/\/localhost:8080\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" > http:\/\/localhost:8080<\/a>. Otw\u00f3rz ten adres URL w przegl\u0105darce, aby zobaczy\u0107 stron\u0119 pocz\u0105tkow\u0105 swojej aplikacji.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Aplikacja listy zada\u0144 TODO<\/strong><\/h2>\n\n\n\n<p>Teraz, gdy mamy skonfigurowany projekt, stw\u00f3rzmy prost\u0105 aplikacj\u0119 listy zada\u0144. Ten przyk\u0142ad pomo\u017ce Ci zrozumie\u0107 podstawowe poj\u0119cia Svelte, takie jak komponenty, reaktywno\u015b\u0107 i powi\u0105zania.<\/p>\n\n\n\n<p><strong>Krok 1: Skonfiguruj g\u0142\u00f3wny komponent<\/strong><\/p>\n\n\n\n<p>Otw\u00f3rz `src\/App.svelte`. Zacznij od wyczyszczenia jego zawarto\u015bci, a nast\u0119pnie skonfigurujmy nasz\u0105 struktur\u0119 listy TODO. Najpierw zdefiniujmy podstawowy stan dla listy zada\u0144.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;script&gt;\n    let todos = &#x5B;];\n    let newTodo = &#039;&#039;;\n   \n    function addTodo() {\n        todos = &#x5B;...todos, { text: newTodo, completed: false }];\n        newTodo = &#039;&#039;;\n    }\n    function toggleCompletion(index) {\n        todos = todos.map((todo, i) =&gt;\n            i === index ? { ...todo, completed: !todo.completed } : todo\n        );\n    }\n    function deleteTodo(index) {\n        todos = todos.filter((_, i) =&gt; i !== index);\n    }\n&lt;\/script&gt;\n<\/pre><\/div>\n\n\n<p><strong>Krok 2: Utw\u00f3rz uk\u0142ad listy TODO<\/strong><\/p>\n\n\n\n<p>Poni\u017cej znacznika `&lt;script&gt;`, dodaj formularz do przesy\u0142ania nowych zada\u0144 oraz list\u0119 do ich wy\u015bwietlania. W\u0142\u0105cz r\u00f3wnie\u017c interaktywne elementy do w\u0142\u0105czania i usuwania zada\u0144.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;main&gt;\n    &lt;h1&gt;TODO App&lt;\/h1&gt;\n    &lt;div class=&quot;todo-form&quot;&gt;\n        &lt;input placeholder=&quot;New TODO&quot; type=&quot;text&quot; bind:value={newTodo} \/&gt;\n        &lt;button on:click={addTodo} disabled={!newTodo}&gt;Add&lt;\/button&gt;\n    &lt;\/div&gt;\n\n    &lt;ul&gt;\n    {#each todos as todo, index}\n        &lt;li&gt;\n            &lt;input type=&quot;checkbox&quot; on:change={() =&gt; toggleCompletion(index)} \/&gt;\n            &lt;span class:completed={todo.completed}&gt;{todo.text}&lt;\/span&gt;\n            &lt;button on:click={() =&gt; deleteTodo(index)}&gt;Delete&lt;\/button&gt;\n        &lt;\/li&gt;\n    {\/each}\n    &lt;\/ul&gt;\n&lt;\/main&gt;\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;style&gt;\n    .completed {\n        text-decoration: line-through;\n        color: grey;\n    }\n    main {\n        padding: 2em;\n        max-width: 600px;\n        margin: 0 auto;\n    }\n    .todo-form {\n        display: flex;\n        gap: 0.5em;\n    }\n    input&#x5B;type=&quot;text&quot;] {\n        flex-grow: 1;\n    }\n    ul {\n        list-style-type: none;\n        padding: 0;\n    }\n    li {\n        display: flex;\n        align-items: center;\n        gap: 0.5em;\n        padding: 0.5em 0;\n    }\n    button {\n        cursor: pointer;\n    }\n&lt;\/style&gt;\n\n<\/pre><\/div>\n\n\n<p><strong>Krok 3: Przetestuj aplikacj\u0119<\/strong><\/p>\n\n\n\n<p>Twoja lista zada\u0144 Svelte umo\u017cliwia u\u017cytkownikom:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>dodawanie nowych zada\u0144,<\/li>\n\n\n\n<li>oznaczanie zada\u0144 jako zako\u0144czone,<\/li>\n\n\n\n<li>usuwanie zada\u0144 z listy.<\/li>\n<\/ul>\n\n\n\n<p>Odwied\u017a ponownie <a href=\"http:\/\/localhost:8080\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >http:\/\/localhost:8080<\/a> i sprawd\u017a swoj\u0105 aplikacj\u0119. Teraz mo\u017cesz dodawa\u0107 nowe zadania, prze\u0142\u0105cza\u0107 ich status uko\u0144czenia i usuwa\u0107 je.<\/p>\n\n\n\n<p>Zrozumienie unikalnych cech i funkcjonalno\u015bci Svelte jest kluczowe dla pe\u0142nego wykorzystania jego potencja\u0142u. Poni\u017cej przedstawiamy niekt\u00f3re podstawowe poj\u0119cia, kt\u00f3re wspieraj\u0105 developer\u00f3w w tworzeniu wydajnych i reaktywnych aplikacji.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Architektura oparta na komponentach<\/strong><\/h3>\n\n\n\n<p>Aplikacje Svelte s\u0105 budowane z komponent\u00f3w, czyli podstawowych blok\u00f3w definiuj\u0105cych zar\u00f3wno UI, jak i zachowanie. W przeciwie\u0144stwie do tradycyjnych framework\u00f3w, komponenty Svelte s\u0105 definiowane w jednym pliku z trzema g\u0142\u00f3wnymi sekcjami:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>`&lt;script>`,<\/li>\n\n\n\n<li>`&lt;style>`,<\/li>\n\n\n\n<li>znacznikami HTML.<\/li>\n<\/ul>\n\n\n\n<p>Ta organizacja promuje czystsz\u0105 struktur\u0119, zawieraj\u0105c\u0105 ca\u0142\u0105 niezb\u0119dn\u0105 logik\u0119, style i szablony potrzebne do dzia\u0142ania komponentu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Binding<\/strong><\/h3>\n\n\n\n<p>Svelte upraszcza synchronizacj\u0119 element\u00f3w UI i stanu komponentu za pomoc\u0105 powi\u0105za\u0144 (ang. binding). Mo\u017cesz tworzy\u0107 dwukierunkowe powi\u0105zania mi\u0119dzy elementami formularzy a zmiennymi za pomoc\u0105 `bind:`.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;input type=&quot;text&quot; bind:value={name} \/&gt;\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\"><strong>Cykl \u017cycia<\/strong><\/h3>\n\n\n\n<p>Svelte oferuje funkcje cyklu \u017cycia, kt\u00f3re pozwalaj\u0105 wpi\u0105\u0107 si\u0119 w r\u00f3\u017cne etapy \u017cycia komponentu. S\u0105 one podobne do metod cyklu \u017cycia komponent\u00f3w w innych frameworkach.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>onMount \u2013 wywo\u0142ywana po pierwszym renderowaniu komponentu do DOM.<\/li>\n\n\n\n<li>onDestroy \u2013 wykonywana, gdy komponent jest usuwany z DOM.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Stores<\/strong><\/h3>\n\n\n\n<p>Do zarz\u0105dzania stanem obejmuj\u0105cym wiele komponent\u00f3w lub ca\u0142\u0105 aplikacj\u0119, Svelte oferuje koncepcj\u0119 zwan\u0105 stores. Store to obiekt, kt\u00f3re utrzymuje i zarz\u0105dza wsp\u00f3\u0142dzielonym stanem, oferuj\u0105c prosty wzorzec interakcji, podobny do Redux lub Context API w React, ale mniej z\u0142o\u017cony.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Przej\u015bcia i animacje<\/strong><\/h3>\n\n\n\n<p>Dynamika wizualna jest kluczowa dla do\u015bwiadczenia u\u017cytkownika, a Svelte oferuje wbudowane wsparcie dla przej\u015b\u0107 i animacji, pozwalaj\u0105c na deklaratywne definiowanie bogatych efekt\u00f3w ruchu.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;p in:fade out:fade&gt;Hello!&lt;\/p&gt;\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/oferty-pracy\/\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" width=\"737\" height=\"170\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/12\/praca-PL-k.jpg\" alt=\"oferty pracy\" class=\"wp-image-32754\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/12\/praca-PL-k.jpg 737w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/12\/praca-PL-k-300x69.jpg 300w\" sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>Uda\u0142o Ci si\u0119 skonfigurowa\u0107 projekt Svelte i stworzy\u0107 funkcjonaln\u0105 aplikacj\u0119. To \u0107wiczenie nie tylko ukazuje prost\u0105 i eleganck\u0105 sk\u0142adni\u0119 Svelte, ale tak\u017ce jego pot\u0119\u017cn\u0105 reaktywno\u015b\u0107 i zdolno\u015bci do zarz\u0105dzania stanem.<\/p>\n\n\n\n<p>Gdy poczujesz si\u0119 bardziej komfortowo ze Svelte, rozwa\u017c poznanie zaawansowanych funkcji, takich jak tworzenie komponent\u00f3w wielokrotnego u\u017cytku, korzystanie ze store\u2019a do zarz\u0105dzania stanem lub integrowanie us\u0142ug backendowych.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Przydatne linki<\/strong><\/h2>\n\n\n\n<p>Oficjalne zasoby<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"http:\/\/svelte.dev\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >Oficjalna strona Svelte<\/a> \u2013 oficjalne samouczki i dokumentacja (cho\u0107 link prowadzi do strony z samouczkiem, kt\u00f3ra jest cz\u0119\u015bci\u0105 oficjalnych zasob\u00f3w).<\/li>\n\n\n\n<li><a href=\"http:\/\/kit.svelte.dev\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >SvelteKit<\/a> \u2013 oficjalny framework full-stack oparty na Svelte.<\/li>\n\n\n\n<li><a href=\"http:\/\/github.com\/sveltejs\/svelte\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >GitHub<\/a> \u2013 repozytorium kodu \u017ar\u00f3d\u0142owego projektu (open-source).<\/li>\n\n\n\n<li><a href=\"http:\/\/developer.mozilla.org\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >MDN Web Docs<\/a> \u2013 wprowadzenie do Svelte, kt\u00f3re mo\u017ce pom\u00f3c w rozpocz\u0119ciu pracy.\u00a0<\/li>\n<\/ul>\n\n\n\n<p>Spo\u0142eczno\u015b\u0107 i por\u00f3wnania<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"http:\/\/en.wikipedia.org\/wiki\/Svelte\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >Wikipedia<\/a> \u2013 og\u00f3lne informacje o Svelte.<\/li>\n\n\n\n<li><a href=\"http:\/\/news.ycombinator.com\/item?id=38030432\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >Hacker News\u00a0<\/a>\u2013 dyskusja na temat projektu Svelte.<\/li>\n\n\n\n<li><a href=\"http:\/\/bulldogjob.pl\/readme\/svelte-vs-react-zakonczenie-debaty\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >Bulldogjob<\/a> \u2013 artyku\u0142 por\u00f3wnuj\u0105cy Svelte z React.<\/li>\n\n\n\n<li><a href=\"http:\/\/creolestudios.com.en2pl.search.translate.goog\/svelte-vs-reactjs\/\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >Creole Studios<\/a> \u2013 artyku\u0142 por\u00f3wnuj\u0105cy Svelte z ReactJS.<\/li>\n\n\n\n<li><a href=\"http:\/\/cubettech.com\/resources\/blog\/advantages-of-using-svelte-over-other-frontend-frameworks\/\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >Cubet<\/a> \u2013 artyku\u0142 o zaletach Svelte.\u00a0<\/li>\n<\/ul>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;32753&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;4&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 4)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Pierwsze kroki w Svelte \u2013 TODO App&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 4)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Je\u015bli interesujesz si\u0119 frontendem, to prawdopodobnie znasz ju\u017c Reacta, Vue czy Angulara. Ka\u017cdy z nich oferuje narz\u0119dzia, ale jednocze\u015bnie wymaga &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/pierwsze-kroki-w-svelte-todo-app\/\">Continued<\/a><\/p>\n","protected":false},"author":763,"featured_media":32909,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[4874,2427,1546,1512,113,991],"class_list":["post-32753","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-svelte","tag-digital","tag-przeglad-narzedzi","tag-poradnik","tag-frontend","tag-react"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/12\/Code.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/32753"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/763"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=32753"}],"version-history":[{"count":1,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/32753\/revisions"}],"predecessor-version":[{"id":32758,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/32753\/revisions\/32758"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/32909"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=32753"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=32753"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=32753"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}