























对于国内前端开发者来说,前端框架首选无疑是React和Vue、退而其次是Angular。从本章开始,笔者将和大家一起了解一个不同于React和Vue等以虚拟DOM为核心的框架,它在国外的关注程度一度超过了前端框架的龙头React,这个框架就是——Svelte。

Svelte在英文中具有“苗条的,身材修长的”意思,对于刚接触的开发者来说,非常容易与Java的Servlet搞混。Servlet是运行在Web服务器中的小型Java程序,其是JavaWeb的三大组件之一,而Svelte则是一个前端UI框架,更准确地说,Svelte是一个编译器。
正如我们提到React会想到Dan Abramov,提到Vue会想到Evan You,那Svelte的创建者Rich Harris,在前端业界也享誉盛名。也许有些开发者不了解Rich Harris是何人,那和webpack齐名的打包工具Rollup便是出自此人之手。除了Rollup之外,Rich Harris还开发了Reactive、Svelte等诸多流行的开源作品,积极地投身于开源当中。 Svelte是Rich Harris在《卫报》工作时的成果。Rich Harris曾担任《卫报》美国版的互动编辑。在加入卫报英国互动团队担任前端开发人员之前,他曾在 Citywire 担任财经记者、视频记者和网络制作人。

Svelte的前身是发布于2013年的Ractive.js,后者几乎与React同时问世。Reactive.js的灵感来自于 Knockout 和 Angular 以及当时其他一些东西的混搭。经过几年的实践,Rich Harris觉得Reactive.js并不是真正适合移动互联网时代的框架,于是在BrooklynJS聚会上和友人提出了自己的框架新想法——写一个编译器。
Svelte的第一个版本,基本上就是多了一个编译器的Reactive。因为当时《卫报》的同事在使用Reactive,且拥有一个现成的Reactive社区,为了能够更好地推广Svelte,Svelte第一版继承了Reactive的许多相同设计,让使用过Reactive的开发者能够快速上手Svelte。Svelte 这个名字是由Rich Harris和他在《卫报》的同事们选择的。随着时间的推移,越来越多的开发者开始了解Svelte,并对其产生了兴趣。
之后,Svelte开发团队意识到 Ractive 的一些设计决策是错误的,因此 Svelte 2 实际上只有一些小小的改进。例如,在模板语法中不再使用双花括号,而是使用单花括号,因此这更像是 JSX,并且还进行了一些其他类似的修饰性更改。但除此之外,它与 Svelte 1 几乎相同。
第三版是一次重大修改,Svelte开发团队开始重新思考现代 UI 框架的核心概念:反应性。到2019年,Svelte已经成为一个成熟的工具,可以构建具有TypeScript支持的开箱即用的Web应用程序。
经过4年的时间,Svelte4在2023年成功发布。Svelte4作为一个过渡版本,可以比作是React16 到18之间React 17版本,为下一代 Svelte(即 Svelte 5)的发布奠定了基础。
凡是都有双面性,当我们要学习一个新事物时,需要斟酌思考这件事物值不值得我们学习,了解其在当前的优劣两面,是一个很好的切入点,针对框架亦是如此。
通过benchmark上的性能对比,我们可以看到Svelte除了稍逊于Solid外,整体的表现优于React、Vue和Angular等前端框架。

再看一下Jacek Schae在2020年对各框架的RealWorld的Lighthouse跑分。

Rich Harris 的virtual-dom-is-pure-overhead一文中,指出虚拟DOM并非免费的午餐,它也会带来性能和内存上的消耗。对于一个React组件来说,要把 props的值进行修改,需要分为三步:
Svelte则是省去前面两步,直接更新DOM。Svelte是一个编译器,不使用虚拟DOM。Svelte.js 在构建时编译组件,从而产生高度优化的轻量级 JavaScript 代码。与其他在运行时依赖虚拟 DOM的框架不同,Svelte.js 完全消除了对虚拟 DOM 的需求,从而实现更快的加载时间、更流畅的动画并提高 Web 应用程序的整体性能。这是Svelte相对于其他任何Web框架的一个非常重要的优势。
同样是Jacek Schae的框架体积分析。Svelte在这块内容中遥遥领先。

对于由使用框架后生成的代码行数中,Svelte同样拥有不俗的表现。虽然使用Svelte来编写的业务代码在编译后会产生较多的代码,但得益于较少的运行时代码,对于一般的中小型项目来说,整体的代码体积仍是比较小的。

在npmtrends中显示的size,2.7KB同样遥遥领先。

与React、Vue、Angular等框架不同,Svelte不需要在代码运行时引入运行时代码。整个框架在构建过程中被编译掉,留下优化的 JavaScript 代码,直接与浏览器的本机 API 交互。这也是Svelte拥有更小的包体积、消耗更少内存而拥有更好性能的原因之一。
在代码体积的优势宣传中,Evan You曾提出一种质疑,为此还专门写了一个项目来对比Svelte和Vue。

从文章中的结果我们可以得出以下结论:
因此我们可以得出一个观点,虽说svelte项目的代码较小。但对于大型项目而言,随着业务的推进,业务复杂程度逐渐提升,项目文件大小逐渐增多,编译后的代码量陡增,使用Svelte的大型项目体积并不会比React、Vue等小,因此我们需要辩证看待体积优势问题。
Svelte语法简单,上手容易,学习曲线小。任何学过html,css和javascript的开发者都能上手。Svelte允许使用者使用足够少的代码来完成功能运行,比如一段最简单的代码:
<script>
let count = 0;
</script>
<button on:click={() => count++}>add</button>Svelte帮助开发者以最小的代价构建用户界面,通过实现更好的反应性、绑定和顶层元素等,提高了代码的可读性,降低了开发者的心智负担和上手难度。
Svelte的以上特性让其在国外前端圈大放异彩。
首先是在Github上,达到了75k以上的Star。

在risingstars的2023年报告上。可以看到Svelte在Github上星数上涨在前端框架中排名第三。

在stateofjs的2022年度报告中(笔者在写文章时2023年报告结果暂时未出),Svelte的关注度和满意度都名列前茅。


满意度
在2016年才发布的Svelte,生态明显还达不到React和Vue的丰富程度。
编译后的代码逻辑冗余。也许有读者会担心,如果业务逻辑复杂,导致编译之后的代码文件大小直线上升,是否会在一定程度上导致性能下降?Github上有相关开发人员对于这个问题进行了分析svelte-it-will-scale:

文章中指出,拐点约为 120KB 的组件源代码。即是说,在大约 120KB 时,使用编译器相对于运行时的大小优势已经消失了。但实际上,只要合理地使用代码分割,单文件出现120KB的情况是不太可能的。
因为Svelte不使用虚拟DOM,自然享受不到虚拟DOM带来的诸多好处,比如基于虚拟DOM来抽象各端渲染能力,基于vdom来完成测试等功能。
看一下三大框架在过去一年的下载量。

虽然Svelte在国外已经风靡数时,但其下载量目前仍然无法和Vue相比,对比第一梯队的React,更是难以望其项背。同样在国内的推广程度仍不够高。
为什么我要学习Svelte?这里笔者简单的给出几点理由:
本章我们学习了:
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。