Direct answer: the 25 homepages declare 122 stylesheets (median 5, max 14) and 195 external scripts. 22 sites put 78 synchronous scripts in the head (median 2, max 8, E28); only three sites use async/defer (10 scripts, all in the body). There are 36 inline head scripts; preload appears only on E25 (five tags) and preconnect is zero.
This study parses HTML tags and attributes only; it does not execute scripts or measure real load time or first-screen rendering.
Method: parse tags and attributes, do not execute scripts
On 2026-11-08 between 12:43 and 12:45 each of the 25 homepages from study 4 received one GET (15-second timeout, one retry), and the link rel="stylesheet" and script tags were parsed: stylesheet count, head versus body position, and async, defer or type="module" (including boolean attributes without a value). CSS/JS files are not loaded and page scripts are not executed.
| Item | Rule | Boundary |
|---|---|---|
| Head sync script | External script in head without async/defer/module | Actual execution time not measured |
| async/defer | Boolean attribute present | Order and dependencies not judged |
| Stylesheet | rel contains stylesheet | Conditional loading beyond media not read |
| preload/preconnect | link rel counted | Not judged against the critical path |
Result: 122 stylesheets, median five
| Metric | Value | Note |
|---|---|---|
| Total stylesheets | 122 | Across 25 sites |
| Median / max per site | 5 / 14 | Max on E16 |
| No external stylesheet | 3 sites | E18, E20, E25 |
| Print-only stylesheet | 0 | No site uses media="print" to cut blocking |
Head sync scripts: 78 across 22 sites
| Metric | Value | Note |
|---|---|---|
| Head sync scripts | 78 | 22 sites have at least one |
| Median / max per site | 2 / 8 | Max on E28 |
| Inline head scripts | 36 | Across 17 sites |
| External scripts | 195 | Including body and async |
Synchronous head scripts delay parsing of the rest of the HTML: 78 scripts means these pages download and execute them in order before the first screen. E28 has eight, with E17, E19 and E27 at seven each; moving non-critical scripts to the end of the body or adding defer is the direct fix.
async/defer: three sites, ten scripts, all in the body
| Item | Sites / count | Note |
|---|---|---|
| Uses async/defer/module | 3 sites / 10 | E02 one, E17 four, E25 five |
| async/defer in head | 0 | All async scripts are in the body |
| async/defer in body | 10 | Non-blocking but unordered |
Async attributes are mostly used for analytics; none of the 22 sites with head sync scripts uses async/defer in the head. The current focus is where scripts sit, not how they load.
Preload and preconnect: one preloads, none preconnect
| Hint | Sites | Note |
|---|---|---|
| preload | 1 | E25 with five tags |
| preconnect | 0 | — |
Preload/preconnect are not inherently good: they help only when they target critical first-screen resources. Zero preconnect means third-party handshakes are not explicitly optimised, but that should be read alongside the number of third parties, not as a defect on its own.
What this means for acceptance
- Make head sync scripts an acceptance item. 22 of 25 sites have them, 78 in total; move non-critical scripts to the end of the body or add defer.
- Actually use async attributes. Only three sites use async/defer, all in the body; none in the head.
- Control stylesheet count. Median five, max 14; bundling and critical-CSS inlining still have room.
- Audit inline scripts too. 17 sites have 36 inline head scripts; confirm each must run before the first screen.
- Use preload/preconnect only on the critical path. One site preloads and none preconnect; identify critical resources first. See the website development service checklist.
Limits
- HTML only: no execution, so real blocking time, order and first-screen rendering are not measured.
- Dynamic insertion excluded: script/link tags added by JavaScript are not in the HTML and are not counted.
- One snapshot: 2026-11-08 12:43–12:45; redesigns or CDN differences change results.
- Count is not impact: a tiny sync script and a large bundle block differently; only count and position are measured.
- 25-site pilot: no industry claim.
Data and reproduction
Anonymised data: equipment-homepage-blocking-resources-2026.csv (25 rows × 14 columns: stylesheets, print stylesheets, total scripts, external scripts, head sync, head/body async, inline head, preload, preconnect, time). The repository keeps docs/research/2026-11-homepage-blocking-resources.csv.
Parser: scripts/blocking_resource_probe.py; unit tests: scripts/test_content_blocking_resources.py (10 tests, no network). Run:
python -m unittest scripts.test_content_blocking_resources
Related: the homepage CSS/JS cache-header pilot, the homepage resource inventory pilot, and the homepage font delivery pilot, and the homepage CSP pilot.
Sources and definitions
- Sample: the 25 homepages from study 4 (same sample_id).
- Fetch: 2026-11-08 12:43–12:45 Asia/Shanghai, serial, 0.5 s apart, 15-second timeout.
- Parsing: stylesheet links counted; scripts classified by head/body and async/defer/module (boolean attributes read from the raw tag).
- No CSS/JS is loaded and no page script is executed.
Frequently asked questions
Why do synchronous head scripts block?
The browser must download and execute them before parsing the rest of the HTML; moving them to the end of the body or adding defer/async avoids blocking first-screen parsing.
Do many stylesheets always mean slow?
No. Blocking depends on file size, critical CSS and the network; but more than ten stylesheets usually means bundling and critical-CSS inlining still have room.
defer or async?
defer keeps execution order and runs before DOMContentLoaded; async runs as soon as it downloads, without order, which suits independent scripts such as analytics.
Is preconnect necessary?
For critical third-party origins it can save a handshake; none use it here, which is not automatically wrong and depends on third-party dependencies and the critical path.
Do 25 sites represent the industry?
No. This is the same 25 equipment-company homepages from study 4; it describes only these pages.
Can the data be re-checked?
Yes. The public CSV has 25 rows by 14 columns; scripts/blocking_resource_probe.py has 10 offline unit tests.