svelte

Einstieg in Svelte

Von am 08.02.2022

Begriff „Svelte“

Der englische Begriff „Svelte“ bedeutet so viel wie schlank, grazil, anmutig, elegant oder vornehm. So ungefähr kann man sich auch das Konzept des gleichnamigen JavaScript Compilers SvelteJS vorstellen, welchen ich hier vorstelle.

Die Idee

Vater von SvelteJS ist ein gewisser Rich Harris, welcher bei der New York Times beschäftigt ist. Er hat vor SvelteJS schon die Libraries „Reactive“, „Rollup“ und „Bublé“ programmiert. Er kritisierte an etablierten Frameworks wie React, Vue und Angular, dass diese von der Datenmenge zu groß sind, langsam im Bezug auf die Performance und dass die Kompatibilität zu anderen JavaScript Libraries nicht einwandfrei funktioniere.

Geschichte

Die Version eins wurde im Jahr 2016 veröffentlicht. Zwei Jahre später, also 2018 die Version zwei. Ab Version drei ist SvelteJS in TypeScript geschrieben – diese wurde 2019 veröffentlicht. Eine große Neuerung war die Veröffentlichung von SvelteKit im Jahr 2021. Näheres dazu folgt später, also weiterlesen zahlt sich aus 😊

Warum sollte man SvelteJS verwenden?

  • SvelteJS ist ein Compiler, keine Library oder Framework
  • Dieser Comiler erzeugt hoch optimierten JavaScript Code
  • Das heißt auch, dass kein Virtual DOM verwendet wird.
  • Laut eigenen Angaben ist SvelteJS 30% schneller als die Konkurenz.
  • Megacoole Animationen und Transitions, welche Out-Off-The-Box funktioniern.
  • Mit SvelteKit kann man Router und Store gleich mitverwenden.
  • SvelteNative als Möglichkeit für Mobile Anwendugen.
  • Und zum Schluss mein persönlicher Hauptgrund: SvelteJS ist wirklich einfach zu erlernen.

Verwendung

Es liegt nahe, dass SvelteJS von der New York Times verwendet wird, da Rich Harris dort wirkt. Aber auch andere prominente Beispiele gesellen sich zu dieser Aufzählung hinzu: Apple, Spotify, Rakuten, Bloomberg, Ikea, derStandard.at.

Die allseits beliebte Website „Stack Overflow“ kam bei einer Abstimmung ihrer User:innen, zum Thema „Most Loved Web Framework“ ebenfalls auf SvelteJS. Auch bei StateofJS ist SvelteJS auf Platz eins bei „Most Satisfaction“.

Frontend Battle

Vergleich

SvelteReactAngularVue
CompilerLibraryFrameworkFramework
Smallest, fast bundlesSmall, fast bundlesMedium-sized,
fast bundles
Small, fast bundles
Core set of featuresCore set of featuresHuge set of featuresMedium-sized set of features
No additional improvementsLots of additional improvementsLots of additional improvementsSome additional improvements

Popularität

SvelteReactAngularVue
Popular
but small / new
Pupular
and relatively mature
Popular
and relatively mature
Extremely popular
and relatively mature

Team oder Organisation

SvelteReactAngularVue
one man showDeveloped by FacebookDeveloped by GoogleOpen-source team effort

Quelle: Max Schwarzmüller https://www.youtube.com/watch?v=DZyWNS4fVE0

Syntax

Klammern

Variablen werden mit einfachen Klammern geschrieben, also so: {dasIstMeineVariable}
Ebenfalls lässt sich innerhalb der Klammer JavaScript Code ausführen.

CSS

In SvelteJS ist automatisch das geschriebene Stylesheet scoped für das jeweilige File, oder die jeweilige Komponente.

Filename

Die Dateien haben die wunderschöne Dateiendung MyFile.svelte

Aufbau

Der Aufbau lässt sich einfach Erklären: es sollen ein Script Tag, ein Tag für alle Html Elemente, zum Beispiel Main, und ein Style Tag vorhanden sein.

Das sieht dann ca. so aus:

<script></script>

<h1>Headline</h1>
<p>Paragraph<p>

<style></style>


Syntax Beispiele

Wie kann man eine Variable mit dem Inhalt
„Hello Masterklasse Mobile“ rendern?

<script>
	let hello = 'hello masterklasse mobile';
</script>

<h1>{hello}</h1>

Wie schreibt man eine For-Schleife?

<script>
  let cats = [
    { id: 1, name: 'Garfield' },
    { id: 2, name: 'Simons Cat' },
    { id: 3, name: ‘Minki’ }
  ];
</script>

<h1>Best Cats</h1>

