Een Shopify theme dat 5,8 seconden laadt op mobiel verliest gemiddeld 53% van de bezoekers voor de eerste interactie. Dit is de audit die we zelf uitvoeren voor elke Shopify performance opdracht.
Shopify theme performance audit — de 15-punten checklist
53% van de mobiele bezoekers verlaat een pagina die meer dan 3 seconden laadt. Google hanteert Core Web Vitals als rankingfactor. Een Shopify theme dat 5,8 seconden laadt op mobiel is geen designprobleem — het is een omzetprobleem.
Dit is de exacte checklist die wij doorlopen bij elke Shopify performance audit. 15 punten, gerangschikt op impact. Geen vage adviezen — concrete dingen die je kunt uitvoeren.
Wat je leert in dit artikel
- Hoe je een betrouwbare baseline meet
- De 15 audits op volgorde van impact
- Hoe je theme.liquid optimaliseert
- Lazy loading correct implementeren
- Wat je niet moet aanraken (en waarom)
Stap 0: Baseline meten
Audit nooit zonder meetpunt. Je kunt anders niet aantonen wat een wijziging oplevert.
Meet met drie tools:
Google PageSpeed Insights — meet zowel Lab als Field data. Field data is het belangrijkste voor SEO. Lab data is deterministisch voor vergelijking voor en na. WebPageTest — gebruik de instellingMotorola G4, slow 3G voor mobiel. Dit is de testconfiguratie die Google ook hanteert voor CrUX-data.
Shopify's eigen Theme Inspector — beschikbaar in de Shopify CLI. Toont render-tijden per Liquid section en snippet.
Sla de nulmeting op. Screenshot van PageSpeed, export van WebPageTest, screenshot van Theme Inspector. Zonder dit kun je geen resultaat aantonen.
Checklist punt 1: JavaScript-bundles
Het eerste wat wij controleren is de JavaScript-payload.
# Laad de homepage in Chrome DevTools
# Netwerk → filter op JS → sorteer op grootte
Acties:
- Verwijder jQuery als het theme het niet meer nodig heeft (Dawn gebruikt het niet)
- Laad chat-widgets asynchroon:
- Zet app-scripts op defer:
{{ content_for_header }}laadt veel scripts — controleer welke echt bij page load nodig zijn
Checklist punt 2: Afbeeldingen zonder lazy loading
Elke afbeelding boven de fold moet in de eerste render zitten. Alles eronder moet lazy laden.
{%- comment -%}
Fout: alle afbeeldingen laden direct
{%- endcomment -%}
<img src="{{ product.featured_image | image_url: width: 800 }}" alt="{{ product.title }}">
{%- comment -%}
Correct: lazy loading voor afbeeldingen onder de fold
{%- endcomment -%}
<img
src="{{ product.featured_image | image_url: width: 800 }}"
srcset="
{{ product.featured_image | image_url: width: 400 }} 400w,
{{ product.featured_image | image_url: width: 800 }} 800w,
{{ product.featured_image | image_url: width: 1200 }} 1200w
"
sizes="(min-width: 990px) 400px, (min-width: 750px) 50vw, 100vw"
alt="{{ product.featured_image.alt | escape }}"
width="{{ product.featured_image.width }}"
height="{{ product.featured_image.height }}"
loading="lazy"
>
Voeg altijd width en height toe. Zonder dit kan de browser geen aspect-ratio reserveren, wat leidt tot Cumulative Layout Shift (CLS) — een Core Web Vital die rechtstreeks de ranking beïnvloedt.
Checklist punt 3: LCP-element identificeren
LCP (Largest Contentful Paint) is de tijd tot het grootste element op de pagina zichtbaar is. Voor productpagina's is dit bijna altijd de product-afbeelding.
Het LCP-element mag nooit lazy-loaden. Het moet fetchpriority="high" hebben.
{%- comment -%}
Hero-afbeelding: geen lazy load, wel fetchpriority
{%- endcomment -%}
{%- if forloop.first -%}
<img
src="{{ media | image_url: width: 1200 }}"
srcset="
{{ media | image_url: width: 600 }} 600w,
{{ media | image_url: width: 1200 }} 1200w
"
sizes="(min-width: 990px) 50vw, 100vw"
alt="{{ media.alt | escape }}"
width="{{ media.width }}"
height="{{ media.height }}"
fetchpriority="high"
loading="eager"
>
{%- else -%}
<img
src="{{ media | image_url: width: 1200 }}"
alt="{{ media.alt | escape }}"
width="{{ media.width }}"
height="{{ media.height }}"
loading="lazy"
>
{%- endif -%}
Checklist punt 4: Render-blocking CSS
Shopify laadt stylesheets in {{ content_for_header }}. Eigen CSS voeg je toe met {{ 'theme.css' | asset_url | stylesheet_tag }}.
Controleer of je kritieke CSS inline staat of direct laadt. Non-kritieke CSS (print styles, modals die pas bij interactie zichtbaar zijn) kan asynchroon laden:
{%- comment -%}
Laad non-kritieke CSS asynchroon
{%- endcomment -%}
<link
rel="preload"
href="{{ 'modal-styles.css' | asset_url }}"
as="style"
onload="this.onload=null;this.rel='stylesheet'"
>
<noscript>
<link rel="stylesheet" href="{{ 'modal-styles.css' | asset_url }}">
</noscript>
Checklist punt 5: Font loading
Google Fonts zijn de meest voorkomende render-blocker in Shopify themes. Elke @import url(https://fonts.googleapis.com/...) in CSS is blocking.
Oplossing: host fonts zelf als het theme dat toestaat, of gebruik font-display: swap en preconnect:
{%- comment -%}
Zet in theme.liquid, voor het sluiten van </head>
{%- endcomment -%}
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
Controleer ook of je theme system fonts kan gebruiken voor UI-elementen (knoppen, labels, breadcrumbs). Alleen headlines en bodytekst hebben doorgaans een custom font nodig.
Checklist punt 6: Ongebruikte app-scripts verwijderen
Apps die je hebt verwijderd laten soms scripts achter in theme.liquid of in de app-blokken. Controleer:
# Grep op bekende app-script domeinen
# In theme.liquid zoeken naar script-tags met externe domeinen
Zoek in je thema op
