Svelte 5 教学指南

1. Svelte 概述与核心特点

1.1 什么是 Svelte?

Svelte 是一种构建用户界面的编译器。它在构建阶段将代码转化为高效的 JavaScript。

1.2 核心优势(Svelte 5 进化)

  • Signals 驱动:Svelte 5 引入了基于信号(Signals)的响应式系统,更新粒度精确到"点",不再需要全量对比。
  • 一致性 :通过 Runes(符文) ,在 .svelte 组件内和普通的 .js/.ts 文件中使用相同的响应式逻辑。
  • 极致轻量:由于不带运行时 VDOM,应用体积保持业内领先。

2. 环境搭建与项目初始化

2.1 创建项目 (SvelteKit)

目前官方强烈建议使用 SvelteKit 启动项目,因为它提供了成熟的路由和部署适配器。

Bash

复制代码
# 使用官方最新模板(默认支持 Svelte 5)
npx sv create my-app
cd my-app
npm install
npm run dev -- --open

3. 核心语法:从传统到 Runes

Svelte 5 引入了以 $ 开头的符文(Runes) ,取代了旧版的 let 赋值和 $: 语法。

3.1 状态声明:$state

不再仅仅是 let,使用 $state 声明的状态是深层响应式的。

Svelte

复制代码
<script>
  // 基础状态
  let count = $state(0);
  
  // 复杂对象的深层响应式
  let user = $state({ name: 'Alice', scores: [10, 20] });

  function update() {
    count++;
    user.scores.push(30); // 数组操作会自动触发 UI 更新!
  }
</script>

<button onclick={update}>计数:{count}</button>
<p>分数:{user.scores.join(', ')}</p>

3.2 派生状态与副作用:derived 与 effect

取代了旧版的 $: 语法,逻辑更清晰。

功能 Svelte 4 (旧) Svelte 5 (新 Runes)
派生计算 $: double = count * 2 let double = $derived(count * 2)
副作用 $: console.log(count) $effect(() => { console.log(count) })

4. 组件交互:更现代的通信

4.1 属性接收:$props

废弃了 export let,现在使用解构赋值,支持更好的 TypeScript 类型推断。

Svelte

复制代码
<script>
  // 接收参数,并设置默认值
  let { name = "游客", age, children } = $props();
</script>

<div>
  <h3>姓名:{name},年龄:{age}</h3>
  {@render children?.()}
</div>

4.2 双向绑定:$bindable

在 Svelte 5 中,如果你希望一个属性支持 bind:,必须显式声明。

Svelte

复制代码
<script>
  let { value = $bindable() } = $props();
</script>

<input bind:value={value} />

4.3 代码片段:Snippets

Snippets 是 Svelte 5 的重磅功能,它取代了复杂的 Slot 插槽,让 UI 块可以像变量一样传递和复用。

Svelte

复制代码
{#snippet header(title)}
  <header class="fancy-header">
    <h1>{title}</h1>
  </header>
{/snippet}

{@render header("欢迎来到我的应用")}

5. 事件处理:回归标准

Svelte 5 简化了事件语法,去掉了 on:click 这种指令,直接使用标准的 HTML 属性。

  • 原生事件<button onclick={handler}>(注意是小写且连写)。
  • 事件转发 :不再需要 createEventDispatcher。父组件传什么,子组件直接调用对应的 prop 函数即可。

6. 状态管理与调试

6.1 全局状态

由于 Runes 可以在 .js 文件中使用,你不再强依赖 writable store

JavaScript

复制代码
// state.svelte.js (注意后缀名)
export const globalStats = $state({
  theme: 'dark',
  toggle() { this.theme = this.theme === 'dark' ? 'light' : 'dark' }
});

6.2 调试符文:$inspect

在控制台实时追踪状态变化,比 console.log 更高效。

Svelte

复制代码
<script>
  let count = $state(0);
  $inspect(count); // 每当 count 变化,控制台都会自动打印
</script>

7. 部署与优化

7.1 构建命令

Bash

复制代码
npm run build

7.2 适配器 (Adapters)

SvelteKit 会根据你的环境自动选择适配器:

  • Vercel / Netlify:原生支持,直接推送到 Git 仓库即可。
  • adapter-static:适合生成纯静态页面(如个人博客)。
  • adapter-node:适合需要 Node.js 运行环境的后端集成。
相关推荐
belldeep5 天前
nodejs:Vite + Svelte + ts 入门示例
typescript·node.js·ts·vite·svelte
亮子AI2 个月前
【Svelte】本地正常,线上报错的奇怪问题
svelte
天天打码2 个月前
Svelte-无虚拟DOM、极致性能的现代高性能Web开发框架!
前端·node.js·vue·svelte
ayuday2 个月前
Svelte - 现代高性能Web开发框架!轻量级‌、响应式、编译时优化‌特点
nodejs·svelte
亮子AI2 个月前
【Svelte】怎样将 Docusaurus 网站部署到 Svelte 网站的子路径 /docs 下?
svelte·docusaurus
Robet3 个月前
static 和 lib/assets资源区别
前端·svelte
亮子AI3 个月前
【Svelte】怎样实现一个图片上传功能?
开发语言·前端·javascript·svelte
水冗水孚5 个月前
类比前端知识来学习Java的Spring Boot实现MySql的全栈CRUD功能——搭配Svelte+Vite
spring boot·svelte
冴羽5 个月前
看了下昨日泄露的苹果 App Store 源码……
前端·javascript·svelte