Ich habe versucht, so etwas zu verwenden, um eine Leistungssteigerung zu erzielen, wenn ich von einer einfachen Zielseite zu einer schwergewichtigen Einzelseiten-App klicke:
<link rel="prefetch" href="https://example.com" as="document" />
<link rel="prefetch" href="https://example.com/app.js" as="script" />
<link rel="prefetch" href="https://example.com/app.css" as="style" />
Es scheint keine merkliche Leistungssteigerung zu geben, wenn sich meine Zielseite in einer Subdomain befindet. Sagen Sie , https://subdomain.example.com
.
Wenn ich auf einen Link klicken Besuch https://example.com
, ich sehe immer noch eine lange Verzögerung in der Registerkarte Chrome Netzwerk wie app.js
und app.css
sind geladen:
Hier ist dieselbe Ressource mit deaktiviertem Prefetching:
Insgesamt dauert es ungefähr genauso lange.
Fordern Sie Header für eines der Assets an, die mit dem Prefetch-Cache geladen wurden:
Allgemeines:
Request URL: https://example.com/css/app.bffe365a.css
Request Method: GET
Status Code: 200 (from prefetch cache)
Remote Address: 13.226.219.19:443
Referrer Policy: no-referrer-when-downgrade
Antwort:
accept-ranges: bytes
cache-control: max-age=31536000
content-encoding: gzip
content-length: 39682
content-type: text/css
date: Mon, 06 Jan 2020 21:42:53 GMT
etag: "d6f5135674904979a2dfa9dab1d2c440"
last-modified: Mon, 06 Jan 2020 20:46:46 GMT
server: AmazonS3
status: 200
via: 1.1 example.cloudfront.net (CloudFront)
x-amz-cf-id: dO3yiCoPErExrE2BLYbUJaVye32FIJXXxMdI4neDGzGX9a6gcCDumg==
x-amz-cf-pop: LAX50-C1
x-amz-id-2: 1O0LmihxpHIywEaMQWX7G3FDAzxtH9tZq1T/jeVLMzifFSJSIIJSS6+175H61kKdAq6iEbwfs2I=
x-amz-request-id: AF35C178092B65D4
x-cache: Hit from cloudfront
Anfrage:
DNT: 1
Referer: https://example.com/auth/join
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36
Meine Frage lautet: Wenn Chrome angibt, dass der Prefetch-Cache verwendet wird, warum gibt es dann eine erhebliche Downloadzeit für Inhalte?
Es scheint, dass Chrome verschiedene Arten von Caches hat: Prefetch-Cache, Festplatten-Cache und Speicher-Cache. Der Festplatten-Cache und der Speicher-Cache sind sehr schnell (Ladezeiten von 5 ms und 0 ms). Allerdings ist der Prefetch-Cache mit 300 ms Download-Zeiten manchmal ziemlich nutzlos. Kann ich eine technische Erklärung bekommen, warum dies passiert? Ist es ein Fehler mit Chrome? Ich bin auf Chrome 79.0.3945.117.
quelle
Antworten:
Durch
<link rel=prefetch>
das Hinzufügen zu einer Webseite wird der Browser angewiesen, ganze Seiten oder einige der Ressourcen (wie Skripte oder CSS-Dateien) herunterzuladen, die der Benutzer möglicherweise in Zukunft benötigt. Dies kann Metriken wie First Contentful Paint und Time to Interactive verbessern und nachfolgende Navigationen häufig sofort laden.Der Prefetch-Hinweis verbraucht zusätzliche Bytes für Ressourcen, die nicht sofort benötigt werden. Daher muss diese Technik sorgfältig angewendet werden. Ressourcen nur vorab abrufen, wenn Sie sicher sind, dass Benutzer sie benötigen. Ziehen Sie in Betracht, nicht vorab abzurufen, wenn Benutzer langsame Verbindungen haben. Sie können dies mit der Netzwerkinformations-API erkennen.
Es gibt verschiedene Möglichkeiten, um zu bestimmen, welche Links vorab abgerufen werden sollen. Am einfachsten ist es, den ersten Link oder die ersten Links auf der aktuellen Seite vorab abzurufen. Es gibt auch Bibliotheken, die komplexere Ansätze verwenden, die später in diesem Beitrag erläutert werden: https://web.dev/link-prefetch/ .
quelle
Ich kann nur raten. Eine selbstbewusste Antwort kann wahrscheinlich nur von Ihnen durch Experimente gefunden werden. Es gibt zu viele Variablen, um sie zu berücksichtigen. Aber hier einige Ideen:
prefetch
ist ein Hinweis für einen Browser. Der Browser kann dies aus beliebigen Gründen ignorieren. Darüber hinaus hat es die niedrigste Priorität.Menu/Settings/Advanced/Privacy and security/Preload pages for faster browsing and searching
(oder so ähnlich).
https://www.technipages.com/google-chrome-prefetch
example.com
?prefetch
Anforderungen empfangen werden.Überprüfen Sie, ob Ihr Server als Antwort auf
prefetch
Anforderungen seltsame Header setzt . ZBCache-Control: no-cache
. Ja, ich sehe, dass Sie habencache-control: max-age=31536000
, also wäre es wirklich seltsam, wenn der Server unterschiedliche Header für dieselbe Anfrage senden würde ( na ja ... fast gleich , zumindest haben Sie nicht gesagt, dass dies der Fall ist, und zumindest können sie es einige Überschriften geben an, dass es sich um eineprefetch
Anfrage handelt), aber es passieren seltsame Dinge.Sie sollten wahrscheinlich versuchen, ein
crossorigin
Attribut hinzuzufügen . Z.B<link rel="prefetch" href="https://example.com/app.css" as="style" crossorigin />
Hier https://www.w3.org/TR/resource-hints/ finden Sie dieses Beispiel
ziemlich relevant für Ihren Fall, aber leider ohne Erklärung.
In der Originalversion Ihrer Frage haben Sie Servicemitarbeiter erwähnt ... Wenn sie etwas herunterladen oder sogar selbst etwas manuell herunterladen, kann dies ebenfalls das Problem sein. Wegen der niedrigsten Priorität von
prefetch
https://developer.mozilla.org/en-US/docs/Web/HTTP/Link_prefetching_FAQ#What_if_I.27m_downloading_something_in_the_background.3F_Will_link_prefetching_compete_for_bandwidth.3F
Ich denke, dasselbe gilt für Chrome.
Haben Sie versucht, Ihre Zielseite in die Stammdomäne zu verschieben? Wenn ja, und
prefetch
wie erwartet funktioniert, ist die Subdomain yes die Ursache des Problems. Und die GUI-NachrichtStatus Code: 200 (from prefetch cache)
ist wahrscheinlich nur eine Panne. Denn erst kürzlich haben sich einige Dinge imprefetch
Verhalten von Chrome geändert . Und ich weiß noch nicht, ob sich die Dinge beruhigt haben. Grundsätzlich besteht ja eine gewisse Wahrscheinlichkeit, dass Sieprefetch
nur aus derselben Herkunft stammen können.https://docs.google.com/document/d/1bKGDIePAuF6YXmmrwM33LeLvtuCsla3vTspsxsNp-f8/edit
quelle
Sie sollten den folgenden Code hinzufügen, falls Sie sich in einer Subdomain befinden und Ressourcen von der Domain möchten
quelle