Render-Blocking Resources
Also Known As
render blocking
critical CSS
async defer
FCP
TL;DR
CSS and synchronous JavaScript in <head> that prevent the browser from rendering any content until they are downloaded and parsed — the primary cause of slow First Contentful Paint.
Explanation
The browser cannot render until it has the CSSOM (from CSS) and has executed synchronous scripts. Every <link rel='stylesheet'> and <script> without async/defer in <head> blocks rendering. Strategies: inline critical CSS (removes a request for above-fold styles), defer non-critical CSS (link with media='print' + onload trick), async JavaScript (parallel download, executes when ready — may execute out of order), defer JavaScript (parallel download, executes in order after HTML parsed). Third-party scripts are the most common culprit — analytics, chat widgets, ad scripts.
Common Misconception
✗ async and defer are the same — async executes as soon as downloaded (may interrupt parsing); defer executes after HTML is parsed in order. For most scripts, defer is safer.
Why It Matters
A single render-blocking CSS file adds one full network round-trip before any content appears — eliminating render-blocking resources is the highest-impact FCP optimisation.
Common Mistakes
- <script> in <head> without async or defer — blocks HTML parsing until the script downloads and executes.
- Inlining too much CSS — inlined CSS cannot be cached; critical CSS should be < 14KB.
- async on scripts that depend on each other — async scripts execute out of order, breaking dependencies.
- Not deferring third-party scripts — analytics and chat widgets are rarely needed for initial render.
Code Examples
✗ Vulnerable
<!-- Render-blocking — nothing paints until all are loaded:
<head>
<link rel="stylesheet" href="all-styles.css"> <!-- Blocks render -->
<script src="vendor.js"></script> <!-- Blocks parsing -->
<script src="app.js"></script> <!-- Blocks parsing -->
<script src="https://analytics.example.com/track.js"></script> <!-- Blocks -->
</head>
✓ Fixed
<!-- Optimised — critical path unblocked:
<head>
<style>/* Inlined critical above-fold CSS only */</style>
<link rel="preload" href="all-styles.css" as="style" onload="this.rel='stylesheet'">
</head>
<body>
<!-- Content here -->
<script src="vendor.js" defer></script> <!-- Deferred — after HTML parsed -->
<script src="app.js" defer></script> <!-- Deferred — maintains order -->
<script src="analytics.js" async></script> <!-- Async — independent -->
</body>
Tags
🤝 Adopt this term
£79/year · your link shown here
Added
15 Mar 2026
Edited
22 Mar 2026
Views
24
🤖 AI Guestbook educational data only
|
|
Last 30 days
Agents 0
No pings yet today
Amazonbot 6
Perplexity 5
Google 2
Unknown AI 2
SEMrush 2
Ahrefs 2
Also referenced
How they use it
crawler 18
crawler_json 1
Related categories
⚡
DEV INTEL
Tools & Severity
🟠 High
⚙ Fix effort: Medium
⚡ Quick Fix
Add defer to all non-critical <script> tags and move them before </body>; use <link rel='preload'> for critical fonts; inline critical CSS for above-the-fold content
📦 Applies To
any
web
🔗 Prerequisites
🔍 Detection Hints
<script src without defer or async in <head>; @font-face without font-display:swap; large CSS file blocking render
Auto-detectable:
✓ Yes
lighthouse
pagespeed-insights
chrome-devtools
⚠ Related Problems
🤖 AI Agent
Confidence: High
False Positives: Low
✓ Auto-fixable
Fix: Low
Context: File