从数据看 JAMstack 的速度

Avatar of Artem Denysov
Artem Denysov

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费额度!

人们说 JAMstack 网站速度很快——让我们通过查看真实的性能指标来了解原因!我们将涵盖常见的指标,例如第一个字节时间(TTFB)等,然后比较各种网站的数据,看看将这些网站划分为不同部分时的比较情况。

首先,我想提供一些背景信息的小分析。根据 HTTPArchive 关于页面加载的指标报告,用户平均等待 6.7 秒才能看到主要内容。

首次内容绘制 (FCP) – 衡量文本或图形首次渲染到屏幕上的时间点。

2019年8月1日报告的第10、50和90百分位数的 FCP 分布。

如果我们谈论的是页面参与度(互动时间),用户等待的时间更长。平均互动时间为 9.3 秒

互动时间 (TTI) – 用户可以无延迟地与页面交互的时间。

TTI 2019年8月1日报告的第10、50和90百分位数的分布。

真实用户网络性能现状

以上数据来自实验室监控,并不能完全代表真实的用户体验。来自 Chrome 用户体验报告 (CrUX) 的真实用户数据提供了更全面的视角。

我将使用从使用移动设备的用户那里汇总的数据。具体来说,我们将使用以下指标


第一个字节时间

TTFB 表示浏览器等待从服务器接收响应的第一个字节的时间。TTFB 在全球用户中需要 200 毫秒到 1 秒的时间。接收页面的第一部分需要这么长时间,这确实很长。

TTFB 移动速度分布(CrUX,2019年7月)

首次内容绘制

FCP 在全球 23% 的页面浏览量中发生在 2.5 秒之后。

FCP 移动速度分布(CrUX,2019年7月)

首次输入延迟

FID 指标显示网页对用户输入(例如点击、滚动等)的响应速度有多快。

由于不同的限制,CrUX 没有 TTI 数据,但有 FID,它甚至更好,可以反映页面交互性。超过 75% 的移动用户体验的输入延迟为 50 毫秒,用户没有遇到任何卡顿。

FID 移动速度分布(CrUX,2019年7月)

您可以使用以下查询并在 此网站 上进行操作。

2019年7月的数据
[
    {
      "date": "2019_07_01",
      "timestamp": "1561939200000",
      "client": "desktop",
      "fastTTFB": "27.33",
      "avgTTFB": "46.24",
      "slowTTFB": "26.43",
      "fastFCP": "48.99",
      "avgFCP": "33.17",
      "slowFCP": "17.84",
      "fastFID": "95.78",
      "avgFID": "2.79",
      "slowFID": "1.43"
    },
    {
      "date": "2019_07_01",
      "timestamp": "1561939200000",
      "client": "mobile",
      "fastTTFB": "23.61",
      "avgTTFB": "46.49",
      "slowTTFB": "29.89",
      "fastFCP": "38.58",
      "avgFCP": "38.28",
      "slowFCP": "23.14",
      "fastFID": "75.13",
      "avgFID": "17.95",
      "slowFID": "6.92"
    }
  ]
BigQuery
#standardSQL
  SELECT
    REGEXP_REPLACE(yyyymm, '(\\d{4})(\\d{2})', '\\1_\\2_01') AS date,
    UNIX_DATE(CAST(REGEXP_REPLACE(yyyymm, '(\\d{4})(\\d{2})', '\\1-\\2-01') AS DATE)) * 1000 * 60 * 60 * 24 AS timestamp,
    IF(device = 'desktop', 'desktop', 'mobile') AS client,
    ROUND(SUM(fast_fcp) * 100 / (SUM(fast_fcp) + SUM(avg_fcp) + SUM(slow_fcp)), 2) AS fastFCP,
    ROUND(SUM(avg_fcp) * 100 / (SUM(fast_fcp) + SUM(avg_fcp) + SUM(slow_fcp)), 2) AS avgFCP,
    ROUND(SUM(slow_fcp) * 100 / (SUM(fast_fcp) + SUM(avg_fcp) + SUM(slow_fcp)), 2) AS slowFCP,
    ROUND(SUM(fast_fid) * 100 / (SUM(fast_fid) + SUM(avg_fid) + SUM(slow_fid)), 2) AS fastFID,
    ROUND(SUM(avg_fid) * 100 / (SUM(fast_fid) + SUM(avg_fid) + SUM(slow_fid)), 2) AS avgFID,
    ROUND(SUM(slow_fid) * 100 / (SUM(fast_fid) + SUM(avg_fid) + SUM(slow_fid)), 2) AS slowFID
  FROM
    `chrome-ux-report.materialized.device_summary`
  WHERE
    yyyymm = '201907'
  GROUP BY
    date,
    timestamp,
    client
  ORDER BY
    date DESC,
    client

内容管理系统 (CMS) 性能现状

CMS 应该成为我们的救星,帮助我们构建更快的网站。但从数据来看,情况并非如此。全球 CMS 的当前性能状况并不理想。

TTFB 所有网站和 CMS 之间的移动速度分布比较(CrUX,2019年7月)
2019年7月的数据
[
    {
      "freq": "1548851",
      "fast": "0.1951",
      "avg": "0.4062",
      "slow": "0.3987"
    }
  ]
