Ich habe die Google-Folien für die so genannte Voroptimierung gelesen. (Für diejenigen interessiert oder für diejenigen, die nicht wissen, was ich rede, diese Folie fasst es zusammen.)
In HTML5 können wir Seiten im Element link
vorabholen und vorrendern. Hier eine Übersicht. Wir können die rel
Werte verwenden dns-prefetch
, subresource
, prefetch
und prerender
.
Die erste verwirrend ist, dass offenbar nur prefetch
liegt im die spec für HTML5 ( und 5.1 ), aber keiner der anderen sind. ( Yet! ) Die zweite, dass Browser-Unterstützung ist OK für ( dns-
) prefetch
, aber ziemlich schlecht für die anderen. Besonders die mangelnde Unterstützung von Firefox für prerender
ist nervig.
Drittens stellt sich die Frage, die ich mir stelle, folgende: Tritt das Prefetching (oder eine andere Methode) auf, sobald der Browser die Zeile liest (und dann die aktuelle Seitenladung blockiert), oder wartet es? mit dem Laden der Ressourcen im Hintergrund, bis die aktuelle Seite vollständig geladen ist?
Wenn es synchron blockierend geladen wird, gibt es eine Möglichkeit, dies asynchron oder nach dem Laden der Seite zu tun? Ich nehme an, mit einer JS-Lösung wie dieser, aber ich bin mir nicht sicher, dass es dann asynchron laufen wird.
%Vor%Bitte beantworten Sie beide Fragen, falls zutreffend!
Nach dem Lesen durch die Editor Entwurf von Ressourcen Hints ich folgende (Hervorhebung von mir) gefunden:
Ressourcenabrufe, die für die nächste Navigation erforderlich sein können negative Auswirkungen auf die Leistung des aktuellen Navigationskontextes aufgrund zusätzlicher Konkurrenz für CPU, GPU, Speicher und Netzwerk Ressourcen. Um dies zu beheben, sollte der Benutzeragent Logik implementieren reduzieren und eliminieren solche Konflikte:
- Ressourcenabrufe, die für die nächste Navigation erforderlich sind, sollten niedriger sein relative Priorität und sollte Ressource nicht blockieren oder stören Abrufvorgänge, die für den aktuellen Navigationskontext erforderlich sind.
- Der optimale Zeitpunkt, um einen für die nächste Navigation erforderlichen Ressourcenabruf einzuleiten, ist abhängig vom ausgehandelten Transportprotokoll, aktuelle Benutzer Konnektivitätsprofil, verfügbare Geräteressourcen und anderer Kontext spezifische Variablen. Der Benutzeragent muss das Optimum bestimmen Zeitpunkt, zu dem der Abruf eingeleitet werden soll - z. der Benutzeragent kann entscheiden zu warten, bis alle anderen Downloads beendet sind oder wählen können Pipeline-Anfragen mit niedriger Priorität, wenn das ausgehandelte Protokoll unterstützt die notwendigen Primitiven. Alternativ kann der User Agent Deaktivieren Sie den Aufruf aufgrund von Ressourcenbeschränkungen, Benutzer Präferenzen oder andere Faktoren.
Beachten Sie, wie sehr der Benutzeragent dies oder das tun darf. Ich befürchte wirklich, dass dies zu verschiedenen Implementierungen von verschiedenen Browsern führen wird, was wiederum zu einer Divergenz führen wird.
Die Frage bleibt jedoch. Es ist mir nicht klar, ob das Laden einer externen Ressource mit prefetch
oder einer anderen synchron erfolgt (und somit im Kopf, bevor der Inhalt geladen wird) oder asynchron (mit einer niedrigeren Priorität). Ich rate Letzteres, obwohl ich nicht verstehe, wie das möglich ist, weil es nichts in der link
-Spezifikation gibt, die das asynchrone Laden des Inhalts von Verbindungselementen erlauben würde.
Disclaimer: Ich habe nicht viel Zeit mit diesen Spezifikationen verbracht, also ist es sehr wahrscheinlich, dass ich einen wichtigen Punkt verpasst habe.
Das heißt, mein Lesevorgang stimmt mit dem Ihren überein: Wenn eine Ressource als Ergebnis einer pre
-Optimierung abgerufen wird, wird sie wahrscheinlich asynchron abgerufen, und es gibt wenig Garantie dafür, wo in der Pipeline erwartet werden sollte, dass sie abgerufen wird .
Die Absicht scheint eher beratend als präskriptiv zu sein, genau wie das CSS will-change
-Attribut weist Rendering-Engines darauf hin, dass ein Element besondere Aufmerksamkeit erhalten sollte, aber nicht das Verhalten vorschreibt, oder dass ein bestimmtes Verhalten sein sollte .
In der Link-Spezifikation gibt es nichts, das das asynchrone Laden des Inhalts von Link-Elementen ermöglichen würde.
Nicht alle Links würden in jedem Fall Inhalte laden (ein author
-Typ würde nicht dazu führen, dass der UA den Inhalt einer mailto:
URL herunterlädt), und ich kann keine Erwähnung finden, wie Ressourcen in der Spezifikation abgerufen werden Ansonsten in der Diskussion um crossorigin
:
Das genaue Verhalten für Links zu externen Ressourcen hängt von der genauen Beziehung ab, die für den relevanten Linktyp definiert ist. Einige der Attribute steuern, ob die externe Ressource angewendet werden soll oder nicht (wie unten definiert) ... Benutzeragenten entscheiden sich möglicherweise dafür, nur solche Ressourcen zu erhalten, wenn sie benötigt werden, anstatt proaktiv alle zu holen externe Ressourcen, die nicht angewendet werden.
(Betonung meiner)
Dies scheint die Tür für Ressourcen zu öffnen, die von einem link
angegeben werden, um asynchron (oder überhaupt nicht) abgerufen zu werden.