Defer vs Async JavaScript en hoe dit de Core Web Vitals beïnvloedt

Leer wanneer u JavaScript async moet maken en wanneer u het moet deferren voor de beste Core Web Vitals resultaten

Arjen Karel Core Web Vitals Consultant
Arjen Karel - linkedin
Last update: 2024-11-27

Defer vs Async JavaScript en hoe dit de Core Web Vitals beïnvloedt

In dit artikel zal ik het verschil laten zien tussen defer vs async JavaScript en waarom dit de Core Web Vitals beïnvloedt 

Wanneer ik de Core Web Vitals van een klant audit, merk ik vaak dat er op een pagina weinig onderscheid is tussen parser blocking (sync), asynchrone of deferred JavaScript. Dat is zonde, want verschillende scripts hebben verschillende optimale timings. 

In het kort:

'Normale' JavaScript in de head van de pagina wordt uitgevoerd voordat het parsen van de html begint, async scripts blokkeren de start van het parsen niet maar worden uitgevoerd zodra ze zijn gedownload. Deferred scripts worden uitgevoerd nadat de pagina is geparsed. 

Over het algemeen is het async attribuut een goede keuze voor scripts die niet hoeven te interageren met de DOM, zoals scripts die afbeeldingen of video's laden. Het defer attribuut is een goede keuze voor scripts die moeten interageren met de DOM, zoals scripts die widgets initialiseren of event listeners toevoegen. Laat beide weg als uw script enorme wijzigingen in de zichtbare viewport aanbrengt.

1. Synchrone JavaScript (Sync):

Standaard zijn JavaScripts in de head van de pagina synchrone scripts. Wanneer JavaScript-code synchroon wordt uitgevoerd, blokkeert dit onmiddellijk de main thread van de browser totdat het script volledig is uitgevoerd. Dit betekent dat de browser moet wachten tot de JavaScript-code klaar is voordat hij doorgaat met andere taken, zoals het renderen van de DOM. Als gevolg hiervan kan synchrone JavaScript de paginasnelheid en responsiviteit aanzienlijk beïnvloeden, vooral bij grotere en complexe scripts. Wanneer een pagina synchrone JavaScript bevat, kan de browser geen andere bronnen laden of de pagina renderen totdat de JavaScript is uitgevoerd, wat leidt tot mogelijke vertragingen bij het laden van de pagina.

<!DOCTYPE html>
<html>
<head>
  <title>Sync JavaScript Voorbeeld</title>
  <script src="script1.js"></script>
  <script src="script2.js"></script>
</head>
<body>
  <!-- Pagina inhoud hier -->
</body>
</html>

2. Asynchrone JavaScript (Async):

Asynchrone JavaScript stelt de browser in staat om door te gaan met het uitvoeren van andere taken terwijl het script op de achtergrond wordt gedownload. Door het async attribuut in de <script> tag te gebruiken, geven ontwikkelaars aan dat het script niet afhankelijk is van de DOM en onafhankelijk kan worden uitgevoerd. De browser wacht niet tot het async script klaar is met laden voordat hij doorgaat met het renderen van de pagina. Als resultaat hebben async scripts het potentieel om de paginasnelheid te verbeteren, vooral op tragere verbindingen, omdat ze het critical rendering path niet blokkeren.

<!DOCTYPE html>
<html>
<head>
  <title>Async JavaScript Voorbeeld</title>
  <script src="script1.js" async></script>
  <script src="script2.js" async></script>
</head>
<body>
  <!-- Pagina inhoud hier -->
</body>
</html>

Het is belangrijk op te merken dat async scripts in een onvoorspelbare volgorde kunnen vuren, aangezien ze worden uitgevoerd zodra ze beschikbaar zijn, ongeacht hun volgorde in het HTML-document. Als scripts van elkaar afhankelijk zijn, kan het gebruik van async afhankelijkheidsfouten veroorzaken.

3. Deferred JavaScript:

Deferred JavaScript, aangegeven door het defer attribuut in de <script> tag, stelt scripts in staat om op de achtergrond te worden gedownload terwijl de browser doorgaat met het parsen van het HTML-document. Net als async, blokkeren deferred scripts het critical rendering path niet, wat leidt tot sneller laden van de pagina. Het belangrijkste verschil is echter dat deferred scripts hun uitvoeringsvolgorde behouden en worden uitgevoerd in de volgorde waarin ze in het HTML-document verschijnen. Deferred scripts worden uitgevoerd nadat de DOM volledig is geparsed en net voordat het DOMContentLoaded event wordt gevuurd.

