📌 项目地址sveltejs/svelte | ⭐ 86,863 颗星 | 🔧 JavaScript | 📜 未标注

什么是Svelte

Svelte 在 GitHub 上有 86,863 颗星,描述只有一句话:“a new way to build web applications”。它不是又一个运行时框架——它是一个编译器。你写 .svelte 组件,它输出可以直接操作 DOM 的 JavaScript,不附带任何框架代码。

这个设计来自 README 的明确表述:“It’s a compiler that takes your declarative components and converts them into efficient JavaScript that surgically updates the DOM.” 手术刀式的精准更新,不是靠虚拟 DOM 的 diff,而是编译阶段就确定好每个状态变化要改哪个 DOM 节点。

以计数器为例,Svelte 编译后大约生成 200 到 300 字节的纯 JS,而 React 最小运行时加上虚拟 DOM 逻辑大约 40KB 起步。这 40KB 不是代码臃肿的问题,而是每个用户第一次打开页面都要下载、解析、执行的额外开销。对于首屏加载,Svelte 有天然优势。

编译时 vs 运行时:关键差异

React 和 Vue 把“状态到 UI 的映射”放在浏览器里做——写 JSX 或模板,运行时有虚拟 DOM 比较新旧差异,然后 patch 真实 DOM。这个过程每个状态变化都会跑一遍。

Svelte 反过来:你把组件当作声明式写法传给编译器,编译器分析依赖关系,生成针对该组件的更新函数。比如 count 变化时直接执行 textContent = count,没有中间层。这意味着:

  • 打包后的 JS 几乎不含框架代码,只有业务逻辑和编译器生成的更新函数。
  • 内存占用更低,不需要维护虚拟 DOM 树。
  • 没有运行时 hook 的限制,变量本身是响应式的,不需要 useStateref

编译时 vs 运行时不是谁更好的问题,是权衡。Svelte 把复杂度放在构建时(单次),运行时只做最少的事。如果你追求极致性能或包体积很小(比如用在嵌入设备、广告页、移动端 WebView),这种设计很适合。

实际怎么用

README 没有列出具体命令,只给了官网链接。根据官网指引(这也是 README 推荐的唯一学习路径),创建项目可以用:

npx sv create my-app
cd my-app
npm install
npm run dev

sv 是官方脚手架,会生成包含 src/ 的 Vite + Svelte 项目。组件写法没有魔法:

<script>
  let count = 0;
</script>

<button on:click={() => count++}> clicked {count} </button>

<style> button { font-size: 2em; } </style>

就这样。let count 是响应式的,on:click 绑定事件,<style> 自动作用域到这个组件。没有 hook、没有依赖数组、没有 useEffect

注意:这个例子来自官方教程,不是 README。但 README 指明了官网是权威来源,所以这些用法是真实的 Svelte 语法。你自己试一下就能感受到写起来很直接。

社区、许可证与坑

Svelte 是 MIT 协议(README 明确提到 MIT),你可以商用、修改、分发,没有附加条件。

项目由志愿者维护,资金来自 Open Collective 的赞助者(README 说“made possible entirely by fantastic volunteers”)。如果你希望支持,可以去 opencollective.com/svelte,资金用于托管费用和开发者支出。

一些实际遇到的问题:

  • .dev 域名可能打不开:README 特别指出,如果你无法访问任何 .dev 网站(不是特指 svelte.dev),通常是本地 DNS 问题,参考 SuperUser 上的解答。我遇到过,改一下 DNS 就好。
  • 学习曲线:Svelte 语法很直观,但如果你习惯了 React 的“函数式不可变”思维,需要适应“赋值即更新”方式。官方教程非常完善,花三四天基本能上手。
  • 生态:SvelteKit 是官方全栈框架,支持 SSR、静态生成等,状态管理用内置的 stores。第三方组件库不如 React 丰富,但常用功能(路由、表单、图表)都有成熟选择。对于中大型项目,生态不是问题。

最后两点

Svelte 不是银弹。编译时模式意味着动态逻辑(比如根据 API 返回的组件类型动态渲染)没有运行时那么灵活,需要额外处理。而且如果你想用第三方 React 组件库,必须找对应的 Svelte 版本或自己封装。

但如果你受够了运行时框架的抽象和包体积,Svelte 提供了一个非常干净的替代方案。它用 86k star 证明了自己不是小众玩具。试试跑一个计数器,看看编译产物,你会明白它这个“编译器”头衔有多实在。

这篇文章对你有帮助吗?

发表回复