什麼是 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 與 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)」架構。安裝設定
透過入門套件(推薦)
要新建專案時,使用入門套件是最方便的方式。inertiajs/inertia-laravel(伺服器端 adapter)@inertiajs/svelte(客戶端 adapter)svelte+@sveltejs/vite-plugin-svelte(Svelte 5 主體與 Vite 外掛)- TypeScript +
svelte-check - Tailwind CSS + shadcn-svelte 元件庫
HandleInertiaRequestsmiddleware- 登入、註冊等認證畫面(以 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> 三個區塊組成。
<style> 預設就是 scope 限定的,因此不必擔心類別名衝突。
模板語法
變數展開與運算式
在模板中使用{} 內嵌 JavaScript 值或運算式。
{#if} — 條件分支
v-if / v-else、React 的三元運算子。
{#each} — 清單渲染
(post.id) 為 key 指定,用於高效的差異更新。相當於 Vue 的 v-for / React 的 Array.map()。
bind: — 雙向繫結
使用 bind:value 可讓表單元素的值與反應式變數進行雙向同步。
v-model。React 需要手寫 onChange handler,但 Svelte 只需 bind: 就能以宣告式撰寫。
頁面元件的基本
Inertia 的頁面元件就是一般的 Svelte 元件。可將從 Laravel controller 傳入的資料作為 props 接收。Controller
Svelte 頁面元件
Svelte 5 中使用$props() rune 接收 props。
$props() 接收 props,即可在模板中使用 controller 傳入的資料。不需要定義 REST API。
Link 元件
使用 @inertiajs/svelte 提供的 <Link> 元件時,頁面切換以 XHR 進行,可避免瀏覽器整頁重新載入。
<a> 標籤相同,但背後 Inertia 只會替換頁面元件,帶來如 SPA 般的操作體驗。
Form 元件
@inertiajs/svelte 提供的 <Form> 元件是入門套件認證畫面中所採用的表單送出推薦寫法。以 props 指定 action 與 method,內容以 {#snippet} 撰寫。
基本用法
{#snippet children({ errors, processing })} 是 Svelte 的 snippet 語法,用於傳遞給元件的內容區塊(相當於 Vue 的 slot 或 React 的 render props)。errors 與 processing 由 Form 元件自動計算並傳入。表單欄位不使用 bind:value,而是使用 HTML 原生的 name 屬性,讓瀏覽器標準的表單資料蒐集機制正常運作。
入門套件的模式
入門套件使用 Wayfinder 以物件形式管理路由。store.form() 會回傳包含路由物件 action 與 method 的物件,可用 spread 傳入 <Form>。
resetOnSuccess 的欄位會在送出成功時自動重設。適用於密碼欄位等送出後想清空的欄位。
若不使用 Wayfinder,也可直接傳入
action="/login" 之類的 URL,效果相同。useForm hook
表單處理使用 @inertiajs/svelte 的 useForm hook。可以簡潔地實作表單狀態管理、送出與驗證錯誤顯示。
Controller 側
Svelte 表單元件
useForm 回傳物件的主要屬性。
當驗證錯誤返回時,
useForm 會保留輸入內容並顯示錯誤。搭配 bind:value 即可實現無縫的表單體驗。
共享資料(Shared Data)
所有頁面都需要的共通資料(登入使用者資訊、flash 訊息等),在HandleInertiaRequests middleware 的 share() 方法中定義。
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/。
使用方式
npx shadcn-svelte@latest add 指令追加。
總結
Svelte 與 Laravel 的組合,特別是透過 Inertia 的「現代單體式」架構下能發揮實力。編譯器導向的設計使 bundle 尺寸較小,而 Runes 語法讓反應式變得明確、易懂為其特色。
使用 Inertia × Svelte 可獲得結合 Laravel 後端簡潔性與 Svelte 精簡撰寫風格的開發體驗。使用入門套件建立專案時,包含認證畫面在內都能立即開始開發。
Inertia.js 官方文件
Inertia v3 完整功能請參考官方文件。