Bytes by resource type

The page weight split by resource type: HTML, JS, CSS, images, fonts, media.

Field data PhoneDesktopAll Scope All sites Q2 2026 edition · All devices field outcomes
Metric LCP INP CLS
1

At a glance the headline numbers for Bytes by resource type

The page weight split by resource type: HTML, JS, CSS, images, fonts, media.

13
Categories
In the distribution
31.7%
Fleet share
Top: script
Sites with any
Of script

Scripts are 31.7% of all requests. Images are 30.5%.

The State of Web Vitals · Q2 2026 · 189,915 sites · all devices field datacorewebvitals.io/state-of-cwv
2

The bytes by resource type mix who uses what, and how fast each group loads

VariantShare of requestsMedian
Script
32%
Image
31%
Stylesheet
13%
Other
6%
Font
5%
Fetch
5%
Xhr
2%
Document
2%
Ping
2%
Preflight
1%
Media
0%
Manifest
0%
Prefetch
0%

Bytes by resource type. On the fleet: 31.7% script, 30.5% image, 13.4% stylesheet.

By count script leads (31.7%); by bytes it is image (63.3%). computed

The State of Web Vitals · Q2 2026 · 189,915 sites · all devices field datacorewebvitals.io/state-of-cwv
3

Passing LCP per bucket every category and count level at once - color is the pass rate

1
2
3
4
5
6
7
8
9
10
11
12
Script 31.7%
91
87
81
75
73
72
73
72
77
82
81
73
Image 30.5%
85
85
83
82
81
80
79
79
78
79
79
78
Stylesheet 13.4%
89
87
83
79
77
73
68
66
62
59
58
57
Other 6.2%
81
81
86
85
78
75
77
77
83
79
80
95
Font 5.3%
87
86
83
80
76
73
72
69
73
71
73
70
Fetch 5.1%
83
79
80
81
79
81
82
83
82
83
85
81
Xhr 2.5%
83
82
80
79
77
76
73
74
72
70
68
69
Document 2.1%
84
81
79
79
78
Ping 1.6%
82
77
83
85
92
91
95
95
93
92
92
89
Preflight 1.1%
81
78
79
85
92
87
77
85
86
88
87
87
Media 0.3%
82
78
79
77
72
71
75
75
65
74
Manifest 0.1%
85
85
Prefetch 0%
71
72
← few of this category on the pagemany →
60%95%+ of sites passing LCP Faded cells: under 100 sites

Each row is a category, each column its own count bucket (few on the left, many on the right); the cell is the share of those sites passing LCP.

Stylesheet swings the hardest: 89% of sites pass LCP with few, 57% with many. computed

The State of Web Vitals · Q2 2026 · 189,915 sites · all devices field datacorewebvitals.io/state-of-cwv
4

Few vs many - does quantity cost LCP? the pass rate with few vs many of each category

60%70%80%90%100% few → many
Stylesheet 13.4% 89%57%
Script 31.7% 91%73%
Font 5.3% 87%70%
Xhr 2.5% 83%69%
Media 0.3% 82%74%
Image 30.5% 85%78%
Document 2.1% 84%78%
Fetch 5.1% 83%81%
Manifest 0.1% 85%85%
Prefetch 0% 71%72%
Preflight 1.1% 81%87%
Ping 1.6% 82%89%
Other 6.2% 81%95%
% of sites passing LCP · hollow ring = pages with few, solid dot = pages with many

Per category: the pass rate among pages with FEW of it (hollow ring) against pages with MANY (solid dot), worst trend first. Thin buckets are excluded from the endpoints.

More Stylesheet costs the most: the LCP pass rate falls from 89% with few to 57% with many. computed

The State of Web Vitals · Q2 2026 · 189,915 sites · all devices field datacorewebvitals.io/state-of-cwv
5

Why this matters for the Core Web Vitals, and where to start fixing it

The total page weight tells you the size of the problem. The split per resource type tells you which Core Web Vital pays for it. Image bytes mostly cost LCP. They compete for bandwidth with the hero image and make it load slower. Script bytes are the expensive ones. After the download the main thread still has to parse and execute them, so a script-heavy mix shows up in INP. CSS blocks rendering until it is loaded. Font bytes delay text rendering.

That is why the same total weight can produce very different vitals. A content site with mostly image bytes needs modern formats and lazy loading. A web app with mostly script bytes needs deferral and dead code removal. The mix tells you which problem you have.

Related signals Cookies per site → Media per page → Responsive image markup → font-display strategy → Chrome field data from 189,915 sites, representing millions of real page loads · How we measured
Live queries (2) — admin only
Query #1: 39.2 ms
SELECT 1 AS ok FROM site_metric_bags LIMIT 0;
Query #2: 1,082.3 ms
WITH flat AS (
                SELECT b.cat, b.n, b.size, s.crux."all".lcp AS cwv_val
                FROM site_metric_bags b
                JOIN sites s ON s.origin = b.origin
                WHERE b.path = 'network.resource_type'
                  AND b.cat IS NOT NULL
            ),
            totals AS (
                SELECT cat,
                    SUM(n) AS fleet_n,
                    SUM(size) AS fleet_size,
                    COUNT(*) FILTER (WHERE n IS NOT NULL) AS sample,
                    COUNT(*) FILTER (WHERE n > 0) AS with_any,
                    quantile_disc(n, 0.95) AS p95,
                    COUNT(*) AS n_rows
                FROM flat
                GROUP BY cat
                HAVING COUNT(*) >= (SELECT COUNT(DISTINCT origin) FROM site_metric_bags WHERE path = 'network.resource_type') * 0.005
            ),
            widths AS (
                SELECT *,
                    GREATEST(1, CAST(round(COALESCE(p95, 0)) AS INTEGER)) AS cap,
                    LEAST(GREATEST(1, CAST(round(COALESCE(p95, 0)) AS INTEGER)), 12 - 1) AS regular_buckets
                FROM totals
            ),
            widths2 AS (
                SELECT *,
                    GREATEST(1, CAST(ceil(cap * 1.0 / regular_buckets) AS INTEGER)) AS width
                FROM widths
            ),
            binned AS (
                SELECT f.cat, f.cwv_val, w.fleet_n, w.fleet_size, w.sample, w.with_any, w.width, w.regular_buckets,
                    CASE WHEN f.n IS NULL THEN NULL
                        ELSE LEAST(CAST(FLOOR(f.n * 1.0 / w.width) AS INTEGER), w.regular_buckets)
                    END AS bucket_idx
                FROM flat f
                JOIN widths2 w ON f.cat = w.cat
            )
            SELECT cat, fleet_n, fleet_size, sample, with_any, width, regular_buckets,
                bucket_idx,
                COUNT(*) AS n,
                quantile_disc(cwv_val, 0.5) AS median,
                COUNT(*) FILTER (WHERE cwv_val IS NOT NULL) AS total_cwv,
                COUNT(*) FILTER (WHERE cwv_val IS NOT NULL AND cwv_val <= 2500) AS good
            FROM binned
            WHERE bucket_idx IS NOT NULL
            GROUP BY cat, fleet_n, fleet_size, sample, with_any, width, regular_buckets, bucket_idx
            ORDER BY cat, bucket_idx;
JSON file lookups (4)
20260625/meta.json 0.05 ms
20260625/types.json 0.57 ms
20260625/loaf-scripts.json 0.37 ms
20260625/menu.json 0.16 ms