What counts as render-blocking
| Resource | Blocks rendering? | Fix |
|---|---|---|
<link rel="stylesheet"> in head | Yes | Inline critical CSS; load the rest with media="print" onload="this.media='all'" or a preload |
<script src> in head | Yes (also blocks parsing) | Add defer, or async for independent scripts |
<script defer> / type="module" | No | — |
CSS @import | Yes, and serially | Replace with <link> tags or bundle |
| Web fonts | Block text (not the page) for up to 3 s | font-display: swap, self-host, preload the main weight |
The critical path, toggle by toggle
First Contentful Paint ≈ 1.9 s → Needs improvement
Magenta bars block rendering: the browser won't paint until they finish. Simplified model of a mobile load with 600 ms server response; real pages have more files, but the rule is the same.
Step by step
- Run the Lighthouse test and open “Eliminate render-blocking resources” to see the exact files and the estimated saving.
- For each script, ask whether it is needed before first paint. Almost none are: add
defer. - Extract the CSS for the top of the page (tools like Critical or Critters automate this), inline it, and load the full stylesheet asynchronously.
- Remove CSS
@importchains and unused stylesheets from plugins or themes. - Re-test and check nothing broke visually (a flash of unstyled content means the critical CSS is missing something).