Skip to main content

什麼是 Svelte

Svelte 在 JavaScript 框架中佔有相當獨特的位置。相對於 React 或 Vue 是以執行時函式庫運作,Svelte 是以編譯器運作。它在建置時將元件轉換為純 JavaScript,因此不需要將額外的框架程式碼傳送到瀏覽器。 Svelte 最大的特色是不使用 Virtual DOM。當狀態變化時,Svelte 在編譯時產生的程式碼會直接更新 DOM。這使得非常輕量且高效能的 UI 得以實現。
本頁介紹的是 Svelte 5 與 Inertia v3 的組合。Laravel 13 的入門套件預設使用此組合。

Svelte 5 的 Runes

Svelte 5(2024 年釋出)引入了名為 Runes(符文) 的新反應式系統。透過 $state$derived$effect 等特殊函式(runes)來宣告反應式狀態。與 Svelte 4 以前的隱式反應式不同,此設計是明確且更容易預測的。
Laravel 的 Svelte 入門套件以 Svelte 5 + TypeScript 為標準。本頁的所有範例皆以 TypeScript(lang="ts")撰寫。

在 Laravel 中的定位

歷史

Svelte 與 Laravel 的關係比 Vue、React 都要新,官方支援是從官方入門套件的採用開始。 2026 年的 Laravel 13 將 Svelte 正式加入入門套件後,Svelte 也成為 Laravel 生態系中官方前端選項之一。它與 Vue、React 並列,可在 laravel new 的互動式提示中選擇。 雖然對 Laravel 使用者來說仍是相對陌生的框架,但其特徵在於由編譯器產生的輕量 bundle簡潔的語法。從 Vue 或 React 移轉過來,可能會對其簡潔的寫法感到驚訝。

目前的主流方式:Inertia × Svelte

目前在 Laravel 中使用 Svelte 的主要方式是 Inertia × Svelte。Inertia 不需要設計 API,即可從 Laravel 的 controller 直接將資料傳遞給 Svelte 元件,實現「現代單體式(modern monolith)」架構。

安裝設定

透過入門套件(推薦)

要新建專案時,使用入門套件是最方便的方式。
在互動式提示中選擇 Svelte,以下項目就會全部自動設定完成。
  • inertiajs/inertia-laravel(伺服器端 adapter)
  • @inertiajs/svelte(客戶端 adapter)
  • svelte + @sveltejs/vite-plugin-svelte(Svelte 5 主體與 Vite 外掛)
  • TypeScript + svelte-check
  • Tailwind CSS + shadcn-svelte 元件庫
  • HandleInertiaRequests middleware
  • 登入、註冊等認證畫面(以 Inertia + Svelte + TypeScript 實作完畢)

手動安裝

要加入既有專案時,需將伺服器端與客戶端分開安裝。
接著,在 vite.config.ts 中加入 Svelte plugin 與 Inertia Vite plugin。
resources/js/app.ts 啟動 Inertia 應用。由於 @inertiajs/vite 外掛會自動解析頁面並掛載,只需極簡的進入點即可。
手動安裝的詳情(root template 的設定、middleware 註冊等)請參考 Inertia 官方文件

目錄結構

入門套件將 Svelte 的頁面元件放在 resources/js/pages/ 目錄下。
寫成 Inertia::render('posts/Index', [...]) 時,resources/js/pages/posts/Index.svelte 就會是對應的元件。

Svelte 檔案的基本結構

.svelte 檔案由 <script>、模板、<style> 三個區塊組成。
結構類似 Vue 的 Single File Component(SFC),但模板與腳本的程式碼量更少是其特色。<style> 預設就是 scope 限定的,因此不必擔心類別名衝突。

模板語法

變數展開與運算式

在模板中使用 {} 內嵌 JavaScript 值或運算式。

