本报告的目的是通过真实的数据来更好地了解框架选择、性能和实际用户体验之间的关系。我们将试图回答以下几个关键问题:
当查看使用特定框架构建的所有已知网站时,Astro和SvelteKit的平均通过率超过了所有测试的网站的平均通过率(40.5%),而其他框架则没有。Astro是唯一一个达到50%以上通过谷歌CWV评估的框架。Next.js和Nuxt排名最低,大约每4个和每5个网站中只有一个通过了评估。导致网站无法通过Google核心Web Vitals评估的最可能原因是什么?我们可以按照每个指标来细分数据,以了解不同框架在Web Vitals方面的不同挑战(和成功)。
首次输入延迟(FID)是指从用户首次与页面交互到浏览器能够响应该交互的时间。谷歌的CWV评估要求FID不超过100毫秒。任何速度较慢的都被认为需要改进并未通过评估。大多数框架都能轻松通过此测试,超过90%或更多的网站通过了评估。没有任何框架在此测试中的通过率低于80%。这意味着大多数测试的网站对第一个用户交互做出了响应。
累积布局偏移(CLS)衡量页面上的视觉稳定性。要通过此评估,我们应该将意外的布局偏移减少到接近零,以为用户提供可靠的视觉体验。CLS是谷歌将其作为三个核心Web Vitals之一的有趣指标,因为它与速度或响应性并不严格相关。它的包含突显了在测量Web上的用户体验的整体质量时,重要性不仅在于性能方面。所有框架在此指标中得分50%或更高。然而,年轻的框架(Astro,SvelteKit和Remix)在此指标上得分最高。所有三个框架在测试的所有网站上,此指标的评估得分都超过了75%。
最大内容渲染时间(LCP)是三个核心Web Vitals中的最后一个指标,当涉及到感知性能时,它可以说是最重要的。它衡量了页面主要内容可能已加载的时间点。要通过谷歌的CWV评估,需要LCP为2.5秒或更短。任何速度较慢的都被认为需要改进并未通过评估。LCP是三个指标中最难掌握的。在所有测试的网站中,只有52%的网站通过了此指标。在我们测试的六个框架中,只有Astro和SvelteKit超过了此平均值。其余的都低于平均水平。
图表中最引人注目的是,对于每个框架来说,良好的INP测量值要比首次输入延迟(FID)更难达到。虽然每个测试的框架都看到了80%以上的FID通过率,但没有一个框架能够在INP上获得相同的80%通过率。Astro的通过率最高,为68.8%。值得注意的是,跟踪的所有网站的平均通过率高达60.9%,这是一个惊人的高水平。虽然在上面的图表中Astro和WordPress看起来是突出的成功案例,但这些网站实际上只是略高于行业平均水平的表现。为什么许多测试的Web框架在这个指标上遇到困难?一个原因可能是单页应用程序(SPA)架构通过JavaScript驱动所有导航作为客户端操作。这会为输入延迟创造机会,而没有客户端导航的多页应用程序(MPA)则没有这种机会。在MPA中,导航到新页面会触发从服务器的完整页面加载,这不被归类为输入延迟。这可能有助于解释为什么Astro和WordPress(图表中的两个MPA)在这个指标上表现显著优于测试的其他框架(所有SPA)。RebelMouse的Anne Burnes在一篇非常好的文章中讨论了FID和INP之间的差异:FID量化了用户与不响应页面交互时的体验,但它仅测量第一个交互。根据谷歌的说法,INP通过覆盖一个网站的整个交互谱系,从页面开始加载到用户离开页面的时间,更全面地衡量了网站的响应性。这种全面的测量使INP比FID更可靠地指示网站的整体响应性。 引用 INP的整体性质使其比FID更具挑战性,因为您的代码必须以一种方式实现,以在用户的整个旅程中保护响应性,而不仅仅是在第一次加载时。由于许多交互都是通过JavaScript完成的,因此这意味着您的站点必须仔细加载以实现最佳性能。 引用 这在移动端尤其困难。我们查看了行业内和我们的站点网络中的一些站点,并发现在移动端,平均INP得分比FID低35.5%。当检查同一数据集中的桌面性能时,平均下降仅为14.1%。 引用 —— Anne Burnes,RebelMouse这将是2023年值得关注的指标,谷歌继续权衡将INP添加为官方的核心Web Vital。
为了保持一致性,我们保持了前一部分的原始顺序。然而,你会注意到Remix在Lighthouse性能上比CWV评估表现更强。其中一个解释可能是Remix使用startTransition和requestIdleCallback来推迟React在页面加载时的hydration。理论上,这可能会在某些实验室情况(如Lighthouse)中转化为更好的性能,但代价是增加其他现实世界情况下的首次输入延迟。不幸的是,所有框架的中位Lighthouse性能分数都很低。一半的测试框架的中位性能被认为是“较差”(49或以下),而另一半框架的中位分数需要改进(50-89)。没有框架达到90+的“好”的中位数得分。在所有跟踪的网站中,中位性能分数是34/100。为此,我们测试的一半框架(Astro,SvelteKit和Remix)的平均水平高于互联网平均水平。
通过将数据按百分位数分解,我们可以开始看到一些稍微令人鼓舞的数字,Astro和SvelteKit在p90或p95百分位数中达到90+的分数。但是,数据清楚地显示所有网站和框架(包括Astro)仍然难以在实际情况下实现良好的性能。
数据趋势很清楚:发送更少JavaScript的网站 tend to perform better。然而,有太多因素在起作用,我们无法自信地将这种趋势与web框架选择本身联系起来。可能情况是某些框架在鼓励/阻止JavaScript方面与其他框架不同,但在我们得出任何结论之前,需要进行更多研究。状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模
我的Rails应用程序中安装了carrierwave。但是,当用户上传多页pdf时,我只希望应用程序获取文档中的第一页并将其转换为jpeg。这可能吗?用什么命令?这是我的uploader。#encoding:utf-8classImageUploader[200,300]##defscale(width,height)##dosomething#end#Createdifferentversionsofyouruploadedfiles:version:thumbdoprocess:resize_to_fill=>[150,210]process:convert=>:jpgdefful
我正在使用Ruby/Mechanize编写一个“自动填写表格”应用程序。它几乎可以工作。我可以使用精彩CharlesWeb代理以查看服务器和我的Firefox浏览器之间的交换。现在我想使用Charles查看服务器和我的应用程序之间的交换。Charles在端口8888上代理。假设服务器位于https://my.host.com。.一件不起作用的事情是:@agent||=Mechanize.newdo|agent|agent.set_proxy("my.host.com",8888)end这会导致Net::HTTP::Persistent::Error:...lib/net/http/pe
对于用户模型,我有一个过滤器来检查用户的预订状态,该状态由整数值(0、1或2)表示。UserActiveAdmin索引页上的过滤器是通过以下代码实现的:filter:booking_status,as::select然而,这会导致下拉选项为0、1或2。当管理员用户从下拉列表中选择它们时,我更愿意自己将它们命名为“未完成”、“待定”和“已确认”之类的名称。有没有办法在不改变booking_status在模型中的表示方式的情况下做到这一点? 最佳答案 假设booking_status是模型中的枚举字段,您可以使用:过滤器:booking
我想开始使用“Sinatra”框架进行编码,但我找不到该框架的“MVC”模式。是“MVC-Sinatra”模式或框架吗? 最佳答案 您可能想查看Padrino这是一个围绕Sinatra构建的框架,可为您的项目提供更“类似Rails”的感觉,但没有那么多隐藏的魔法。这是使用Sinatra可以做什么的一个很好的例子。虽然如果您需要开始使用这很好,但我个人建议您将它用作学习工具,以对您来说最有意义的方式使用Sinatra构建您自己的应用程序。写一些测试/期望,写一些代码,通过测试-重复:)至于ORM,你还应该结帐Sequel其中(imho
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:HowdoIgeneratealistofnuniquerandomnumbersinRuby?我想做的事:Random.rand(0..10).timesdoputsRandom.rand(0..10)end但如果随机数已经显示过,则无法再次显示。如何最轻松地做到这一点?
当你在类中包含方法名冲突的模块时,它会使用类定义的方法。有没有办法选择我想运行的?moduleBdefself.hello"helloB"endendclassAincludeBdefself.hello"helloA"endendA.hello#=>thisprints"helloA",whatifIwant"helloB"? 最佳答案 Ben,当你在Ruby中调用一个方法(比如hello)时,会发生以下情况:如果接收者的特征类有一个名为hello的方法,它将被调用。如果不是:如果接收者的类有一个名为hello的实例方法,它将被调