Flutter Web与HTML、CSS和JS:性能比较

1,257 阅读8分钟

哪一个更快?是Flutter web还是使用HTMLCSSJS的标准网络技术?

为了找出答案,我在本网站的主页上创建了一个 Flutter web 克隆,并进行了一些性能基准测试来比较两者。

在这里,我将分享我通过使用PageSpeed InsightsWebPageTest.org测试两个版本所收集的所有数据。

而且我还会对Flutter网站的感觉进行评论。

  • 它慢吗?
  • 滚动是否流畅或不流畅?

首先,我将揭示PageSpeed Insights和WebPageTest.org的所有数字。

然后,我将列出我的网站和Flutter网页克隆之间的差异,并将这些数字纳入视野。

本基准使用的Flutter网页构建是在2.5.3稳定版上编译的。我收集了HTMLCanvasKit渲染器的测试结果。参见。网络渲染器|选择使用哪种选项

性能比较

为了比较这两个网站,我同时使用了WebPageTest.orgPageSpeed Insights(它基于Chrome Lighthouse)。

这两个网站都可以分析任何给定的网站URL,并产生一个包含大量有趣数据的报告。

默认情况下,这两个网站都会运行3次测试,并在最后报告平均结果。此外。

  • WebPageTest提供高级设置,如连接速度屏幕尺寸(桌面和移动),以及更多。
  • PageSpeed Insights也可以同时模拟移动和桌面,但可定制性较差。

以下是这些网站使用PageSpeed Insights的表现

PageSpeed Insights - 移动测试

移动基准测试比较慢,因为它们是用缓慢的4G连接来模拟的。PageSpeed Insights使用了这些参数。

  • 连接。150毫秒的TCP RTT,1,638.4 Kbps的吞吐量(模拟的)
  • 设备。仿真的Moto G4,使用Lighthouse 9.0.0,CPU节流。4倍慢速

以下是结果:

codewithandrea.com

PageSpeed Insights报告(codewithandrea.com,移动)。

Flutter web - CanvasKit 渲染器

PageSpeed Insights 报告 (Flutter web - CanvasKit 渲染器,移动)

Flutter web - HTML 渲染器

PageSpeed Insights 报告 (Flutter web - HTML 渲染器, 移动)


PageSpeed Insights - 桌面测试

桌面基准测试更快,因为它们模拟了更快的连接。PageSpeed Insights 使用了这些参数。

  • 连接。40 ms TCP RTT, 10,240 Kbps 吞吐量 (模拟)
  • 设备。使用Lighthouse 9.0.0的模拟桌面,CPU节流。1倍慢速

以下是结果:

codewithandrea.com

PageSpeed Insights 报告(codewithandrea.com,桌面)。

Flutter web - CanvasKit 渲染器

PageSpeed Insights 报告 (Flutter web - CanvasKit 渲染器,桌面)

Flutter web - HTML 渲染器

页速洞察报告(Flutter web - HTML 渲染器,桌面版)

PageSpeed Insights 分析

以下是所有测试的性能得分总结。

  • 主网站。移动端为 93分,桌面端为 97 分
  • 带有 CanvasKit 渲染器的 Flutter 网页:在移动端和桌面端出现错误
  • 使用 HTML 渲染器的 Flutter 网络:在移动端上为 25,在桌面上为 55

最值得注意的是,Flutter web上的速度指数交互时间总阻塞时间远远高于主站点。


WebPage测试

让我们转到WebPageTest,看看我们在那里得到了什么数据。

这个基准测试是在默认设置下运行的。

  • 连接:电缆,5/1 Mbps,28ms RTT
  • 设备:桌面,1366x768分辨率
  • 测试地点。弗吉尼亚州,EC2
  • 浏览器。浏览器:Chrome

如果你想的话,可以用不同的设置来运行这个。

codewithandrea.com

WebPageTest报告 (codewithandrea.com)

相关指标(越低越好)。

  • 第一个字节:0.387秒
  • 开始渲染。0.800s
  • 第一次内容绘画:0.770s
  • 速度指数。0.816s
  • 最大的内容绘制:0.769s
  • 累计布局转移:0.004s
  • 总阻塞时间: > 0.0s
  • 完全加载时间:1.520s
  • 字节数323 KB
  • 成本:美元

Flutter web - CanvasKit 渲染器

WebPageTest 报告 (Flutter web - CanvasKit Renderer)

相关指标(越低越好)。

  • 第一个字节:0.337s
  • 开始渲染。13.000s
  • 第一次内容绘制:12.906s
  • 速度指数。13.005s
  • 最大的内容绘制:未报告 - 错误
  • 累计布局转移: 0.0s
  • 总阻塞时间: > 0.105s
  • 完全加载时间:14.554s
  • 字节数4.425 KB
  • 成本:$$$$

WebPageTest (Flutter web - HTML Renderer)

WebPageTest 报告 (Flutter web - HTML Renderer)

相关指标(越低越好)。

  • 第一个字节:0.292s
  • 开始渲染。6.600s
  • 第一次内容绘制:6.561s
  • 速度指数。6.616s
  • 最大的内容绘制:7.279秒
  • 累计布局转移:0.001s
  • 总阻塞时间: > 0.421s
  • 完全加载时间:10.422s
  • 字节数。531 KB
  • 成本:$$$

