Header vs Footer Loading
When to Use
When JavaScript affects critical rendering or initial page display.
Decision
Default: Load in footer (after HTML parsing). Only load in header for JS that must execute before page render. Since Drupal 8, footer is the performance-optimized default.
Pattern
Footer loading (default, no configuration needed):
feature:
js:
js/feature.js: {} # Loads in footer by default
Header loading (rare, only for critical UI):
critical:
header: true # library-level key, a sibling of js: and version:
version: VERSION
js:
js/critical.js: {}
Defer attribute (best practice for most JavaScript):
enhanced:
js:
js/enhanced.js:
attributes:
defer: true # Loads async, executes after DOM ready
Reference discussion: https://www.drupal.org/project/drupal/issues/784626
Common Mistakes
- Loading non-critical JS in header - WHY: Blocks HTML parsing, delays page render, poor Core Web Vitals
- Using header: true by default - WHY: Footer is faster for user experience
- Not using defer attribute - WHY: Misses performance optimization opportunity
- Mixing defer with header placement - WHY: Defeats purpose of defer, creates confusion
See Also
- Performance Optimization - Script loading strategies
- Reference: Defer/Async Performance - Drupal core discussion