共计 3853 个字符,预计需要花费 10 分钟才能阅读完成。
近日尤大亲自创立了一个仓库用来对 Svelte 和 Vue3 组件进行了评测。这其实对我来说十分的感兴趣,因为我最近在业务我的项目中采纳了 Svelte 进行了开发。
那么到底后果到底是如何呢?(期待的眼神,认为尤大要写 Svelte 代码来进行评测了。
Vue 大家都很相熟了,如果你不晓得 Svelte 是啥?能够看后起之秀前端框架 Svelte 从入门到原理。
大体介绍一下,Svelte 是一个 No Runtime —— 无运行时代码 的框架。
上面是 Jacek Schae
大神的统计,应用市面上支流的框架,来编写同样的 Realword 利用的体积:
<img src=”https://s3.qiufengh.com/blog/image-20210711222239287.png” style=”width: 500px”>
上面就请看具体的钻研步骤,如果你对钻研步骤不感兴趣,能够间接跳到最初看论断。
钻研的步骤
为了公平性,尤大抉择了 todomvc
来进行构建比拟,而后列举了一系列的步骤计划。
这两个框架都实现了一个简略的符合规范、性能雷同的
todomvc
组件。- Vue: todomvc.vue(应用了
<script setup>
语法) - Svelte: todomvc.svelte (基于官网的实现, 为了偏心去除了 uuid 办法,害,悲观了,原来尤大么有亲自写组件)
- Vue: todomvc.vue(应用了
组件应用各自框架的在线 SFC 编译器进行独自编译
- Vue: sfc.vuejs.org @3.1.4 ->
todomvc.vue.js
- Svelte: svelte.dev/repl @3.38.3 ->
todomvc.svelte.js
- Vue: sfc.vuejs.org @3.1.4 ->
编译文件应用 Terser REPL 压缩,而后删除 ES imports 和 exports。这是因为在一个
bundle
的应用程序中,这些imports/exports
不须要或在多个组件之间共享。(能够了解为相似第三方代码,不会影响组件外部实现的大小)- Vue:
todomvc.vue.min.js
- Svelte:
todomvc.svelte.min.js
- Vue:
而后把文件应用
gzip
和brotli
(Brotli是一个开源数据压缩程序库,相似于gzip
)压缩- Vue:
todomvc.vue.min.js.gz
/todomvc.vue.min.js.brotli
- Svelte:
todomvc.svelte.min.js.gz
/todomvc.svelte.min.js.brotli
- Vue:
另外,在 SSR 的环境下,Svelte 须要在 “hydratable” 模式下编译其组件,这会引入额定的代码生成。在编译 Svelte 的时候应用选项
hydratable: true
来开启 SSR 并反复 2-4 的步骤。Vue 在 SSR 环境下生成的代码是完全相同的,然而引入了一些额定的
hydration-specific
运行时代码(~0.89kb min + brotli).- 对于每个框架,默认应用
Vite
来创立和打包构建(Svelte 应用hyderable: false
)。每个应用程序同时设置 SSR 的模式再构建一次。
默认 Vite
打包产生一个 vendor chunk(= 框架运行时代码)和一个 index chunk(= 组件代码)。
Vue | Vue (SSR) | Svelte | Svelte (SSR) | |
---|---|---|---|---|
Source | 3.93kb | – | 3.31kb | – |
Compiled w/o imports (min) | 2.73kb | – | 5.01kb (183.52%) | 6.59kb (241.39%) |
Compiled w/o imports (min+gz) | 1.25kb | – | 2.13kb (170.40%) | 2.68kb (214.40%) |
Compiled w/o imports (min+brotli) | 1.10kb | – | 1.88kb (170.91%) | 2.33kb (211.82%) |
Vite component chunk (min+brotli) | 1.13kb | – | 1.95kb (172.26%) | 2.41kb (213.27%) |
Vite vendor chunk (min+brotli) | 16.89kb | 17.78kb | 1.85kb | 2.13kb |
留神:w/o 的意思为 without,” 去除 ” 的意思
<img src=”https://github.com/yyx990803/vue-svelte-size-analysis/raw/master/chart.png” width=”600px”>
剖析
在客户端模式下,从 Vite vendor chunk (min+brotli) 这一栏剖析。Svelte App 导入 1.85kb min+brotli 框架代码,比 Vue 轻 15.04kb。这仿佛看起来十分的强悍,然而这是因为框架运行时的差别。(Svelte 没有运行时,Vue 有运行时)
再来看看组件代码,Svelte 的 min + compressed 输入大小是 Vue 的~1.7 倍。在这种状况下,单个组件会导致 0.78kb 的大小差别。在 SSR 的状况下,这一比例进一步回升到~2.1 倍,其中单个组分导致 1.23kb 大小的差别。
Todomvc
十分具备代表性,代表大多数用户在利用场景中构建应用的组件。咱们能够正当地假如在事实场景中会发现相似的大小差别。也就是说,在实践上,如果一个应用程序蕴含超过 15.04 / 0.78〜= 19 个 Todomvc 大小的组件,则 Svelte 应用程序将最终比 Vue 应用程序体积更大。
在 SSR 场景中,这个阈值会更低。在 SSR 模式下,尽管框架差别为 15.65KB,然而 Compnent Count 阈值降落到 15.65 / 1.23〜= 13!
显然在真实世界应用程序中,有许多其余因素:将从框架中导入更多功能,并将应用第三方库。大小曲线将受到我的项目中纯组件代码的百分比的影响。然而,激进预计 利用 APP
如果比 19 个组件 这个阈值(或者在 SSR 模式下的 13 个)越大,Svelte 的体积劣势就越少。
论断
在仓库的 README
中尤大给出了两个论断,我就给它移到了最初。
- Svelte 单组件在一般模式下比 Vue3 单组件约大 70%,在 SSR 模式下大 110%(公众号作者秋风注:其实这里尤大说的有点问题,这个 70% 指的是以后
todomvc
组件的大小比照,并不代表着所有 Svelte 组件 比 vue 3 组件 大 70%,换句话说如果一个 100k 大小的 Vue 组件,Svelte 组件可能就只有 101k,而不是 170k !) - 对于我的项目来说,当编写的组件大于 19 个组件(SSR 模式为 13 个组件)Svelte 的劣势与 Vue3 相比就不存在了。
总的来说
本钻研并的目标不是来说哪种框架更好 —— 它关注的是剖析不同框架的策略对体积大小的影响。
从数据中能够看出,两个框架在 bundle 大小方面具备不同的劣势 —— 取决于您的应用状况。Svelte 依然很棒,实用于一次性组件(例如,作为自定义元素包装),但它在大规模 APP 中在体积大小方面实际上是它的毛病,特地是 SSR。
在更宽泛的意义上,本钻研旨在展现框架如何在 compile-time 编译时
和 runtime spectrum 运行时
找到一个平衡点:Vue 在源码上应用了肯定的 compile-time 编译时
优化,但抉择较重的 compile-time
返回较小的生成代码。Svelte 抉择最小的运行时,但具备较重生成的代码的老本。Svelte 能够进一步改良其代码生成来升高代码输入吗?Vue 能够进一步改善tree-shaking
,使基线(运行时框架) 变小吗?另外一点框架能够找到更好的平衡点吗?对以上所有的问题的答案答复可能是必定的 —— 但当初咱们须要明确的是 ” 框架大小 ” 是比单单比拟 Hello World 应用程序的大小的更加粗疏的话题,这项钻研就是为了证实这一点。
集体意见
以下为公众号作者的集体意见,并非尤大调研中的观点。
其实尤大总体来说就是想要凸显出在框架的比照中,单单应用 Jacek Schae
大神 统计的 那个 RealWord 应用程序来说是有些不偏心的,应该须要更加粗疏的比照。其实对于 Svelte 这个包大小这个问题,其实很早之前在 Svelte Github 中也对 React 和 Svelte 进行了宽泛的探讨。
Svelte 的确有一个阈值会使得它在肯定水平后让体积大小没有了劣势,然而在个别状况下,只有不是特地简单的中后盾治理利用,Svelte 该当会比其余框架体积小。
特地是在一些 H5 游戏中,如果你想要取得 React/Vue 数据驱动的形式编写利用,然而你又不想要引入他们这么大的运行时,的确来说是一个十分不错的计划。最近在开发一个基于 Three.js 的挪动端网页,有一个初步的预计大概比应用 React 缩小 30 – 50% 的体积,具体的数值因为还没迁徙完无奈给出残缺的数据。还有一点,非运行时的框架,对于首屏的渲染也是有一个极大的帮忙,你能够将首屏组件进行拆分,非运行时的首屏组件其实是十分小的,这对挪动端来说十分的敌对,因为毕竟应用 SSR 对应服务端还是有肯定的压力要求的。
以上为集体看完尤大的剖析比拟后的一点愚见~ 如果不足之处请多多指出。
调研原文
https://github.com/yyx990803/…
回看笔者往期高赞文章,兴许能播种更多喔!
- 2021 前端学习门路书单—自我成长之路:
570+
点赞量 - 从破解某设计网站谈前端水印 (具体教程):
790+
点赞量 - 一文带你层层解锁「文件下载」的神秘:
140+
点赞量 - 10 种跨域解决方案(附终极大招):
940+
点赞量
结语
❤️关注 + 点赞 + 珍藏 + 评论 + 转发❤️ ,原创不易,激励笔者创作更好的文章
关注公众号 秋风的笔记
,一个专一于前端面试、工程化、开源的前端公众号