BigQuery
#standardSQL
  SELECT
    COUNT(DISTINCT origin) AS freq,
      
    ROUND(SUM(IF(ttfb.start < 200, ttfb.density, 0)) / SUM(ttfb.density), 4) AS fastTTFB,
    ROUND(SUM(IF(ttfb.start >= 200 AND ttfb.start < 1000, ttfb.density, 0)) / SUM(ttfb.density), 4) AS avgTTFB,
    ROUND(SUM(IF(ttfb.start >= 1000, ttfb.density, 0)) / SUM(ttfb.density), 4) AS slowTTFB
  
  FROM
    `chrome-ux-report.all.201907`,
    UNNEST(experimental.time_to_first_byte.histogram.bin) AS ttfb
  JOIN (
    SELECT
      url,
      app
    FROM
      `httparchive.technologies.2019_07_01_mobile`
    WHERE
      category = 'CMS'
    )
  ON CONCAT(origin, '/') = url
  ORDER BY
    freq DESC

以下是 FCP 结果

FCP 所有网站和 CMS 之间的移动速度分布比较(CrUX,2019年7月)

至少 FID 结果好一点

FID 所有网站和 CMS 之间的移动速度分布比较(CrUX,2019年7月)
2019年7月的数据
[
    {
      "freq": "546415",
      "fastFCP": "0.2873",
      "avgFCP": "0.4187",
      "slowFCP": "0.2941",
      "fastFID": "0.8275",
      "avgFID": "0.1183",
      "slowFID": "0.0543"
    }
  ]
BigQuery
#standardSQL
  SELECT
    COUNT(DISTINCT origin) AS freq,
    ROUND(SUM(IF(fcp.start < 1000, fcp.density, 0)) / SUM(fcp.density), 4) AS fastFCP,
    ROUND(SUM(IF(fcp.start >= 1000 AND fcp.start < 2500, fcp.density, 0)) / SUM(fcp.density), 4) AS avgFCP,
    ROUND(SUM(IF(fcp.start >= 2500, fcp.density, 0)) / SUM(fcp.density), 4) AS slowFCP,
    ROUND(SUM(IF(fid.start < 50, fid.density, 0)) / SUM(fid.density), 4) AS fastFID,
    ROUND(SUM(IF(fid.start >= 50 AND fid.start < 250, fid.density, 0)) / SUM(fid.density), 4) AS avgFID,
    ROUND(SUM(IF(fid.start >= 250, fid.density, 0)) / SUM(fid.density), 4) AS slowFID
  FROM
    `chrome-ux-report.all.201907`,
    UNNEST(first_contentful_paint.histogram.bin) AS fcp,
    UNNEST(experimental.first_input_delay.histogram.bin) AS fid
  JOIN (
    SELECT
      url,
      app
    FROM
      `httparchive.technologies.2019_07_01_mobile`
    WHERE
      category = 'CMS'
    )
  ON CONCAT(origin, '/') = url
  ORDER BY
    freq DESC

如您所见,使用 CMS 构建的网站的性能与网络上网站的整体性能并没有好多少。

您可以在 此 HTTPArchive 论坛讨论 中找到不同 CMS 的性能分布。

电子商务网站是通常在 CMS 上构建的网站的一个很好的例子,其页面浏览量的统计数据非常糟糕

  • ~40% – TTFB 为 1 秒
  • ~30% – FCP 超过 1.5 秒
  • ~12% – 页面交互延迟。

我遇到过一些客户,他们要求支持 IE10-IE11,因为来自这些用户的流量占 1%,相当于数百万美元的收入。请计算一下,如果 1% 的用户因性能不佳而立即离开且永不返回,您会损失多少。如果用户不满意,企业也不会满意。

要详细了解网络性能如何与收入相关联,请查看 WPO 统计数据。它列出了来自真实公司的案例研究,以及他们在改进性能后取得的成功。

JAMstack 有助于提高网络性能

鸣谢:Snipcart

使用 JAMstack,开发人员尽可能减少客户端的渲染,而是使用服务器基础设施来处理大部分事情。更不用说,大多数 JAMstack 工作流程非常擅长处理部署,并有助于扩展性,以及其他好处。内容静态存储在静态文件主机上,并通过 CDN 提供给用户。

阅读 Mathieu Dionne 的 “JAMstack 入门指南:你需要了解的一切”,以便更好地了解 JAMstack。

我有两年使用其中一个流行的电子商务 CMS 的经验,我们遇到了很多部署、性能、可扩展性方面的问题。团队会花费数天时间来修复这些问题。这不是客户想要的。这些都是 JAMstack 解决的大问题。

查看 CrUX 数据,JAMstack 网站的性能看起来非常可靠。以下值基于由 NetlifyGitHub 提供服务的网站。在 HTTPArchive 论坛 上有一些讨论,您可以参与其中以使数据更准确。

以下是 TTFB 的结果

