Upgrade to Pro — share decks privately, control downloads, hide ads and more …

選擇 Svelte 的三個理由 - JSDC

Kalan
October 30, 2021

選擇 Svelte 的三個理由 - JSDC

Kalan

October 30, 2021
Tweet

More Decks by Kalan

Other Decks in Technology

Transcript

  1. Svelte 是什麼 • ⼀⾨前端框架 • 由 Rich Harris 在 2016

    年開始開發 • 透過事先編譯的⽅式減少 runtime 體積 • 400 多位貢獻者 3
  2. Agenda • 簡介 Svelte • 現代前端框架的基本要素 • 選擇 Svelte 的三個理由

    • 語法簡單、容易上⼿ • bundle size 體積⼩ • 關注度持續提升
  3. 「現代」前端框架的基本要素 • 元件化的中⼼思想 7 / / js function as component

    export const Profile = ({ user }) = > { return <div>{user.name} < / div>; }; < ! - - SFC - - > <template> <div>{{ user.name }} < / div> < / templte>
  4. 「現代」前端框架的基本要素 • 元件化的中⼼思想 • 響應機制(Reactivity) 8 <script setup> import {

    ref } from 'vue' const count = ref(0) < / script> <template> <button @click="count + + ">{{ count }} < / button> < / template> export const Profile = () = > { const [user, setUser] = useState({ name: "kalan" }); return <button onClick={() = > setUser({ name: 'hoge' })}> {user.name} < / button>; };
  5. 「現代」前端框架的基本要素 • 元件化的中⼼思想 • 響應機制(Reactivity) • ⽣命週期 9 <script> export

    default { mounted() { . . . } } < / script> <template> <div> < / div> < / template> export const Profile = () = > { useEffect(() = > { . . . }, []); useEffect(() = > { . . . }, [deps]); return <div> . . . < / div>; };
  6. 問題點 • 需要在 runtime 做 di ff 演算 → 增加

    bundle size • 需要實作⼀套響應機制 → 犧牲⼀部分的效能 10
  7. Svelte 如何簡化 事先編譯並⽣成 JavaScript 程式碼 12 / / Countdown.svelte <script>

    let countdown = 10; onMount(() = > { setInterval(() = > countdown -= 1, 1000); }) < / script> <span>{countdown} < / span>
  8. Svelte 如何簡化 事先編譯並⽣成 JavaScript 程式碼 13 <script> let countdown =

    10; onMount(() = > { setInterval(() = > countdown -= 1, 1000); }) < / script> <span>{countdown} < / span>
  9. 響應式語法 15 <script> import { onMount } from 'svelte'; let

    countdown = 80; $: formatted = `${format(countdown, 'xx:xx')}`; onMount(() = > { setInterval(() = > countdown -= 1, 1000) }); < / script> <span>{formatted} < / span>
  10. 樣板語法 16 <script> export let age = 16; const handleClick

    = () = > age + + ; < / script> <button on:click={handleClick}>長⼀歲 < / button> {#if age > = 18} <span>已成年 < / span> {:else} <span>未成年 < / span> {/if}
  11. • 只會引入必要的依賴 • 編譯後會變為 DOM API 呼叫 • 在 runtime

    沒有 virtual DOM
 和 di ff 機制 注意:Svelte 不是 zero-runtime