Skip to content

Svelte

Svelte 与 SvelteKit 技术栈全景 —— 编译时框架的极简哲学,从 Runes 响应式到全栈应用构建

Svelte 的核心理念是将框架的工作从运行时移至编译时 —— 没有虚拟 DOM、没有运行时 diff、没有 Proxy 劫持,编译器直接生成精确的 DOM 更新代码。本专题梳理 Svelte 5 的 Runes 响应式、SvelteKit 全栈框架及生态选型。

Svelte 核心理念

Svelte vs 传统框架

维度React / VueSvelte
工作时机运行时(浏览器中执行框架代码)编译时(构建阶段将组件编译为原生 JS)
虚拟 DOM有(运行时 diff + patch)无(编译器直接生成精确 DOM 操作)
运行时体积框架本身需要加载(React ~40KB+)仅生成应用本身的代码,框架几乎零运行时
响应式Hooks / Proxy 劫持编译时信号追踪(Svelte 5 Runes)
心智模型声明式 UI = f(state)声明式 + 近似原生写法,直觉式
更新粒度组件级(需手动 memo 优化)编译器精确追踪变量级依赖,自动优化

Svelte 5 — Runes 响应式

Svelte 5 引入 Runes,统一了响应式原语。Runes 是以 $ 为前缀的特殊函数,编译器识别后自动处理依赖追踪和更新触发。

核心 runes

svelte
<script>
  // $state — 声明响应式状态
  let count = $state(0);

  // $derived — 派生计算值(自动追踪依赖)
  let doubled = $derived(count * 2);

  // $effect — 副作用(自动追踪依赖,依赖变化时重新执行)
  $effect(() => {
    console.log(`count is ${count}`);
  });

  // $bindable — 组件可双向绑定的 prop
  let { value = $bindable() } = $props();

  // $props — 声明组件 props
  let { name, age } = $props();

  // $inspect — 调试(开发时打印响应式值)
  $inspect(count);
</script>

Runes 与 React Hooks 对比

RunesReact Hooks差异
$state()useState()Runes 可在组件外使用;自动深度响应
$derived()useMemo()无需手动声明依赖数组,编译器自动追踪
$effect()useEffect()无需依赖数组;仅在依赖变化时执行
$props()函数参数Runes 可声明默认值和绑定能力
$bindable()回调 props原生双向绑定支持

Info

Runes 的核心优势:无需手动声明依赖。编译器在构建时分析代码,自动追踪所有响应式依赖,既避免了 React useEffect 依赖数组的常见陷阱,又获得了比 Vue Proxy 更精确的更新粒度。

SvelteKit — 全栈框架

SvelteKit 是 Svelte 官方全栈框架,类比 Next.js 之于 React、Nuxt 之于 Vue。

bash
npx sv create

核心特性

特性说明
文件路由src/routes/ 目录自动生成路由
渲染模式SSR(默认)、SSG、SPA、Prerendering
Server Load Functions+page.server.ts 在服务端加载数据
Server Actions+page.server.ts 中的 form actions 处理数据变更
Layout 系统+layout.svelte / +layout.ts 共享布局和数据
API Routes+server.ts 定义 REST/GraphQL API
Adapter适配多种部署目标(Node、Vercel、Cloudflare、Netlify、静态导出)

路由示例

src/routes/
├── +layout.svelte       # 根布局
├── +page.svelte         # 首页 /
├── about/
│   └── +page.svelte     # /about
├── blog/
│   ├── +page.svelte     # /blog
│   ├── +page.ts         # 通用数据加载
│   ├── +page.server.ts  # 服务端数据加载
│   └── [slug]/
│       └── +page.svelte # /blog/:slug
└── api/
    └── +server.ts       # API 路由

数据加载

ts
// +page.server.ts — 服务端加载
export async function load({ params, fetch }) {
  const post = await fetch(`/api/posts/${params.slug}`);
  return { post: await post.json() };
}
svelte
<!-- +page.svelte — 使用数据 -->
<script>
  let { data } = $props();
</script>

<h1>{data.post.title}</h1>

生态工具链

UI 组件库

特点
shadcn-svelteshadcn/ui 的 Svelte 版本,Tailwind + Bits UI 底层
SkeletonSvelte 生态最活跃的 UI 库,Tailwind 驱动
Bits UI无样式基元组件(Headless),可访问性内置
daisyUITailwind 组件库,支持 Svelte

样式方案

方案特点
Tailwind CSSSvelte 生态主流原子化方案
UnoCSS更快的原子化引擎,完全可定制
Scoped StylesSFC 内置 <style> 自动局部作用域

状态管理

方案特点
Runes($state / $derived)Svelte 5 内置,大多数场景已足够
Svelte StoresSvelte 4 遗留方案,Svelte 5 仍兼容
nanostores极简响应式 store,框架无关

数据获取

方案特点
SvelteKit Load Functions服务端/通用数据加载,内置方案
TanStack Query (Svelte)客户端服务端状态管理,缓存/重试/乐观更新

测试

工具特点
VitestVite 生态测试框架,SvelteKit 内置支持
Playwright端到端测试
Testing Library (Svelte)组件测试,以用户视角测试

动画

特点
Svelte Transitions内置 transition: 指令,声明式过渡动画
Svelte Motion内置 tweened / spring 响应式动画
Motion One轻量动画库,Svelte 适配

跨平台

方案特点
Svelte NativeSvelte + React Native 渲染器,社区维护
Capacitor + SvelteKitWeb 方式构建移动应用
Tauri + SvelteKitRust 驱动的桌面应用

技术选型速查

项目类型推荐组合
全栈 Web 应用SvelteKit + Tailwind CSS + Runes
静态博客/文档SvelteKit (Prerender) + MDSveX
SPA 应用SvelteKit (SPA mode) + shadcn-svelte
桌面应用SvelteKit + Tauri
轻量交互组件Svelte (Library mode)

Svelte 适用场景

适合不太适合
中小型 Web 应用超大型企业级应用(生态规模有限)
性能敏感场景(首屏加载、低功耗设备)依赖大量 React/Vue 专有库的场景
追求极简开发体验的团队团队缺乏 Svelte 经验且招聘困难
静态站点、文档站需要深度原生集成的移动应用
嵌入式 Web 组件(Web Components)需要成熟微前端方案的团队

警告

Svelte 的生态成熟度仍不如 React/Vue。在选型前,务必确认所需的 UI 库、工具链是否有 Svelte 版本或替代方案。Svelte 5 的 Runes 仍处于快速演进期,API 可能存在变动。