{#each cats as cat}
  <p>{cat.name}</p>
{/each}

Wie kann man einen Html String rendern/parsen?

<script>
	let string = `here is my <strong>Bold Text</strong>`;
</script>

<p>{@html string}</p>

Wie kann man das aktuelle Datum
in einem <p> Tag ausgeben?

<script>
</script>

<p>
{new Date()}
</p>

Wie kann man beim Click auf einen Button
eine Funktion ausführen?

<script>
	let count = 0;

	function incrementCount() {
		count += 1;
	}
</script>

<button on:click={incrementCount}>
	Clicked {count} {count === 1 ? 'time' : 'times'}
</button>

Wie kann man eine Nested Component
importieren und aufrufen?

<script>
	import Nested from './Nested.svelte';
</script>

<Nested/>

Wie kann man props an eine Component übergeben?

<script>
import Nested from './Nested.svelte';
</script>

<Nested answer={42}/>


// Nested.svelte
<script>
	export let answer;
</script>

<p>The answer is {answer}</p>


//The anwer is 42

Wie kann man eine Computed Property benutzen?

<script>
	let count = 5;
	$: doubled = count * 2;
</script>

<p>{count} doubled is {doubled}</p>

Wie schreibt man IF Conditions?

{#if user.loggedIn}
	<p>hello!</p>
{/if}

{#if !user.loggedIn}
	<p>go to hell!</p>
{/if}

Wie schreibt man einen Else Block?

{#if user.loggedIn}
	<p>hello!</p>
{:else}
	<p>go to hell!</p>
{/if}



// A # character always indicates a block opening tag. 
// A / character always indicates a block closing tag. 
// A : character, as in {:else}, indicates a block continuation tag.

So schaut Else If aus:

{#if x > 10}
  <p>{x} is greater than 10</p>
{:else if 5 > x}
  <p>{x} is less than 5</p>
{:else}
  <p>{x} is between 5 and 10</p>
{/if}

Wie kann man Statements mit $ benutzen?

<script>
	let count = 5;
		
	$: if (count >= 10) {
	   alert(`count is dangerously high!`);
	}	
</script>

Wie kann man ‚object of properties‘ an eine Component übergeben?

<script>
	import Info from './Info.svelte';

	const pkg = {
		name: 'Florian',
		workshop: 'Svelte'
	};
</script>

<Info name={pkg.name} workshop={pkg.workshop}/>

Welche Lifecycle Events gibt es in Svelte?

onMount
onDestroy
beforeUpdate
afterUpdate
tick

Noch mehr Syntax?!

Hier eine kleine Auswahl an spezielleren Lösungen:

Await Blocks

{#await promise}
  <p>...waiting</p>
{:then number}
  <p>The number is {number}</p>
{:catch error}
  <p style="color: red">{error.message}</p>
{/await}

DOM Events

<div on:mousemove={handleMousemove}>
	The mouse position is {m.x} x {m.y}
</div>

Bindings

<script>
  let name = 'world';
</script>

<input bind:value={name}>

<h1>Hello {name}!</h1>


//__________________________

<script>
  let toggle = false;
</script>

<label>
  <input type=checkbox bind:checked={toggle}>
  Newsletter abonieren?
</label>

{#if toggle}
  <p>Ich schicke dir 1000 Mails am Tag</p>
{:else}
  <p>Bitte Bitte Bitte</p>
{/if}

Spezial Elements

<svelte:head>
  <link rel="stylesheet" href="tutorial/dark-theme.css">
  <title>das ist meine Headline {My Value}</title>
</svelte:head>

Was ist SvelteKit?

Die Eigendefinition lautet: „SvelteKit is a framework for building extremely high-performance web apps.”

Also ein Framework für einen Compiler? Ja, ganz genau! Grob gesagt verhält sich SvelteKit zu SvelteJS ähnlich wie Next zu React oder Nuxt zu VueJS.

Routing ist eingebaut, und ersetzt damit „Sapper“. Praktisch finde ich auch Folder Based Routing, welches ebenfalls dabei ist.

Ein weiterer Vorteil von SvelteKit ist Server Side Rendering, welches ebenfalls dadurch möglich ist.

Hands On! Worauf wartest du?

npm init svelte@next my-app
cd my-app 
npm install 
npm run dev

==> Localhost:3000 

Fazit

Nach einigen kleinen Projekten und einer umgesetzen Firmenwebsite kann ich sagen: Ich bin noch immer begeistert.

SvelteJS ist wirklich einfach zu erlernen und auch zu verwenden. Je nach Komplexität der Webanwendung würde ich es auf jeden Fall empfehlen, sich es zumindest anzusehen.

Ein kleines Manko ist jedoch festzustellen: sucht man, in Österreich nach Stellenausschreibungen, wo das Wort Svelte vorkommt, wird man leider enttäuscht (Stand Februar 2022). Es ist schon klar, dass nicht jede Firma sobald ein neues Tool am Markt erscheint, den Gesamten Sourcecode wegschmeißt, und sofort auf das neueste Ding umsteigt – dennoch wäre es wünschenswert, wenn man zum einen von großen Firmen (Angular = Google, React = Facebook) wegkommt, und zum anderen eine unabhängige, schnelle und einfache Lösung wie SvelteJS verwendet.

Der Autor wurde übrigens nicht von SvelteJS bezahlt 😊

Im Repository findest du ein Beispiel für eine simple Webapp, welche eine Filterfunktion für eine Liste beinhaltet und natürlich eine Todo Liste welche auch auf den Store zugreift – Viel Spaß damit!

https://git.nwt.fhstp.ac.at/it201505/svelte.git


Quellen

Max Schwarzmüller: https://www.youtube.com/watch?v=DZyWNS4fVE0

Official Docs: https://svelte.dev

SvelteKit: https://kit.svelte.dev/

The comments are closed.