<!DOCTYPE html>
<html>
<head>
  <title>Defer JavaScript Voorbeeld</title>
  <script src="script1.js" defer></script>
  <script src="script2.js" defer></script>
</head>
<body>
  <!-- Pagina inhoud hier -->
</body>
</html>

Het gebruik van defer is gunstig voor scripts die afhankelijk zijn van de DOM en in een specifieke volgorde moeten worden uitgevoerd, omdat het ervoor zorgt dat de benodigde DOM- elementen beschikbaar zijn wanneer het script wordt uitgevoerd. Dit kan voordelig zijn voor scripts die DOM-manipulatie uitvoeren of afhankelijkheden hebben van andere scripts.

Attribuut Wanneer het script wordt geladen Wanneer het script wordt uitgevoerd
geen Op de achtergrond Voordat de DOM wordt geconstrueerd
async Op de achtergrond Onmiddellijk na het laden
defer Op de achtergrond Nadat de rest van de pagina is geparsed, in de volgorde waarin het in de HTML verschijnt

Hoe verbeteren async en defer de Pagespeed?

Synchrone JavaScript (Sync) kan het laden van de pagina aanzienlijk vertragen en de website minder responsief maken, vooral als de scripts groot zijn of lang duren om uit te voeren.

Asynchrone JavaScript (Async) kan de paginasnelheid verbeteren door onafhankelijke scripts parallel met andere bronnen te laten laden. Echter, er moet voorzichtigheid worden betracht om afhankelijkheden correct te beheren om onverwacht gedrag te voorkomen.

Deferred JavaScript kan ook de paginasnelheid verbeteren door het critical rendering path niet te blokkeren. Het zorgt ervoor dat de DOM klaar is voordat scripts worden uitgevoerd die ervan afhankelijk zijn, wat leidt tot een meer voorspelbare en gecontroleerde uitvoeringsvolgorde.

Best Practices:

  • Gebruik asynchroon (async) voor onafhankelijke scripts die niet afhankelijk zijn van de DOM en buiten volgorde kunnen worden uitgevoerd.
  • Gebruik deferred (defer) voor scripts die afhankelijk zijn van de DOM en in een specifieke volgorde moeten worden uitgevoerd, vooral bij het uitvoeren van DOM-manipulatie.
  • Vermijd het gebruik van synchrone JavaScript waar mogelijk, omdat dit een negatieve invloed heeft op de paginasnelheid en gebruikerservaring.

Door de juiste laadtechniek voor JavaScript-bestanden te gebruiken, kunt u de paginasnelheid optimaliseren, de gebruikerservaring verbeteren en zorgen voor soepelere interacties op hun websites. Het begrijpen van de verschillen tussen sync, async en defer en hun implicaties voor het laden van de pagina is essentieel voor het bouwen van performante webapplicaties.

Houd er rekening mee dat de effectiviteit van het gebruik van sync, async of defer attributen kan variëren op basis van de specifieke context en inhoud van de website. Regelmatig testen en prestatieanalyse zijn cruciaal om de laadstrategie van de pagina te verfijnen en optimale resultaten te garanderen voor verschillende scenario's.

Een stap verder gaan, laad scripts op aanvraag

Async en defer kunnen een pagina versnellen door de parser niet te blokkeren, maar het is belangrijk op te merken dat 'scripts uitstellen' niet al uw problemen zal oplossen. Bijvoorbeeld, het largest contentful paint element is kwetsbaar voor netwerk- en CPU-concurrentie veroorzaakt door deferred en async scripts. De interaction to next paint wordt ook beïnvloed door scripts die vroeg tijdens het laden van de pagina worden uitgevoerd. Daarom moet u, waar mogelijk, scripts op aanvraag laden om meer controle te hebben over hun impact op de paginaprestaties. Nieuwsgierig? Lees hoe wij scripts op aanvraag laden

I have done this before at your scale.

Complex platforms, large dev teams, legacy code. I join your team as a specialist, run the performance track, and hand it back in a state you can maintain.

Discuss Your Situation
Defer vs Async JavaScript en hoe dit de Core Web Vitals beïnvloedtCore Web Vitals Defer vs Async JavaScript en hoe dit de Core Web Vitals beïnvloedt