{#if} — 條件分支

相當於 Vue 的 v-if / v-else、React 的三元運算子。

{#each} — 清單渲染

(post.id) 為 key 指定,用於高效的差異更新。相當於 Vue 的 v-for / React 的 Array.map()

bind: — 雙向繫結

使用 bind:value 可讓表單元素的值與反應式變數進行雙向同步。
相當於 Vue 的 v-model。React 需要手寫 onChange handler,但 Svelte 只需 bind: 就能以宣告式撰寫。

頁面元件的基本

Inertia 的頁面元件就是一般的 Svelte 元件。可將從 Laravel controller 傳入的資料作為 props 接收。

Controller

Svelte 頁面元件

Svelte 5 中使用 $props() rune 接收 props。
只需以 $props() 接收 props,即可在模板中使用 controller 傳入的資料。不需要定義 REST API。
使用 @inertiajs/svelte 提供的 <Link> 元件時,頁面切換以 XHR 進行,可避免瀏覽器整頁重新載入。
寫法與一般 <a> 標籤相同,但背後 Inertia 只會替換頁面元件,帶來如 SPA 般的操作體驗。

Form 元件

@inertiajs/svelte 提供的 <Form> 元件是入門套件認證畫面中所採用的表單送出推薦寫法。以 props 指定 actionmethod,內容以 {#snippet} 撰寫。

基本用法

{#snippet children({ errors, processing })} 是 Svelte 的 snippet 語法,用於傳遞給元件的內容區塊(相當於 Vue 的 slot 或 React 的 render props)。errorsprocessingForm 元件自動計算並傳入。表單欄位不使用 bind:value,而是使用 HTML 原生的 name 屬性,讓瀏覽器標準的表單資料蒐集機制正常運作。

入門套件的模式

入門套件使用 Wayfinder 以物件形式管理路由。store.form() 會回傳包含路由物件 actionmethod 的物件,可用 spread 傳入 <Form>
指定為 resetOnSuccess 的欄位會在送出成功時自動重設。適用於密碼欄位等送出後想清空的欄位。
若不使用 Wayfinder,也可直接傳入 action="/login" 之類的 URL,效果相同。

useForm hook

表單處理使用 @inertiajs/svelteuseForm hook。可以簡潔地實作表單狀態管理、送出與驗證錯誤顯示。

Controller 側

Svelte 表單元件

以下整理 useForm 回傳物件的主要屬性。 當驗證錯誤返回時,useForm 會保留輸入內容並顯示錯誤。搭配 bind:value 即可實現無縫的表單體驗。

共享資料(Shared Data)

所有頁面都需要的共通資料(登入使用者資訊、flash 訊息等),在 HandleInertiaRequests middleware 的 share() 方法中定義。
在 Svelte 元件中透過 usePage() 存取共享資料。
共享資料會包含在所有請求中,因此建議只放最必要的資料。使用 fn() 進行 lazy 求值時,只在實際被存取時才會被求值。

Svelte 5 的反應式(Runes)

以下介紹以 Inertia × Svelte 開發時,需要了解的 Svelte 5 Runes 語法。

$state — 反應式狀態

$state 宣告的變數會自動變為反應式。值變化時 DOM 會自動更新。相當於 Vue 的 ref 或 React 的 useState,但不需要存取 .value 屬性,直接指派即可更新狀態。

$derived — 衍生值

$derived 會在依賴值變化時自動重新計算。相當於 Vue 的 computed 或 React 的 useMemo

$effect — 副作用處理

$effect 會在依賴的 $state 值變化時執行。相當於 React 的 useEffect,但不需要明確指定依賴陣列,使用過的 $state 變數會自動被追蹤。

shadcn-svelte 元件

入門套件內建了 shadcn-svelte。shadcn-svelte 是與 React 版的 shadcn/ui 有相同設計思想的元件庫,可將程式碼複製到專案中自由客製化。

加入元件

執行指令後,元件的原始碼會被放到 resources/js/components/ui/

使用方式

入門套件已內含 Button、Input、Card、Dialog、Dropdown 等常用元件。要加入其他元件時,隨時可用 npx shadcn-svelte@latest add 指令追加。

總結

Svelte 與 Laravel 的組合,特別是透過 Inertia 的「現代單體式」架構下能發揮實力。編譯器導向的設計使 bundle 尺寸較小,而 Runes 語法讓反應式變得明確、易懂為其特色。 使用 Inertia × Svelte 可獲得結合 Laravel 後端簡潔性與 Svelte 精簡撰寫風格的開發體驗。使用入門套件建立專案時,包含認證畫面在內都能立即開始開發。

Inertia.js 官方文件

Inertia v3 完整功能請參考官方文件。
最後修改於 2026年8月2日