TTFB 所有网站、CMS 和 JAMstack 网站之间的移动速度分布比较(CrUX,2019年7月)
2019年7月的数据
[
  {
    "n": "7627",
    "fastTTFB": "0.377",
    "avgTTFB": "0.5032",
    "slowTTFB": "0.1198"
  }
]
BigQuery
#standardSQL
SELECT
  COUNT(DISTINCT origin) AS n,
  ROUND(SUM(IF(ttfb.start < 200, ttfb.density, 0)) / SUM(ttfb.density), 4) AS fastTTFB,
  ROUND(SUM(IF(ttfb.start >= 200 AND ttfb.start < 1000, ttfb.density, 0)) / SUM(ttfb.density), 4) AS avgTTFB,
  ROUND(SUM(IF(ttfb.start >= 1000, ttfb.density, 0)) / SUM(ttfb.density), 4) AS slowTTFB
FROM
  `chrome-ux-report.all.201907`,
  UNNEST(experimental.time_to_first_byte.histogram.bin) AS ttfb
JOIN
  (SELECT url, REGEXP_EXTRACT(LOWER(CONCAT(respOtherHeaders, resp_x_powered_by, resp_via, resp_server)),
      '(netlify|x-github-request)')
    AS platform
  FROM `httparchive.summary_requests.2019_07_01_mobile`)
ON
  CONCAT(origin, '/') = url
WHERE
  platform IS NOT NULL
ORDER BY
  n DESC

以下是 FCP 的结果

FCP 所有网站、CMS 和 JAMstack 网站之间的移动速度分布比较(CrUX,2019年7月)

现在让我们看看 FID

FID 所有网站、CMS 和 JAMstack 网站之间的移动速度分布比较(CrUX,2019年7月)
2019年7月的数据
[
    {
      "n": "4136",
      "fastFCP": "0.5552",
      "avgFCP": "0.3126",
      "slowFCP": "0.1323",
      "fastFID": "0.9263",
      "avgFID": "0.0497",
      "slowFID": "0.024"
    }
  ]
BigQuery
#standardSQL
  SELECT
    COUNT(DISTINCT origin) AS n,
    ROUND(SUM(IF(fcp.start < 1000, fcp.density, 0)) / SUM(fcp.density), 4) AS fastFCP,
    ROUND(SUM(IF(fcp.start >= 1000 AND fcp.start < 2500, fcp.density, 0)) / SUM(fcp.density), 4) AS avgFCP,
    ROUND(SUM(IF(fcp.start >= 2500, fcp.density, 0)) / SUM(fcp.density), 4) AS slowFCP,
    ROUND(SUM(IF(fid.start < 50, fid.density, 0)) / SUM(fid.density), 4) AS fastFID,
    ROUND(SUM(IF(fid.start >= 50 AND fid.start < 250, fid.density, 0)) / SUM(fid.density), 4) AS avgFID,
    ROUND(SUM(IF(fid.start >= 250, fid.density, 0)) / SUM(fid.density), 4) AS slowFID
  FROM
    `chrome-ux-report.all.201907`,
    UNNEST(first_contentful_paint.histogram.bin) AS fcp,
    UNNEST(experimental.first_input_delay.histogram.bin) AS fid
  JOIN
    (SELECT url, REGEXP_EXTRACT(LOWER(CONCAT(respOtherHeaders, resp_x_powered_by, resp_via, resp_server)),
        '(netlify|x-github-request)')
      AS platform
    FROM `httparchive.summary_requests.2019_07_01_mobile`)
  ON
    CONCAT(origin, '/') = url
  WHERE
    platform IS NOT NULL
  ORDER BY
    n DESC

数据显示 JAMstack 网站的性能最佳。移动端和桌面端的数值几乎相同,这更令人惊叹!

来自工程领导者的亮点

让我向您展示一些业界知名人士的几个例子

JAMstack 网站通常由 CDN 托管并缓解 TTFB。由于文件托管由 Amazon Web Services 或类似的基础设施处理,因此可以通过一次修复来提高所有网站的性能。

另一项真实调查表明,为了获得更好的 FCP,最好提供静态 HTML。

以下是上面所有结果的对比

所有 Web、CMS 和 JAMstack 网站的移动速度分布对比(CrUX,2019 年 7 月)

JAMstack 通过使用 CDN 静态提供页面,从而为 Web 带来了更好的性能。这一点很重要,因为一个快速的后端如果需要很长时间才能到达用户,速度就会变慢,同样,一个缓慢的后端如果很快就能到达用户,速度也会变慢。

JAMstack 还没有赢得性能竞赛,因为它构建的网站数量不如例如 CMS 那样庞大,但其赢得比赛的意图非常强烈。

将这些指标添加到 性能预算 中,可以确保您在工作流程中构建良好的性能。例如:

  • TTFB:200 毫秒
  • FCP:1 秒
  • FID:50 毫秒

明智地使用它们 🙂


编辑注:Artem Denysov 来自 Stackbit,这是一项服务,可以极大地帮助您启动 JAMstack 网站,以及更多即将推出的工具,以简化 JAMstack 网站和内容的一些工作流程边缘。Artem 告诉我,他希望感谢 Rick Viscomi、Rob Austin 和 Aleksey Kulikov 在审查本文方面提供的帮助。