Svelte简介 #

一、什么是Svelte #

Svelte 是一种构建用户界面的编译时框架。与 React、Vue 等传统框架不同,Svelte 在构建时将组件编译为高效的命令式 JavaScript 代码,而不是在浏览器中运行时解释代码。

1.1 核心定位 #

text
Svelte = 编译时框架 + 原生DOM操作

Svelte 的核心思想:

  • 编译时:在构建阶段完成框架工作,生成原生代码
  • 无虚拟DOM:直接操作真实 DOM,减少开销
  • 响应式:内置响应式系统,无需额外 API
  • 极小体积:运行时代码极小,性能卓越

1.2 核心特点 #

特点 说明
编译时框架 构建时转换,无运行时开销
无虚拟DOM 直接操作 DOM,更高效
真正的响应式 自动追踪依赖,无需手动管理
极小体积 编译后代码量极小
学习曲线低 语法简洁,接近原生开发
单文件组件 HTML、CSS、JS 封装在一个文件

二、编译时原理 #

2.1 传统框架 vs Svelte #

text
┌─────────────────────────────────────────────────────────────┐
│                    传统框架(React/Vue)                      │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   开发时              构建时              运行时             │
│   ┌─────┐            ┌─────┐            ┌─────┐            │
│   │组件 │ ─────────→ │打包 │ ─────────→ │框架 │            │
│   └─────┘            └─────┘            │运行时│            │
│                                         │虚拟DOM│           │
│                                         │Diff  │            │
│                                         └─────┘            │
│                                         (浏览器执行)         │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│                         Svelte                               │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   开发时              编译时              运行时             │
│   ┌─────┐            ┌─────┐            ┌─────┐            │
│   │组件 │ ─────────→ │编译 │ ─────────→ │原生 │            │
│   └─────┘            │优化 │            │JS   │            │
│                      └─────┘            └─────┘            │
│                      (构建时完成)         (浏览器执行)        │
└─────────────────────────────────────────────────────────────┘

2.2 编译过程示例 #

Svelte 组件源码:

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

<button on:click={increment}>
  Clicked {count} times
</button>

编译后的 JavaScript(简化版):

javascript
function create_fragment(ctx) {
  let button;
  let t0;
  let t1_value = ctx[0] + "";
  let t1;
  let mounted;
  let dispose;

  return {
    c() {
      button = element("button");
      t0 = text("Clicked ");
      t1 = text(t1_value);
      t2 = text(" times");
    },
    m(target, anchor) {
      insert(target, button, anchor);
      append(button, t0);
      append(button, t1);
      append(button, t2);
      
      if (!mounted) {
        dispose = listen(button, "click", increment);
        mounted = true;
      }
    },
    p(ctx, [dirty]) {
      if (dirty & 1 && t1_value !== (t1_value = ctx[0] + "")) {
        set_data(t1, t1_value);
      }
    }
  };
}

三、Svelte 5 新特性:Runes #

3.1 什么是 Runes #

Svelte 5 引入了 Runes(符文),这是一种全新的响应式语法,使用 $ 前缀的函数来声明响应式状态。

svelte
<script>
  let count = $state(0);
  let doubled = $derived(count * 2);
  
  function increment() {
    count += 1;
  }
</script>

<button onclick={increment}>
  Count: {count}, Doubled: {doubled}
</button>

3.2 核心 Runes #

Rune 用途
$state 声明响应式状态
$derived 声明派生状态
$effect 声明副作用
$props 声明组件属性
$bindable 声明可双向绑定的属性

3.3 Runes 示例 #

svelte
<script>
  let { name = 'World' } = $props();
  
  let count = $state(0);
  let doubled = $derived(count * 2);
  
  $effect(() => {
    console.log(`Count changed to ${count}`);
  });
</script>

<h1>Hello {name}!</h1>
<p>Count: {count}</p>
<p>Doubled: {doubled}</p>
<button onclick={() => count++}>Increment</button>

四、与传统框架对比 #

4.1 Svelte vs React #

方面 Svelte React
运行方式 编译时 运行时
虚拟DOM
包体积 ~2KB ~42KB
响应式 内置 需要useState等
学习曲线 简单 中等
生态成熟度 发展中 成熟

4.2 Svelte vs Vue #

方面 Svelte Vue
模板语法 类HTML HTML模板
响应式 编译时追踪 Proxy代理
包体积 ~2KB ~33KB
状态管理 内置Store Pinia/Vuex
单文件组件 .svelte .vue
构建工具 Vite/Rollup Vite/Webpack

4.3 性能对比 #

text
基准测试(越小越好)

JS Bundle Size (gzip)
├── Svelte:     1.6KB  ████
├── Vue 3:      33KB   ████████████████████████████████████████
└── React:      42KB   ████████████████████████████████████████████████████

Lighthouse Performance Score
├── Svelte:     98分   ████████████████████████████████████████████████████
├── Vue 3:      92分   █████████████████████████████████████████████████
└── React:      89分   ███████████████████████████████████████████████

五、应用场景 #

5.1 适合场景 #

text
✅ 推荐使用 Svelte
├── 中小型Web应用
├── 嵌入式组件(如小部件)
├── 性能敏感项目
├── 快速原型开发
├── 渐进式增强
└── 学习成本敏感项目

5.2 SvelteKit 全栈应用 #

SvelteKit 是 Svelte 的官方全栈框架:

text
SvelteKit 特性
├── 文件系统路由
├── 服务端渲染(SSR)
├── 静态站点生成(SSG)
├── API 路由
├── TypeScript 支持
└── 零配置部署

5.3 实际案例 #

text
知名使用案例
├── Apple 部分页面
├── The New York Times
├── Spotify 部分功能
├── Razorpay
└── 1Password

六、技术栈概览 #

6.1 核心技术栈 #

text
┌──────────────────────────────────────┐
│            Svelte 5                  │
├──────────────────────────────────────┤
│  SvelteKit     │    Svelte Store    │
│  (全栈框架)    │    (状态管理)       │
├──────────────────────────────────────┤
│  Vite          │    Playwright      │
│  (构建工具)    │    (测试框架)       │
└──────────────────────────────────────┘

6.2 开发工具 #

  • VS Code 插件:Svelte for VS Code
  • 浏览器扩展:Svelte DevTools
  • 构建工具:Vite(推荐)
  • 测试工具:Vitest + Playwright

七、学习路线 #

text
基础阶段
├── Svelte组件结构
├── 响应式声明
├── 模板语法
└── 事件处理

进阶阶段
├── 组件通信
├── Store状态管理
├── 动画与过渡
└── 插槽

高级阶段
├── SvelteKit
├── 服务端渲染
├── TypeScript集成
└── 性能优化

八、总结 #

Svelte 的核心优势:

  • 编译时优化:无运行时开销,性能卓越
  • 极小体积:编译后代码量极小
  • 简洁语法:学习曲线平缓
  • 真正响应式:自动依赖追踪
  • 开发体验:单文件组件,样式封装

选择 Svelte 的理由:

  • 追求极致性能和包体积
  • 希望快速学习和开发
  • 构建中小型应用
  • 对编译时优化感兴趣
  • 喜欢简洁的代码风格
最后更新:2026-03-28