Svelte, além do hype.

Tiago Vilas Boas (Montanha)

Zé, Zé Pqueno e etc

  • Desenvolvedor Front-End Sr na Dextra 
  • 12+ anos de experiência com TI 

tiago@artesites.com.br

O Svelte foi criado em 2016 pelo Rich Harris, seu criador o define como uma nova linguagem de escrever componentes ao invés de um framework.

Framework que não é framework!?

  • Escrita simples
  • Escrever menos código
  • Não utilizar Virtual DOM
  • Verdadeiramente reativo
  • Compile-time

Premissas

Rich Harris - Rethinking reactivity: https://www.youtube.com/watch?v=AdNJ3fydeao

Alternative Content

Rich Harris - Rethinking reactivity: https://www.youtube.com/watch?v=AdNJ3fydeao

Reatividade?

Um exemplo mais simples sobre a reatividade é através de uma função no Excel onde um valor de uma célula modificada altera o estado de outras células relacionadas sem mudar os itens não relacionados.

Utilizando somente tecnologia web o Svelte interpreta seus componentes .svelte e através do rollup.js (ou webpack) retorna um bundle de javascript nativo para seu browser, ou seja, ele transforma templates HTML em DOM scripiting.

E o que ele faz?

Comparações dos pacotes (bundles)

Framework Quantidade JS Files Tamanho do bundle JS (KB) %
Svelte 7 43.54 4
Stencil 10 120.06 12
Outros Frameworks
Angular 8 551.97 54
React/Redux 1 1,024.00 100
Vue 6 218.13 21
Elm 1 90.52 9


RealWorld App

O Svelte não possui uma engine Virtual DOM, o mesmo tem o propósito de gerar todo código necessário e executar somente o necessário para renderizar o DOM real. (compile-time vs run-time)

Diga adeus ao Virtual DOM

 

Virtual DOM is pure overhead: https://svelte.dev/blog/virtual-dom-is-pure-overhead

Tá, e como começar?

Você consegue iniciar com o Svelte 3 (stable) através do REPL ou através do degit (Rick Harris) que copia estruturas de repositorios git.

npx degit sveltejs/template my-svelte-project
cd my-svelte-project

npm install
npm run dev

No terminal:

package.json

{
  "name": "svelte-app",
  "version": "1.0.0",
  "devDependencies": {
    "npm-run-all": "^4.1.5",
    "rollup": "^1.12.0",
    "rollup-plugin-commonjs": "^10.0.0",
    "rollup-plugin-livereload": "^1.0.0",
    "rollup-plugin-node-resolve": "^5.2.0",
    "rollup-plugin-svelte": "^5.0.3",
    "rollup-plugin-terser": "^4.0.4",
    "svelte": "^3.0.0"
  },
  "dependencies": {
    "sirv-cli": "^0.4.4"
  },
  "scripts": {
    "build": "rollup -c",
    "autobuild": "rollup -c -w",
    "dev": "run-p start:dev autobuild",
    "start": "sirv public --single",
    "start:dev": "sirv public --single --dev"
  }
}


Sintaxe  - Single File Component (SFC)

<!-- MyComponent.svelte -->
<script>
  // logic of component
</script>

<style>
  /* styles of component */
</style>

<!-- HTML Markup -->

Javascript

<!-- MyComponent.svelte -->
<script>
  let count = 0;

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

<button on:click={increment}>
  {count} click(s).
</button>

CSS (Scoped)

<!-- MyComponent.svelte -->
<style>
  /*afeta os elementos <p> 
  somente deste componente*/
  p {
  color: purple;
  font-family: 'Comic Sans MS';
  font-size: 2em;
  }
</style>

<p>Mussum ipsum cacilds, 
vidis litro abertis. </p>

CSS (Global)

<!-- app.svelte -->
<style>
  :global(body) {
  /* isso se aplica ao <body> */
    margin: 0;
  }

  div :global(strong) {
  /* isso se aplicará a todos 
  os elementos <strong>, 
  em qualquer componente dentro 
  dos elementos <div> */
    color: goldenrod;
  }
</style>

Declaração reativa

<script>
  let count = 0;
  let double;

  $: double = count*=2;

  function inc() {
    count = count+=1;
  }
</script>
<h1>
  Count: {count}, Double: {double}
</h1>
<button on:click={inc}>
  Increment
</button>

Forms (Bindings)

<script>
  let name = '';
  let active = false;
</script>

<input type="text" bind:value={name}>
<input type="checkbox" bind:checked={active}>

Hello, my name is: {name}. 
I'm active? { active ? 'Yes.' : 'No.' }

Stores

// store.js
import { writable } from 'svelte/store';

export const user = writable({
  name: "Jose da Silva Sauro",
  phone: "11 99991-1000",
  email: "email@provedor.com"
})

Forms

<script>
import { user } from "./store.js";
</script>

<h1>Form</h1>
<form class="content">
  <label>Nome</label>
  <input type="text" bind:value={$user.name} />
  <label>E-mail</label>
  <input type="text" bind:value={$user.email} />
  <label>Telefone</label>
  <input type="text" bind:value={$user.phone} />
</form>

If-else (Block)

<script>
    let user = { loggedIn: false };
    function toggle() {
        user.loggedIn = !user.loggedIn;
    }
</script>
{#if user.loggedIn}
    <button on:click={toggle}>
        Log out
    </button>
{:else}
    <button on:click={toggle}>
        Log in
    </button>
{/if}

Each (Block)

<script>
    let frameworks = [
        {id: 0, name: 'Angular'},
        {id: 1, name: 'React'},
        {id: 2, name: 'Vue'}
    ]
</script>
<h1>Frameworks List</h1>
<ul>
    {#each frameworks as {id, name}}
        <li>
            {id}: {name}
        </li>
    {/each}
</ul>

Await (Block)

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

Vantagens

  • Simplicidade
  • Poder de processamento
  • Curva de aprendizado
  • Menos dependências
  • Arquitetura  (SFC)
  • Crescimento exponencial

Desvantagens

  • Maturidade
  • Comunidade pequena
  • Libs em desenvolvimento
  • Vagas no mercado

Case

Svelte é a solução mais simples e performática para hardwares limitados.

Ecosistema

Quem já usa Svelte?

Aprender Svelte em Pt-BR

Referências

Dúvidas?

O que é Svelte JS?

By Tiago Vilas Boas

O que é Svelte JS?

Svelte é uma linguagem para descrever interfaces de usuário reativas utilizando uma abordagem diferente e podemos considera-lo como uma nova linguagem de escrever componentes ao invés de um framework.

  • 588