Sneller laden van pagina's dankzij server-denktijd met Early Hints

Ontdek hoe uw server hints naar de browser kan sturen over kritieke subbronnen.

Wat zijn vroege hints?

Websites zijn in de loop van de tijd steeds geavanceerder geworden. Als zodanig is het niet ongebruikelijk dat een server niet-triviaal werk moet uitvoeren (bijvoorbeeld toegang tot databases of CDN's die toegang krijgen tot de oorspronkelijke server) om de HTML voor de opgevraagde pagina te produceren. Helaas resulteert deze "server-denktijd" in extra latentie voordat de browser de pagina kan weergeven. De verbinding blijft feitelijk inactief zolang de server nodig heeft om het antwoord voor te bereiden.

Afbeelding van de server, denk aan een tijdsverschil van 200 ms tussen het laden van de pagina en het laden van andere bronnen.
Zonder vroege tips: alles wordt geblokkeerd op de server en bepaalt hoe er moet worden gereageerd op de hoofdbron.

Early Hints is een HTTP-statuscode ( 103 Early Hints ) die wordt gebruikt om een ​​voorlopig HTTP-antwoord te verzenden voorafgaand aan een definitief antwoord. Hierdoor kan een server hints naar de browser sturen over kritieke subbronnen (bijvoorbeeld stijlbladen voor de pagina, essentieel JavaScript) of oorsprongen die waarschijnlijk door de pagina zullen worden gebruikt, terwijl de server bezig is met het genereren van de hoofdbron. De browser kan deze hints gebruiken om verbindingen op te warmen en subbronnen op te vragen, terwijl hij wacht op de hoofdbron. Met andere woorden, Early Hints helpt de browser voordeel te halen uit deze "server-denktijd" door vooraf wat werk te doen, waardoor het laden van pagina's wordt versneld.

Afbeelding die laat zien hoe Early Hints ervoor zorgt dat de pagina een gedeeltelijk antwoord verzendt.
Met Early Hints: de server kan een gedeeltelijk antwoord geven met resource-hints, terwijl hij het uiteindelijke antwoord bepaalt

In sommige gevallen kan de prestatieverbetering van de Largest Contentful Paint variëren van enkele honderden milliseconden, zoals waargenomen door Shopify en door Cloudflare , en tot een seconde sneller, zoals te zien in deze vergelijking voor en na:

Vergelijking van twee sites.
Voor/na vergelijking van vroege tips op een testwebsite uitgevoerd met WebPageTest (Moto G4 - DSL)

Hoe u vroege tips kunt gebruiken

De eerste stap om te profiteren van Early Hints bestaat uit het identificeren van de beste landingspagina's, dat wil zeggen de pagina's waar uw gebruikers doorgaans beginnen wanneer ze uw website bezoeken. Dit kan de startpagina zijn, of populaire pagina's met productvermeldingen als er veel gebruikers afkomstig zijn van andere websites. De reden dat deze toegangspunten belangrijker zijn dan andere pagina's is omdat het nut van Early Hints afneemt naarmate de gebruiker door uw website navigeert (dat wil zeggen dat de browser waarschijnlijk alle subbronnen heeft die hij nodig heeft bij de tweede of derde volgende navigatie). Het is ook altijd een goed idee om een ​​geweldige eerste indruk achter te laten!

Nu u over deze geprioriteerde lijst met bestemmingspagina's beschikt, is de volgende stap het identificeren welke oorsprongen of subbronnen goede kandidaten zouden zijn voor preconnect of preload -hints. Normaal gesproken zijn dit de herkomsten en subbronnen die het meest bijdragen aan belangrijke gebruikersstatistieken, zoals Largest Contentful Paint of First Contentful Paint . Meer concreet: zoek naar subbronnen die het renderen blokkeren, zoals synchroon JavaScript, stylesheets of zelfs weblettertypen. Zoek op dezelfde manier naar oorsprongen die subresources hosten die veel bijdragen aan de belangrijkste gebruikersstatistieken.

Houd er ook rekening mee dat als uw belangrijkste bronnen al gebruik maken van preconnect of preload , u deze bronnen of bronnen kunt beschouwen als kandidaten voor Early Hints. Zie hoe u LCP kunt optimaliseren voor meer details. Het is echter mogelijk dat het naïef kopiëren van de preconnect en preload -richtlijnen van HTML naar Early Hints niet optimaal is .

Wanneer u deze in HTML gebruikt, wilt u doorgaans bronnen preconnect of preload die de Preload Scanner niet in de HTML zal ontdekken, bijvoorbeeld lettertypen of achtergrondafbeeldingen die anders te laat ontdekt zouden worden. Voor Early Hints beschikt u niet over de HTML, dus kunt u in plaats daarvan vooraf preconnect met kritieke domeinen of kritieke bronnen preload die anders misschien vroeg in de HTML zouden worden ontdekt, bijvoorbeeld door main.css of app.js vooraf te laden. Bovendien ondersteunen niet alle browsers het preload van Early Hints, zie Browserondersteuning .

De tweede stap bestaat uit het minimaliseren van het risico van het gebruik van Early Hints op hulpbronnen of oorsprongen die mogelijk verouderd zijn of niet langer door de hoofdbron worden gebruikt. Bronnen die regelmatig worden bijgewerkt en voorzien van een versienummer (bijvoorbeeld example.com/css/main.fa231e9c.css ) zijn bijvoorbeeld mogelijk niet de beste keuze. Houd er rekening mee dat dit probleem niet specifiek geldt voor Early Hints, maar voor elke preload of preconnect waar deze ook aanwezig is. Dit is het soort details dat het beste kan worden afgehandeld met automatisering of sjablonen (een handmatig proces leidt bijvoorbeeld eerder tot niet-overeenkomende hash- of versie-URL's tussen preload en de daadwerkelijke HTML-tag die de bron gebruikt).

Beschouw als voorbeeld de volgende stroom:

GET /main.html
Host: example.com
User-Agent: [....] Chrome/103.0.0.0 [...]

De server voorspelt dat main.abcd100.css nodig zal zijn, en stelt voor om het vooraf te laden met behulp van Early Hints:

103 Early Hints
Link: </main.abcd100.css>; rel=preload; as=style
[...]

Enkele ogenblikken later wordt de webpagina, inclusief de gekoppelde CSS, weergegeven. Helaas wordt deze CSS-bron regelmatig bijgewerkt en ligt de hoofdbron al vijf versies voor ( abcd105 ) op de voorspelde CSS-bron ( abcd100 ).

200 OK
[...]
<HTML>
<head>
   <title>Example</title>
   <link rel="stylesheet" href="/main.abcd105.css">

Streef in het algemeen naar hulpbronnen en herkomsten die redelijk stabiel zijn, en grotendeels onafhankelijk van de uitkomst van de belangrijkste hulpbron. Indien nodig kunt u overwegen uw belangrijkste bronnen in tweeën te splitsen: een stabiel deel dat is ontworpen om te worden gebruikt met Early Hints, en een dynamischer deel dat moet worden opgehaald nadat de hoofdbron door de browser is ontvangen:

<HTML>
<head>
   <title>Example</title>
   <link rel="stylesheet" href="/main.css">
   <link rel="stylesheet" href="/experimental.3eab3290.css">

Tenslotte, aan de serverkant, zoek naar belangrijke bronverzoeken die worden verzonden door browsers waarvan bekend is dat ze Early Hints ondersteunen, en reageer onmiddellijk met 103 Early Hints. Neem in het 103-antwoord de relevante preconnect- en preload-hints op. Zodra de hoofdbron gereed is, volgt u het gebruikelijke antwoord (bijvoorbeeld 200 OK indien succesvol). Voor achterwaartse compatibiliteit is het een goede gewoonte om ook Link HTTP-headers op te nemen in het uiteindelijke antwoord, misschien zelfs aangevuld met kritieke bronnen die duidelijk werden tijdens het genereren van de hoofdbron (bijvoorbeeld het dynamische deel van een sleutelbron als je de suggestie 'in tweeën splitsen' hebt gevolgd). Hier is hoe dit eruit zou zien:

GET /main.html
Host: example.com
User-Agent: [....] Chrome/103.0.0.0 [...]
103 Early Hints
Link: <https://fonts.google.com>; rel=preconnect
Link: </main.css>; rel=preload; as=style
Link: </common.js>; rel=preload; as=script

Enkele ogenblikken later:

200 OK
Content-Length: 7531
Content-Type: text/html; charset=UTF-8
Content-encoding: br
Link: <https://fonts.google.com>; rel=preconnect
Link: </main.css>; rel=preload; as=style
Link: </common.js>; rel=preload; as=script
Link: </experimental.3eab3290.css>; rel=preload; as=style
<HTML>
<head>
   <title>Example</title>
   <link rel="stylesheet" href="/main.css">
   <link rel="stylesheet" href="/experimental.3eab3290.css">
   <script src="/common.js"></script>
   <link rel="preconnect" href="https://fonts.googleapis.com">

Browser-ondersteuning

Hoewel 103 Early Hints in alle grote browsers wordt ondersteund, verschillen de richtlijnen die op een Early Hint kunnen worden verzonden per browser:

Ondersteuning vooraf verbinden:

Browser Support

  • Chroom: 103.
  • Rand: 103.
  • Firefox: 120.
  • Safari: 17.

Ondersteuning voorladen:

Browser Support

  • Chroom: 103.
  • Rand: 103.
  • Firefox: 123.
  • Safari: niet ondersteund.

Chrome DevTools biedt ook ondersteuning voor 103 Early Hints en de Link headers zijn te zien in de documentbronnen:

Netwerkpaneel met Early Hints-headers
Vroege hints Link worden weergegeven in Chrome DevTools.

Let op: als u de Early Hints-bronnen wilt gebruiken, mag Disable cache niet zijn aangevinkt in DevTools, omdat Early Hints de browsercache gebruikt. Voor vooraf geladen bronnen wordt de initiator weergegeven als early-hints en de grootte als (Disk cache) :

Netwerkpaneel met initiatiefnemers van Early Hints
Early Hinted-bronnen hebben een early-hints -initiator en worden geladen vanuit de schijfcache.

Dit vereist ook een vertrouwd certificaat voor HTTPS-testen.

Firefox (vanaf v126) heeft geen expliciete ondersteuning voor 103 Early Hints in DevTools, maar bronnen die zijn geladen met Early Hints tonen geen HTTP-headerinformatie, wat een indicator is dat ze via Early Hints zijn geladen.

Serverondersteuning

Hier is een korte samenvatting van het ondersteuningsniveau voor Early Hints onder populaire open source-software HTTP-serversoftware:

Schakel vroege hints op de eenvoudigere manier in

Als u een van de volgende CDN's of platforms gebruikt, hoeft u Early Hints mogelijk niet handmatig te implementeren. Raadpleeg de online documentatie van uw leverancier van oplossingen om erachter te komen of deze Early Hints ondersteunt, of raadpleeg de niet-uitputtende lijst hier:

Hoe u problemen kunt voorkomen voor klanten die Early Hints niet ondersteunen

Informatieve HTTP-reacties in het bereik van 100 maken deel uit van de HTTP-standaard, maar sommige oudere clients of bots kunnen hier moeite mee hebben omdat ze vóór de lancering van 103 Early Hints zelden werden gebruikt voor algemeen surfen op het internet.

Alleen het uitzenden van 103 vroege hints als reactie op clients die een sec-fetch-mode: navigate de HTTP-verzoekheader moet ervoor zorgen dat dergelijke hints alleen worden verzonden naar nieuwere clients die begrijpen dat ze op het daaropvolgende antwoord moeten wachten. Omdat Early Hints alleen worden ondersteund bij navigatieverzoeken (zie huidige beperkingen ), heeft dit bovendien het extra voordeel dat wordt vermeden dat deze onnodig worden verzonden bij andere verzoeken.

Bovendien wordt aanbevolen dat Early Hints alleen via HTTP/2- of HTTP/3-verbindingen worden verzonden en dat de meeste browsers deze alleen via die protocollen accepteren.

Geavanceerd patroon

Als u Early Hints volledig heeft toegepast op uw belangrijkste bestemmingspagina's en merkt dat u op zoek bent naar meer mogelijkheden, bent u wellicht geïnteresseerd in het volgende geavanceerde patroon.

Voor bezoekers die zich op hun zoveelste paginaverzoek bevinden als onderdeel van een typische gebruikersreis, wilt u wellicht de Early Hints-reactie aanpassen aan inhoud die zich lager en dieper op de pagina bevindt, met andere woorden: Early Hints gebruiken voor bronnen met een lagere prioriteit. Dit klinkt misschien contra-intuïtief, aangezien we hebben aanbevolen om ons te concentreren op subbronnen of oorsprongen met hoge prioriteit en die het renderen blokkeren. Tegen de tijd dat een bezoeker een tijdje heeft genavigeerd, is het echter zeer waarschijnlijk dat zijn browser al over alle essentiële bronnen beschikt. Vanaf dat moment kan het zinvol zijn om uw aandacht te verleggen naar bronnen met een lagere prioriteit. Dit kan bijvoorbeeld betekenen dat u Early Hints gebruikt om productafbeeldingen te laden, of dat u extra JS/CSS gebruikt die alleen nodig is voor minder vaak voorkomende gebruikersinteracties.

Huidige beperkingen

Dit zijn de beperkingen van Early Hints zoals geïmplementeerd in Chrome:

  • Alleen beschikbaar voor navigatieverzoeken (dat wil zeggen de hoofdbron voor het document op het hoogste niveau).
  • Ondersteunt alleen preconnect en preload (dat wil zeggen, prefetch wordt niet ondersteund).
  • Vroege hints gevolgd door een cross-origin-omleiding op het uiteindelijke antwoord zullen ertoe leiden dat Chrome de bronnen en verbindingen laat vallen die het heeft verkregen met vroege hints.
  • Bronnen die vooraf zijn geladen met Early Hints, worden opgeslagen in de HTTP-cache en daar later door de pagina opgehaald. Daarom kunnen alleen cachebare bronnen vooraf worden geladen met behulp van Early Hints, anders wordt de resource dubbel opgehaald (een keer door de Early Hints en opnieuw door het document). In Chrome is de HTTP-cache uitgeschakeld voor niet-vertrouwde HTTPS-certificaten (zelfs als u doorgaat met het laden van de pagina).
  • Het vooraf laden van responsieve afbeeldingen (met behulp van imagesrcset , imagesizes of media ) wordt niet ondersteund met HTTP <link> headers, omdat de viewport pas wordt gedefinieerd als het document is gemaakt. Dit betekent dat 103 Early hints niet kunnen worden gebruikt om responsieve afbeeldingen vooraf te laden en dat de onjuiste afbeelding kan worden geladen wanneer deze hiervoor wordt gebruikt. Volg deze discussie over voorstellen om hier beter mee om te gaan .

Andere browsers hebben vergelijkbare beperkingen en, zoals eerder opgemerkt , beperken sommige browsers de vroege hints verder tot alleen preconnect .

Wat is het volgende?

Afhankelijk van de interesse van de gemeenschap kunnen we onze implementatie van Early Hints uitbreiden met de volgende mogelijkheden:

  • Vroege tips voor niet-cachebare bronnen die de geheugencache gebruiken in plaats van de HTTP-cache.
  • Vroege hints verzonden bij verzoeken om subresources.
  • Vroege hints verzonden op iframe-hoofdbronverzoeken.
  • Ondersteuning voor prefetch in Early Hints.

We zijn blij met uw inbreng over welke aspecten prioriteit moeten krijgen en hoe u Early Hints verder kunt verbeteren.

Relatie met H2/Push

Als u bekend bent met de verouderde HTTP2/Push-functie , vraagt ​​u zich misschien af ​​hoe Early Hints verschilt. Terwijl Early Hints een retourvlucht vereist voordat de browser begint met het ophalen van kritieke subbronnen, kan de server met HTTP2/Push naast het antwoord ook subbronnen gaan pushen. Hoewel dit geweldig klinkt, resulteerde dit in een belangrijk structureel nadeel: met HTTP2/Push was het uiterst moeilijk om te voorkomen dat subbronnen werden gepusht die de browser al had. Dit "over-push"-effect resulteerde in een minder efficiënt gebruik van de netwerkbandbreedte, wat de prestatievoordelen aanzienlijk belemmerde. Over het geheel genomen bleek uit Chrome-gegevens dat HTTP2/Push in feite een negatief effect had op de prestaties op internet.

Daarentegen presteert Early Hints in de praktijk beter omdat het de mogelijkheid combineert om een ​​voorlopig antwoord te sturen met hints die de browser de leiding geven over het ophalen of verbinden met wat hij werkelijk nodig heeft. Hoewel Early Hints niet alle gebruiksscenario's dekt die HTTP2/Push in theorie zou kunnen aanpakken, zijn wij van mening dat Early Hints een meer praktische oplossing is om de navigatie te versnellen.

Miniatuurafbeelding door Pierre Bamin .

,

Ontdek hoe uw server hints naar de browser kan sturen over kritieke subbronnen.

Wat zijn vroege hints?

Websites zijn in de loop van de tijd steeds geavanceerder geworden. Als zodanig is het niet ongebruikelijk dat een server niet-triviaal werk moet uitvoeren (bijvoorbeeld toegang tot databases of CDN's die toegang krijgen tot de oorspronkelijke server) om de HTML voor de opgevraagde pagina te produceren. Helaas resulteert deze "server-denktijd" in extra latentie voordat de browser de pagina kan weergeven. De verbinding blijft feitelijk inactief zolang de server nodig heeft om het antwoord voor te bereiden.

Afbeelding van de server, denk aan een tijdsverschil van 200 ms tussen het laden van de pagina en het laden van andere bronnen.
Zonder vroege tips: alles wordt geblokkeerd op de server en bepaalt hoe er moet worden gereageerd op de hoofdbron.

Early Hints is een HTTP-statuscode ( 103 Early Hints ) die wordt gebruikt om een ​​voorlopig HTTP-antwoord te verzenden voorafgaand aan een definitief antwoord. Hierdoor kan een server hints naar de browser sturen over kritieke subbronnen (bijvoorbeeld stijlbladen voor de pagina, essentieel JavaScript) of oorsprongen die waarschijnlijk door de pagina zullen worden gebruikt, terwijl de server bezig is met het genereren van de hoofdbron. De browser kan deze hints gebruiken om verbindingen op te warmen en subbronnen op te vragen, terwijl hij wacht op de hoofdbron. Met andere woorden, Early Hints helpt de browser voordeel te halen uit deze "server-denktijd" door vooraf wat werk te doen, waardoor het laden van pagina's wordt versneld.

Afbeelding die laat zien hoe Early Hints ervoor zorgt dat de pagina een gedeeltelijk antwoord verzendt.
Met Early Hints: de server kan een gedeeltelijk antwoord geven met resource-hints, terwijl hij het uiteindelijke antwoord bepaalt

In sommige gevallen kan de prestatieverbetering van de Largest Contentful Paint variëren van enkele honderden milliseconden, zoals waargenomen door Shopify en door Cloudflare , en tot een seconde sneller, zoals te zien in deze vergelijking voor en na:

Vergelijking van twee sites.
Voor/na vergelijking van vroege tips op een testwebsite uitgevoerd met WebPageTest (Moto G4 - DSL)

Hoe u vroege tips kunt gebruiken

De eerste stap om te profiteren van Early Hints bestaat uit het identificeren van de beste landingspagina's, dat wil zeggen de pagina's waar uw gebruikers doorgaans beginnen wanneer ze uw website bezoeken. Dit kan de startpagina zijn, of populaire pagina's met productvermeldingen als er veel gebruikers afkomstig zijn van andere websites. De reden dat deze toegangspunten belangrijker zijn dan andere pagina's is omdat het nut van Early Hints afneemt naarmate de gebruiker door uw website navigeert (dat wil zeggen dat de browser waarschijnlijk alle subbronnen heeft die hij nodig heeft bij de tweede of derde volgende navigatie). Het is ook altijd een goed idee om een ​​geweldige eerste indruk achter te laten!

Nu u over deze geprioriteerde lijst met bestemmingspagina's beschikt, is de volgende stap het identificeren welke oorsprongen of subbronnen goede kandidaten zouden zijn voor preconnect of preload -hints. Normaal gesproken zijn dit de herkomsten en subbronnen die het meest bijdragen aan belangrijke gebruikersstatistieken, zoals Largest Contentful Paint of First Contentful Paint . Meer concreet: zoek naar subbronnen die het renderen blokkeren, zoals synchroon JavaScript, stylesheets of zelfs weblettertypen. Zoek op dezelfde manier naar oorsprongen die subresources hosten die veel bijdragen aan de belangrijkste gebruikersstatistieken.

Houd er ook rekening mee dat als uw belangrijkste bronnen al gebruik maken van preconnect of preload , u deze bronnen of bronnen kunt beschouwen als kandidaten voor Early Hints. Zie hoe u LCP kunt optimaliseren voor meer details. Het is echter mogelijk dat het naïef kopiëren van de preconnect en preload -richtlijnen van HTML naar Early Hints niet optimaal is .

Wanneer u deze in HTML gebruikt, wilt u doorgaans bronnen preconnect of preload die de Preload Scanner niet in de HTML zal ontdekken, bijvoorbeeld lettertypen of achtergrondafbeeldingen die anders te laat ontdekt zouden worden. Voor Early Hints beschikt u niet over de HTML, dus kunt u in plaats daarvan vooraf preconnect met kritieke domeinen of kritieke bronnen preload die anders misschien vroeg in de HTML zouden worden ontdekt, bijvoorbeeld door main.css of app.js vooraf te laden. Bovendien ondersteunen niet alle browsers het preload van Early Hints, zie Browserondersteuning .

De tweede stap bestaat uit het minimaliseren van het risico van het gebruik van Early Hints op hulpbronnen of oorsprongen die mogelijk verouderd zijn of niet langer door de hoofdbron worden gebruikt. Bronnen die regelmatig worden bijgewerkt en voorzien van een versienummer (bijvoorbeeld example.com/css/main.fa231e9c.css ) zijn bijvoorbeeld mogelijk niet de beste keuze. Houd er rekening mee dat dit probleem niet specifiek geldt voor Early Hints, maar voor elke preload of preconnect waar deze ook aanwezig is. Dit is het soort details dat het beste kan worden afgehandeld met automatisering of sjablonen (een handmatig proces leidt bijvoorbeeld eerder tot niet-overeenkomende hash- of versie-URL's tussen preload en de daadwerkelijke HTML-tag die de bron gebruikt).

Beschouw als voorbeeld de volgende stroom:

GET /main.html
Host: example.com
User-Agent: [....] Chrome/103.0.0.0 [...]

De server voorspelt dat main.abcd100.css nodig zal zijn, en stelt voor om het vooraf te laden met behulp van Early Hints:

103 Early Hints
Link: </main.abcd100.css>; rel=preload; as=style
[...]

Enkele ogenblikken later wordt de webpagina, inclusief de gekoppelde CSS, weergegeven. Helaas wordt deze CSS-bron regelmatig bijgewerkt en ligt de hoofdbron al vijf versies voor ( abcd105 ) op de voorspelde CSS-bron ( abcd100 ).

200 OK
[...]
<HTML>
<head>
   <title>Example</title>
   <link rel="stylesheet" href="/main.abcd105.css">

Streef in het algemeen naar hulpbronnen en herkomsten die redelijk stabiel zijn, en grotendeels onafhankelijk van de uitkomst van de belangrijkste hulpbron. Indien nodig kunt u overwegen uw belangrijkste bronnen in tweeën te splitsen: een stabiel deel dat is ontworpen om te worden gebruikt met Early Hints, en een dynamischer deel dat moet worden opgehaald nadat de hoofdbron door de browser is ontvangen:

<HTML>
<head>
   <title>Example</title>
   <link rel="stylesheet" href="/main.css">
   <link rel="stylesheet" href="/experimental.3eab3290.css">

Tenslotte, aan de serverkant, zoek naar belangrijke bronverzoeken die worden verzonden door browsers waarvan bekend is dat ze Early Hints ondersteunen, en reageer onmiddellijk met 103 Early Hints. Neem in het 103-antwoord de relevante preconnect- en preload-hints op. Zodra de hoofdbron gereed is, volgt u het gebruikelijke antwoord (bijvoorbeeld 200 OK indien succesvol). Voor achterwaartse compatibiliteit is het een goede gewoonte om ook Link HTTP-headers op te nemen in het uiteindelijke antwoord, misschien zelfs aangevuld met kritieke bronnen die duidelijk werden tijdens het genereren van de hoofdbron (bijvoorbeeld het dynamische deel van een sleutelbron als je de suggestie 'in tweeën splitsen' hebt gevolgd). Hier is hoe dit eruit zou zien:

GET /main.html
Host: example.com
User-Agent: [....] Chrome/103.0.0.0 [...]
103 Early Hints
Link: <https://fonts.google.com>; rel=preconnect
Link: </main.css>; rel=preload; as=style
Link: </common.js>; rel=preload; as=script

Enkele ogenblikken later:

200 OK
Content-Length: 7531
Content-Type: text/html; charset=UTF-8
Content-encoding: br
Link: <https://fonts.google.com>; rel=preconnect
Link: </main.css>; rel=preload; as=style
Link: </common.js>; rel=preload; as=script
Link: </experimental.3eab3290.css>; rel=preload; as=style
<HTML>
<head>
   <title>Example</title>
   <link rel="stylesheet" href="/main.css">
   <link rel="stylesheet" href="/experimental.3eab3290.css">
   <script src="/common.js"></script>
   <link rel="preconnect" href="https://fonts.googleapis.com">

Browser-ondersteuning

Hoewel 103 Early Hints in alle grote browsers wordt ondersteund, verschillen de richtlijnen die op een Early Hint kunnen worden verzonden per browser:

Ondersteuning vooraf verbinden:

Browser Support

  • Chroom: 103.
  • Rand: 103.
  • Firefox: 120.
  • Safari: 17.

Ondersteuning voorladen:

Browser Support

  • Chroom: 103.
  • Rand: 103.
  • Firefox: 123.
  • Safari: niet ondersteund.

Chrome DevTools biedt ook ondersteuning voor 103 Early Hints en de Link headers zijn te zien in de documentbronnen:

Netwerkpaneel met Early Hints-headers
Vroege hints Link worden weergegeven in Chrome DevTools.

Let op: als u de Early Hints-bronnen wilt gebruiken, mag Disable cache niet zijn aangevinkt in DevTools, omdat Early Hints de browsercache gebruikt. Voor vooraf geladen bronnen wordt de initiator weergegeven als early-hints en de grootte als (Disk cache) :

Netwerkpaneel met initiatiefnemers van Early Hints
Early Hinted-bronnen hebben een early-hints -initiator en worden geladen vanuit de schijfcache.

Dit vereist ook een vertrouwd certificaat voor HTTPS-testen.

Firefox (vanaf v126) heeft geen expliciete 103 Early Hints-ondersteuning in DevTools, maar bronnen die zijn geladen met Early Hints tonen geen HTTP-headerinformatie, wat een indicator is dat ze zijn geladen via Early Hints.

Serverondersteuning

Hier is een korte samenvatting van het ondersteuningsniveau voor Early Hints onder populaire open source-software HTTP-serversoftware:

Schakel vroege hints op de eenvoudigere manier in

Als u een van de volgende CDN's of platforms gebruikt, hoeft u Early Hints mogelijk niet handmatig te implementeren. Raadpleeg de online documentatie van uw leverancier van oplossingen om erachter te komen of deze Early Hints ondersteunt, of raadpleeg de niet-uitputtende lijst hier:

Hoe u problemen kunt voorkomen voor klanten die Early Hints niet ondersteunen

Informatieve HTTP-reacties in het bereik van 100 maken deel uit van de HTTP-standaard, maar sommige oudere clients of bots kunnen hier moeite mee hebben omdat ze vóór de lancering van 103 Early Hints zelden werden gebruikt voor algemeen surfen op het internet.

Alleen het uitzenden van 103 vroege hints als reactie op clients die een sec-fetch-mode: navigate de HTTP-verzoekheader moet ervoor zorgen dat dergelijke hints alleen worden verzonden naar nieuwere clients die begrijpen dat ze op het volgende antwoord moeten wachten. Omdat Early Hints alleen worden ondersteund bij navigatieverzoeken (zie huidige beperkingen ), heeft dit bovendien het extra voordeel dat wordt vermeden dat deze onnodig worden verzonden bij andere verzoeken.

Bovendien wordt aanbevolen dat Early Hints alleen via HTTP/2- of HTTP/3-verbindingen worden verzonden en dat de meeste browsers deze alleen via die protocollen accepteren.

Geavanceerd patroon

Als u Early Hints volledig heeft toegepast op uw belangrijkste bestemmingspagina's en merkt dat u op zoek bent naar meer mogelijkheden, bent u wellicht geïnteresseerd in het volgende geavanceerde patroon.

Voor bezoekers die zich op hun zoveelste paginaverzoek bevinden als onderdeel van een typische gebruikersreis, wilt u wellicht de Early Hints-reactie aanpassen aan inhoud die zich lager en dieper op de pagina bevindt, met andere woorden: Early Hints gebruiken voor bronnen met een lagere prioriteit. Dit klinkt misschien contra-intuïtief, aangezien we hebben aanbevolen om ons te concentreren op subbronnen of oorsprongen met hoge prioriteit en die het renderen blokkeren. Tegen de tijd dat een bezoeker een tijdje heeft genavigeerd, is het echter zeer waarschijnlijk dat zijn browser al over alle essentiële bronnen beschikt. Vanaf dat moment kan het zinvol zijn om uw aandacht te verleggen naar bronnen met een lagere prioriteit. Dit kan bijvoorbeeld betekenen dat u Early Hints gebruikt om productafbeeldingen te laden, of dat u extra JS/CSS gebruikt die alleen nodig is voor minder vaak voorkomende gebruikersinteracties.

Huidige beperkingen

Dit zijn de beperkingen van Early Hints zoals geïmplementeerd in Chrome:

  • Alleen beschikbaar voor navigatieverzoeken (dat wil zeggen de hoofdbron voor het document op het hoogste niveau).
  • Ondersteunt alleen preconnect en preload (dat wil zeggen, prefetch wordt niet ondersteund).
  • Vroege hints gevolgd door een cross-origin-omleiding op het uiteindelijke antwoord zullen ertoe leiden dat Chrome de bronnen en verbindingen laat vallen die het heeft verkregen met vroege hints.
  • Bronnen die vooraf zijn geladen met Early Hints, worden opgeslagen in de HTTP-cache en daar later door de pagina opgehaald. Daarom kunnen alleen cachebare bronnen vooraf worden geladen met behulp van Early Hints, anders wordt de resource dubbel opgehaald (een keer door de Early Hints en opnieuw door het document). In Chrome is de HTTP-cache uitgeschakeld voor niet-vertrouwde HTTPS-certificaten (zelfs als u doorgaat met het laden van de pagina).
  • Het vooraf laden van responsieve afbeeldingen (met behulp van imagesrcset , imagesizes of media ) wordt niet ondersteund met HTTP <link> headers, omdat de viewport pas wordt gedefinieerd als het document is gemaakt. Dit betekent dat 103 Early hints niet kunnen worden gebruikt om responsieve afbeeldingen vooraf te laden en dat de onjuiste afbeelding kan worden geladen wanneer deze hiervoor wordt gebruikt. Volg deze discussie over voorstellen om hier beter mee om te gaan .

Andere browsers hebben vergelijkbare beperkingen en, zoals eerder opgemerkt , beperken sommige browsers de vroege hints verder tot alleen preconnect .

Wat is het volgende?

Afhankelijk van de interesse van de gemeenschap kunnen we onze implementatie van Early Hints uitbreiden met de volgende mogelijkheden:

  • Vroege tips voor niet-cachebare bronnen die de geheugencache gebruiken in plaats van de HTTP-cache.
  • Vroege hints verzonden bij verzoeken om subresources.
  • Vroege hints verzonden op iframe-hoofdbronverzoeken.
  • Ondersteuning voor prefetch in Early Hints.

We zijn blij met uw inbreng over welke aspecten prioriteit moeten krijgen en hoe u Early Hints verder kunt verbeteren.

Relatie met H2/Push

Als u bekend bent met de verouderde HTTP2/Push-functie , vraagt ​​u zich misschien af ​​hoe Early Hints verschilt. Terwijl Early Hints een retourvlucht vereist voordat de browser begint met het ophalen van kritieke subbronnen, kan de server met HTTP2/Push naast het antwoord ook subbronnen gaan pushen. Hoewel dit geweldig klinkt, resulteerde dit in een belangrijk structureel nadeel: met HTTP2/Push was het uiterst moeilijk om te voorkomen dat subbronnen werden gepusht die de browser al had. Dit "over-push"-effect resulteerde in een minder efficiënt gebruik van de netwerkbandbreedte, wat de prestatievoordelen aanzienlijk belemmerde. Over het geheel genomen bleek uit Chrome-gegevens dat HTTP2/Push feitelijk negatief was voor de prestaties op internet.

Daarentegen presteert Early Hints in de praktijk beter omdat het de mogelijkheid combineert om een ​​voorlopig antwoord te sturen met hints die de browser de leiding geven over het ophalen of verbinden met wat hij werkelijk nodig heeft. Hoewel Early Hints niet alle gebruiksscenario's dekt die HTTP2/Push in theorie zou kunnen aanpakken, zijn wij van mening dat Early Hints een meer praktische oplossing is om de navigatie te versnellen.

Miniatuurafbeelding door Pierre Bamin .

,

Ontdek hoe uw server hints naar de browser kan sturen over kritieke subbronnen.

Wat zijn vroege hints?

Websites zijn in de loop van de tijd steeds geavanceerder geworden. Als zodanig is het niet ongebruikelijk dat een server niet-triviaal werk moet uitvoeren (bijvoorbeeld toegang tot databases of CDN's die toegang krijgen tot de oorspronkelijke server) om de HTML voor de opgevraagde pagina te produceren. Helaas resulteert deze "server-denktijd" in extra latentie voordat de browser de pagina kan weergeven. De verbinding blijft feitelijk inactief zolang de server nodig heeft om het antwoord voor te bereiden.

Afbeelding van de server, denk aan een tijdsverschil van 200 ms tussen het laden van de pagina en het laden van andere bronnen.
Zonder vroege tips: alles wordt geblokkeerd op de server en bepaalt hoe er moet worden gereageerd op de hoofdbron.

Early Hints is een HTTP-statuscode ( 103 Early Hints ) die wordt gebruikt om een ​​voorlopig HTTP-antwoord te verzenden voorafgaand aan een definitief antwoord. Hierdoor kan een server hints naar de browser sturen over kritieke subbronnen (bijvoorbeeld stijlbladen voor de pagina, kritisch JavaScript) of oorsprongen die waarschijnlijk door de pagina zullen worden gebruikt, terwijl de server bezig is met het genereren van de hoofdbron. De browser kan deze hints gebruiken om verbindingen op te warmen en subbronnen op te vragen, terwijl hij wacht op de hoofdbron. Met andere woorden, Early Hints helpt de browser voordeel te halen uit deze "server-denktijd" door vooraf wat werk te doen, waardoor het laden van pagina's wordt versneld.

Afbeelding die laat zien hoe Early Hints ervoor zorgt dat de pagina een gedeeltelijk antwoord verzendt.
Met Early Hints: de server kan een gedeeltelijk antwoord geven met resource-hints, terwijl hij het uiteindelijke antwoord bepaalt

In sommige gevallen kan de prestatieverbetering van de Largest Contentful Paint variëren van enkele honderden milliseconden, zoals waargenomen door Shopify en door Cloudflare , en tot een seconde sneller, zoals te zien in deze vergelijking voor en na:

Vergelijking van twee sites.
Voor/na vergelijking van vroege tips op een testwebsite uitgevoerd met WebPageTest (Moto G4 - DSL)

Hoe u vroege tips kunt gebruiken

De eerste stap om te profiteren van Early Hints bestaat uit het identificeren van de beste landingspagina's, dat wil zeggen de pagina's waar uw gebruikers doorgaans beginnen wanneer ze uw website bezoeken. Dit kan de startpagina zijn, of populaire pagina's met productvermeldingen als er veel gebruikers afkomstig zijn van andere websites. De reden dat deze toegangspunten belangrijker zijn dan andere pagina's is omdat het nut van Early Hints afneemt naarmate de gebruiker door uw website navigeert (dat wil zeggen dat de browser waarschijnlijk alle subbronnen heeft die hij nodig heeft bij de tweede of derde volgende navigatie). Het is ook altijd een goed idee om een ​​geweldige eerste indruk achter te laten!

Nu u over deze geprioriteerde lijst met bestemmingspagina's beschikt, is de volgende stap het identificeren welke oorsprongen of subbronnen goede kandidaten zouden zijn voor preconnect of preload -hints. Normaal gesproken zijn dit de herkomsten en subbronnen die het meest bijdragen aan belangrijke gebruikersstatistieken, zoals Largest Contentful Paint of First Contentful Paint . Meer concreet: zoek naar subbronnen die het renderen blokkeren, zoals synchroon JavaScript, stylesheets of zelfs weblettertypen. Zoek op dezelfde manier naar oorsprongen die subresources hosten die veel bijdragen aan de belangrijkste gebruikersstatistieken.

Houd er ook rekening mee dat als uw belangrijkste bronnen al gebruik maken van preconnect of preload , u deze bronnen of bronnen kunt beschouwen als kandidaten voor Early Hints. Zie hoe u LCP kunt optimaliseren voor meer details. Het is echter mogelijk dat het naïef kopiëren van de preconnect en preload -richtlijnen van HTML naar Early Hints niet optimaal is .

Wanneer u deze in HTML gebruikt, wilt u doorgaans bronnen preconnect of preload die de Preload Scanner niet in de HTML zal ontdekken, bijvoorbeeld lettertypen of achtergrondafbeeldingen die anders te laat ontdekt zouden worden. Voor Early Hints beschikt u niet over de HTML, dus kunt u in plaats daarvan vooraf preconnect met kritieke domeinen of kritieke bronnen preload die anders misschien vroeg in de HTML zouden worden ontdekt, bijvoorbeeld door main.css of app.js vooraf te laden. Bovendien ondersteunen niet alle browsers het preload van Early Hints, zie Browserondersteuning .

De tweede stap bestaat uit het minimaliseren van het risico van het gebruik van Early Hints op hulpbronnen of oorsprongen die mogelijk verouderd zijn of niet langer door de hoofdbron worden gebruikt. Bronnen die regelmatig worden bijgewerkt en voorzien van een versienummer (bijvoorbeeld example.com/css/main.fa231e9c.css ) zijn bijvoorbeeld mogelijk niet de beste keuze. Merk op dat deze bezorgdheid niet specifiek is voor vroege hints, deze is van toepassing op elke preload of preconnect waar ze ook aanwezig zijn. Dit is het soort detail dat het beste kan worden behandeld met automatisering of sjablonen (een handmatig proces is bijvoorbeeld waarschijnlijker dat leidt tot niet -overeenkomende hash- of versie -URL's tussen preload en de werkelijke HTML -tag met behulp van de bron).

Overweeg als voorbeeld de volgende stroom:

GET /main.html
Host: example.com
User-Agent: [....] Chrome/103.0.0.0 [...]

De server voorspelt dat main.abcd100.css nodig is en suggereert het voor het laden van vroege hints:

103 Early Hints
Link: </main.abcd100.css>; rel=preload; as=style
[...]

Enkele ogenblikken later wordt de webpagina, inclusief de gekoppelde CSS geserveerd. Helaas wordt deze CSS -bron vaak bijgewerkt en is de hoofdbron al vijf versies vooruit ( abcd105 ) van de voorspelde CSS -bron ( abcd100 ).

200 OK
[...]
<HTML>
<head>
   <title>Example</title>
   <link rel="stylesheet" href="/main.abcd105.css">

Over het algemeen streef het naar middelen en oorsprong die redelijk stabiel zijn en grotendeels onafhankelijk zijn van de uitkomst voor de hoofdbron. Indien nodig kunt u overwegen uw belangrijkste bronnen in twee te splitsen: een stabiel onderdeel dat is ontworpen om te worden gebruikt met vroege hints, en een meer dynamisch deel dat nog moet worden opgehaald nadat de hoofdbron door de browser is ontvangen:

<HTML>
<head>
   <title>Example</title>
   <link rel="stylesheet" href="/main.css">
   <link rel="stylesheet" href="/experimental.3eab3290.css">

Ten slotte, aan de serverzijde, zoek naar hoofdbronnenaanvragen die worden verzonden door browsers die bekend zijn om vroege hints te ondersteunen en reageert onmiddellijk met 103 vroege hints. Neem in de 103 -respons de relevante voorverbinding- en voorbelastingshints op. Zodra de hoofdbron klaar is, volgt u de gebruikelijke reactie op (bijvoorbeeld 200 OK indien succesvol). Voor achterwaartse compatibiliteit is het een goede praktijk om ook Link HTTP -headers op te nemen in het definitieve antwoord, misschien zelfs aan het vergroten met kritische bronnen die duidelijk werden als onderdeel van het genereren van de belangrijkste bron (bijvoorbeeld het dynamische deel van een belangrijke bron als u de "Split in twee" suggestie volgde). Hier is hoe dit eruit zou zien:

GET /main.html
Host: example.com
User-Agent: [....] Chrome/103.0.0.0 [...]
103 Early Hints
Link: <https://fonts.google.com>; rel=preconnect
Link: </main.css>; rel=preload; as=style
Link: </common.js>; rel=preload; as=script

Enkele ogenblikken later:

200 OK
Content-Length: 7531
Content-Type: text/html; charset=UTF-8
Content-encoding: br
Link: <https://fonts.google.com>; rel=preconnect
Link: </main.css>; rel=preload; as=style
Link: </common.js>; rel=preload; as=script
Link: </experimental.3eab3290.css>; rel=preload; as=style
<HTML>
<head>
   <title>Example</title>
   <link rel="stylesheet" href="/main.css">
   <link rel="stylesheet" href="/experimental.3eab3290.css">
   <script src="/common.js"></script>
   <link rel="preconnect" href="https://fonts.googleapis.com">

Browser-ondersteuning

Hoewel 103 vroege hints worden ondersteund in alle grote browsers, verschillen de richtlijnen die op een vroege hint kunnen worden verzonden per browser:

PreConnect -ondersteuning:

Browser Support

  • Chrome: 103.
  • Edge: 103.
  • Firefox: 120.
  • Safari: 17.

Voorspanningsondersteuning:

Browser Support

  • Chrome: 103.
  • Edge: 103.
  • Firefox: 123.
  • Safari: niet ondersteund.

Chrome Devtools heeft ook 103 vroege ondersteuning voor hints en de Link zijn te zien op de documentbronnen:

Netwerkpaneel met vroege hints headers
Vroege hints Link worden weergegeven in Chrome Devtools.

OPMERKING Om de vroege hintbronnen te gebruiken, mag Disable cache niet in devtools worden aangevinkt, omdat vroege hints de browsercache gebruiken. Voor vooraf geladen bronnen zal de initiator als early-hints en de grootte als (Disk cache) weergeven:

Netwerkpaneel met vroege hints initiatiefnemers
Vroege aangegeven bronnen hebben een early-hints initiator en worden geladen uit de schijfcache.

Dit vereist ook een vertrouwd certificaat voor HTTPS -testen.

Firefox (vanaf V126) heeft geen expliciete 103 vroege hintsondersteuning in Devtools, maar bronnen geladen met behulp van vroege hints tonen geen HTTP -headerinformatie die een indicator is die ze werden geladen door vroege hints.

Serverondersteuning

Hier is een snelle samenvatting van het ondersteuningsniveau voor vroege hints tussen populaire open source software HTTP -serversoftware:

Schakel vroege hints op de gemakkelijkere manier in

Als u een van de volgende CDN's of platforms gebruikt, hoeft u mogelijk niet handmatig vroege hints te implementeren. Raadpleeg de online documentatie van uw oplossingsprovider om erachter te komen of deze vroege hints ondersteunt, of verwijzen hier naar de niet-uithoogte-lijst:

Hoe u problemen kunt voorkomen voor klanten die geen vroege tips ondersteunen

Informatieve HTTP -antwoorden in het 100 -bereik maken deel uit van de HTTP -standaard, maar sommige oudere klanten of bots kunnen hiermee worstelen, omdat ze voorafgaand aan de lancering van 103 vroege hints zelden werden gebruikt voor algemene webbrowsen.

Slechts 103 vroege hints uitzenden in reactie op klanten die een sec-fetch-mode: navigate HTTP-aanvraagheader heeft ervoor dat dergelijke hints alleen worden verzonden voor nieuwere clients die begrijpen dat ze wachten op het daaropvolgende antwoord. Aangezien vroege hints alleen worden ondersteund over navigatieverzoeken (zie huidige beperkingen ), heeft dit het extra voordeel dat deze niet onnodig wordt verzenden deze op andere verzoeken te verzenden.

Bovendien worden vroege hints aanbevolen om alleen te worden verzonden via HTTP/2- of HTTP/3 -verbindingen en zullen de meeste browsers ze alleen accepteren via die protocollen.

Geavanceerd patroon

Als u volledig vroege tips hebt toegepast op uw belangrijkste bestemmingspagina's en merkt dat u op zoek bent naar meer kansen, bent u misschien geïnteresseerd in het volgende geavanceerde patroon.

Voor bezoekers die op hun Nth Page-verzoek staan ​​als onderdeel van een typische gebruikersreis, wilt u misschien de vroege tips-reactie aanpassen aan inhoud die lager en dieper op de pagina is, met andere woorden met behulp van vroege hints op bronnen met een lagere prioriteit. Dit klinkt misschien contra-intuïtief, gezien het feit dat we hebben aanbevolen om te focussen op hoge prioriteit, render-blokkerende subresources of oorsprong. Tegen de tijd dat een bezoeker een tijdje heeft genavigeerd, is het echter zeer waarschijnlijk dat hun browser al alle kritieke bronnen heeft. Vanaf dat moment kan het logisch zijn om uw aandacht te wisselen naar middelen met een lagere prioriteit. Dit kan bijvoorbeeld betekenen dat vroege hints worden gebruikt om productafbeeldingen te laden, of extra JS/CSS die alleen nodig zijn voor minder gebruikelijke gebruikersinteracties.

Huidige beperkingen

Hier zijn de beperkingen van vroege hints zoals geïmplementeerd in Chrome:

  • Alleen beschikbaar voor navigatieverzoeken (dat wil zeggen de belangrijkste bron voor het document op het hoogste niveau).
  • Ondersteunt alleen preconnect en preload (dat wil zeggen, prefetch wordt niet ondersteund).
  • Vroege hints gevolgd door een cross-origin-omleiding op de uiteindelijke respons zullen ertoe leiden dat chroom de bronnen en verbindingen die het heeft verkregen met vroege hints laten vallen.
  • Bronnen die vooraf worden geladen met behulp van vroege hints worden opgeslagen in de HTTP -cache en later door de pagina opgehaald. Daarom kunnen alleen catolly bronnen worden voorgeladen met behulp van vroege hints of wordt de bron dubbel opgehaald (eenmaal door de vroege hints en opnieuw door het document). In Chrome is de HTTP -cache uitgeschakeld voor niet -vertrouwde HTTPS -certificaten (zelfs als u de pagina overgaat).
  • Pre -loading responsieve afbeeldingen (met behulp van imagesrcset , imagesizes of media ) worden niet ondersteund met behulp van HTTP <link> headers omdat de Viewport niet wordt gedefinieerd totdat het document is gemaakt. Dit betekent dat 103 vroege hints niet kunnen worden gebruikt om responsieve afbeeldingen voor te laden en het onjuiste beeld kan laden wanneer deze hiervoor wordt gebruikt. Volg deze discussie over voorstellen over hoe u dit beter kunt omgaan .

Andere browsers hebben vergelijkbare beperkingen en, zoals eerder opgemerkt , beperken sommigen 103 vroege hints verder alleen tot preconnect .

Wat is het volgende?

Afhankelijk van de interesse van de gemeenschap, kunnen we onze implementatie van vroege hints vergroten met de volgende mogelijkheden:

  • Vroege hints voor niet -beheerde bronnen met behulp van de geheugencache in plaats van de HTTP -cache.
  • Vroege hints verzonden op subresource -aanvragen.
  • Vroege hints verzonden op IFRAME Hoofdbronnenverzoeken.
  • Ondersteuning voor prefetch in vroege hints.

Wij verwelkomen uw input over welke aspecten u moet prioriteren en hoe u vroege hints verder kunt verbeteren.

Relatie met H2/push

Als u bekend bent met de verouderde HTTP2/push -functie , vraagt ​​u zich misschien af ​​hoe vroege hints verschilt. Terwijl vroege hints een retour vereist voor de browser om kritische subresources op te halen, kan de server met HTTP2/push beginnen met het pushen van subresources naast de reactie. Hoewel dit geweldig klinkt, resulteerde dit in een belangrijk structureel nadeel: met http2/push was het extreem moeilijk om te voorkomen dat de onderbrekingen die de browser al had. Dit "overboord" -effect resulteerde in een minder efficiënt gebruik van de netwerkbandbreedte, wat de prestatievoordelen aanzienlijk belemmerde. Over het algemeen toonden Chrome -gegevens aan dat HTTP2/PUSH in feite een netto negatief was voor prestaties op internet.

Vroege hints daarentegen presteren in de praktijk beter omdat het de mogelijkheid combineert om een ​​voorlopig antwoord te sturen met hints die de browser verantwoordelijk maken voor het ophalen of verbinden met, wat het eigenlijk nodig heeft. Hoewel vroege hints niet alle use cases bestrijken die HTTP2/push in theorie zou kunnen aanpakken, zijn we van mening dat vroege hints een meer praktische oplossing zijn voor het versnellen van navigaties.

Miniatuurafbeelding door Pierre Bamin .