J'ai essayé d'utiliser quelque chose comme ça pour améliorer les performances en cliquant sur une simple page de destination vers une application d'une seule page:
<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" />
Il ne semble pas y avoir d'augmentation notable des performances lorsque ma page de destination est sur un sous-domaine. Dis, https://subdomain.example.com
.
Lorsque je clique sur un lien pour visiter https://example.com
, je vois toujours un long délai dans l'onglet réseau Chrome au fur app.js
et à mesure qu'ils app.css
sont chargés:
Voici la même ressource avec la prélecture désactivée:
Cela prend à peu près le même temps au total.
Demander des en-têtes pour l'un des actifs chargés avec le cache de prélecture:
Général:
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
Réponse:
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
Demande:
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
Ma question est: si Chrome indique que le cache de prélecture est utilisé, alors pourquoi y a-t-il un temps de téléchargement de contenu important?
Il semble que Chrome possède différents types de caches: cache de prélecture, cache disque et cache mémoire. Le cache disque et le cache mémoire sont très rapides (temps de chargement 5 ms et 0 ms). Cependant, le cache de prélecture est assez inutile avec des temps de téléchargement de 300 ms parfois. Puis-je obtenir une explication technique de la raison pour laquelle cela se produit? Est-ce un bug avec Chrome? Je suis sur Chrome 79.0.3945.117.
la source
Réponses:
L'ajout
<link rel=prefetch>
à une page Web indique au navigateur de télécharger des pages entières ou certaines des ressources (comme des scripts ou des fichiers CSS), dont l'utilisateur pourrait avoir besoin à l'avenir. Cela peut améliorer des mesures telles que First Contentful Paint et Time to Interactive et peut souvent donner l'impression que les navigations suivantes se chargent instantanément.Le conseil de prélecture consomme des octets supplémentaires pour les ressources qui ne sont pas immédiatement nécessaires, donc cette technique doit être appliquée de manière réfléchie; ne récupérez les ressources que lorsque vous êtes certain que les utilisateurs en auront besoin. Envisagez de ne pas extraire lorsque les utilisateurs sont sur des connexions lentes. Vous pouvez le détecter avec l'API d'informations réseau.
Il existe différentes façons de déterminer les liens à pré-extraire. Le plus simple est de pré-extraire le premier lien ou les premiers liens de la page en cours. Il existe également des bibliothèques qui utilisent des approches plus sophistiquées, expliquées plus loin dans ce post- https://web.dev/link-prefetch/ .
la source
Je ne peux que deviner. Une réponse sûre ne peut probablement être trouvée que par vous, à travers l'expérience. Il y a trop de variables à prendre en compte. Mais voici quelques idées:
prefetch
est un indice pour un navigateur. Le navigateur peut l'ignorer pour des raisons arbitraires. Plus que cela, il a la priorité la plus faible.Menu/Settings/Advanced/Privacy and security/Preload pages for faster browsing and searching
(ou quelque chose comme ça).
https://www.technipages.com/google-chrome-prefetch
example.com
?prefetch
demandes.Vérifiez si votre serveur définit des en-têtes étranges en réponse aux
prefetch
demandes. Par exempleCache-Control: no-cache
. Oui, je vois que vous avezcache-control: max-age=31536000
, donc ce serait vraiment étrange, si le serveur enverra un en-tête différent pour la même demande (enfin ... presque le même , au moins vous n'avez pas dit qu'ils le sont, et là au moins peut être des en-têtes indiquant qu'il s'agit d'uneprefetch
demande), mais des choses étranges se produisent.Vous devriez probablement essayer d'ajouter un
crossorigin
attribut. Par exemple<link rel="prefetch" href="https://example.com/app.css" as="style" crossorigin />
Ici https://www.w3.org/TR/resource-hints/ vous pouvez trouver cet exemple
tout à fait pertinent pour votre cas, mais malheureusement sans explication.
Dans la version originale de votre question, vous avez mentionné les travailleurs des services ... S'ils téléchargent quelque chose, ou même vous-même en téléchargeant manuellement quelque chose, cela peut aussi être le problème. En raison de la priorité la plus faible de
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
Je pense qu'il en va de même pour le Chrome.
Avez-vous essayé de déplacer votre page de destination vers le domaine racine? Si, oui, et
prefetch
fonctionne comme prévu, alors oui - le sous-domaine est la cause du problème. Et le message de l'interface graphiqueStatus Code: 200 (from prefetch cache)
n'est probablement qu'un problème. Parce que tout récemment, certaines choses ont commencé à changer dans leprefetch
comportement de Chrome. Et je ne sais pas encore si les choses se sont arrangées. Fondamentalement, oui, il y a une certaine probabilité que vous ne puissiezprefetch
partir que de la même origine.https://docs.google.com/document/d/1bKGDIePAuF6YXmmrwM33LeLvtuCsla3vTspsxsNp-f8/edit
la source
vous devez ajouter le code ci-dessous au cas où vous êtes sur un sous-domaine et que vous voulez une ressource du domaine
la source