WebPageTest 分析

一个非常重要的数据点是**"字节数"**:它告诉我们为特定页面下载了多少数据。

这表明,使用 CanvasKit 渲染器编译的Flutter 应用程序比主网站重了近 14 倍

不足为奇的是,其他重要的指标,如First Contentful PaintSpeed IndexFully Loaded,对于Flutter版本来说都慢了10倍到15倍

一句话:Flutter网页版下载的数据比主网站多10倍,加载速度比主网站慢10倍

另一方面,用HTML渲染器编译的Flutter应用程序在大小上与主网站相当(531KB对323KB)。而速度指数和其他指标是CanvasKit构建的两倍,约为6.6秒。

但这些性能指标如何转化为网站的 "外观和感觉"?

Flutter网页:外观和感觉

为了找出答案,我在我的英特尔27 "iMac和我的iPhone XR上测试了Flutter web克隆版。

在这两种情况下,第一页的加载需要很长的时间(尤其是在4G上),但在随后的页面重新加载时刷新很快。

Flutter CanvasKit构建中,我没有注意到在这两台设备上滚动时有任何滞后或卡顿,尽管我没有在低端设备上进行测试。

但在Flutter HTML构建中,该网站非常不稳定,我注意到SVG图像有一些渲染伪影。

相比之下,主网站很迅捷,即使在慢速连接上也能快速加载。

欢迎在你的浏览器上直接测试Flutter的网页克隆。你可以在我的网站旁边并排预览,以获得更好的比较。


接下来,我想列出Flutter网页应用和主网站之间的主要差异,因为许多因素会影响性能。

Flutter网页与主网站:差异

我分析了这7个不同的因素,它们促成了上述的性能数字。

工程努力

  • 主站点。我花费了大量的工程努力,以确保这个网站运行速度快,因为我在世界各地的所有读者都值得我这样做!🚀

  • Flutter克隆:这是我在短短10个小时内建立的一个原型。我只做了一些基本的性能优化(WebP图像,使用分片,删除材料和cupertino图标),但仅此而已。

主机

  • 主网站:这是由Vercel托管的,它提供了从全球所有地点的出色速度。
  • Flutter克隆:由Firebase托管,它的速度也非常快。我没有任何硬数据来比较这两者。

范围

  • 主网站:这包括近150页的内容(尽管我只在主页上进行了上述测试)。
  • Flutter克隆:单页应用程序(仅主页)。

主题设计

  • 主网站:同时支持黑暗和光明模式(尽管支持多个主题对性能的影响可以忽略不计)。
  • Flutter克隆版:只支持暗色模式。

字体

  • 主站点:在运行时从 Google CDN 加载,使用woff2格式,该格式更小,性能更强。
  • Flutter克隆:字体包含在应用程序捆绑包中,使用更大的ttf格式(Flutter还不支持woff2)。

图片

  • 主网站。默认使用WebP,PNG作为后备,加上一些SVG图标。
  • Flutter的克隆。只有WebP(没有回退),加上一些SVG图标。

渲染引擎

  • 主网站:标准HTML、CSS、JS,由浏览器渲染。
  • Flutter克隆版canvaskithtml渲染器都可以使用。我还测试了使用自动选项的构建,该选项针对移动浏览器的下载大小和桌面浏览器的性能进行了优化。

要明确的是:Flutter的渲染引擎在屏幕上绘制每一个像素,这与浏览器渲染普通网页的方式(使用HTML标记)有很大不同。这解释了性能上的巨大差异,高于所有其他因素。出于同样的原因,某些操作如文本选择在Flutter中很难做到(而我们在网络上认为这是理所当然的)。

特别是,canvaskit渲染器会对性能和像素完美的一致性进行优化,但有一个相当大的捆绑尺寸。在使用标准网络技术时,没有这样的权衡。

Flutter Web克隆 - 源代码

在我们总结之前,我还有一些东西要分享。 😀

那就是,我在GitHub上免费提供了Flutter的网络克隆版。

请随意查看代码,因为在这一过程中,我解决了一些有趣的UI问题。

结论 Flutter web并不适合内容繁杂的网站

虽然Flutter web可能是一个很好的解决方案,适用于重度UI的网络应用,但它不太适合像我这样的博客或网站

Tim Sneath(Flutter的产品经理)自己这样说。

Flutter是一个应用框架,而不是一个网站框架。
建设一个内容繁杂的网站?不要使用Flutter。拜托了。⛔️建立
一个互动的应用程序?就用Flutter吧!🎉

- Tim Sneath(@timsneath)2021年11月16

而这一点甚至在官方文档中也有明确说明。

目前,并不是每个HTML场景都非常适合Flutter。例如,文字丰富、基于流程的静态内容,如博客文章,受益于以文档为中心的模式,而不是Flutter这样的UI框架所能提供的以应用为中心的服务。

目前的情况是,Flutter开发者在针对网络时,必须在尺寸和性能之间做出权衡

除了纯粹的性能之外,Flutter web在支持基于文档的功能(文本编辑、选择、跨多个段落的复制和粘贴操作)方面仍不成熟,而我们在网络上认为这是理所当然的。

相反,对于内容繁杂的网站,你最好使用ReactVueSvelte等网络框架。

编码愉快!