Get to know MDN better
Cette page a été traduite à partir de l'anglais par la communauté. Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.
Cette fonctionnalité n'est pas Compatible car elle ne fonctionne pas dans certains des navigateurs les plus utilisés.
Expérimental: Il s'agit d'une technologie expérimentale.
Vérifiez attentivement le tableau de compatibilité des navigateurs avant de l'utiliser en production.
L'API Speculation Rules est conçue pour améliorer les performances des navigations futures. Elle cible les URL de documents plutôt que des fichiers de ressources spécifiques, ce qui la rend pertinente pour les applications multi-pages (MPA) plutôt que pour les applications monopage (SPA).
L'API Speculation Rules propose une alternative à la fonctionnalité largement disponible <link rel="prefetch"> et vise à remplacer la fonctionnalité <link rel="prerender">, obsolète et spécifique à Chrome. Elle apporte de nombreuses améliorations par rapport à ces technologies, ainsi qu'une syntaxe plus expressive et configurable pour définir quels documents doivent être préchargés ou pré-rendus.
Note : L'API Speculation Rules ne gère pas le préchargement des sous-ressources ; pour cela, il faut utiliser <link rel="prefetch">.
Les règles de spéculation peuvent être définies dans des éléments <script type="speculationrules"> en ligne ou dans des fichiers texte externes référencés par l'en-tête de réponse Speculation-Rules. Les règles sont définies sous forme de structure JSON.
Exemple de script :
Les règles de spéculation utilisant un élément HTML <script> doivent être explicitement autorisées dans la directive Content-Security-Policy script-src si le site en inclut une. Cela se fait en ajoutant l'une des sources 'inline-speculation-rules', une source de hachage ou un nombre unique (nonce en anglais).
Exemple d'en-tête HTTP :
La ressource texte contenant le JSON des règles de spéculation peut avoir n'importe quel nom et extension valides, mais elle doit être servie avec le type MIME application/speculationrules+json.
Note : Les règles peuvent être définies à la fois via un script en ligne et via l'en-tête HTTP — toutes les règles appliquées à un document sont analysées et ajoutées à la liste des règles de spéculation du document.
Vous définissez un tableau distinct pour chaque type de chargement spéculatif (par exemple "prerender" ou "prefetch"). Chaque règle est contenue dans un objet qui définit, par exemple, une liste de ressources à charger, ainsi que des options comme un paramètre explicite Referrer-Policy pour chaque règle. Notez que les URL pré-rendues sont aussi préchargées.
Voir <script type="speculationrules"> pour une explication complète de la syntaxe disponible.
Inclure des règles prefetch dans un élément <script type="speculationrules"> ou dans l'en-tête Speculation-Rules amène les navigateurs compatibles à télécharger le corps de la réponse des pages référencées, mais aucune des sous-ressources référencées par la page. Lorsqu'une page préchargée est visitée, son affichage est bien plus rapide que si elle n'avait pas été préchargée.
Les résultats sont conservés dans un cache en mémoire propre à chaque document. Tout préchargement mis en cache est supprimé lorsque vous quittez la page courante, sauf si vous naviguez effectivement vers un document préchargé.
Cela signifie que si vous préchargez une ressource que l'utilisateur·ice ne visite pas, cela représente généralement un gaspillage de ressources, même si le résultat peut remplir le cache HTTP si les en-têtes le permettent. Cela dit, le coût initial d'un préchargement est bien moindre que celui d'un pré-rendu, il est donc recommandé d'adopter le préchargement de façon large, par exemple en préchargeant toutes les pages importantes de votre site, à condition qu'elles soient sûres à précharger (voir Conditions de chargement spéculatif non sûr pour plus de détails).
Les préchargements same-site et cross-site fonctionnent, mais les préchargements cross-site sont limités (voir « same-site » et « cross-site » (angl.) pour une explication de la différence entre les deux). Pour des raisons de confidentialité, les préchargements cross-site ne fonctionnent actuellement que si l'utilisateur·ice n'a pas de cookies définis pour le site de destination — il ne faut pas que des sites puissent suivre l'activité des utilisateur·ice·s via des pages préchargées (qu'ils·elles ne visiteront peut-être jamais) en se basant sur des cookies déjà présents.
Note : À l'avenir, une option d'activation pour les préchargements intersites sera proposée via l'en-tête Supports-Loading-Mode, mais cela n'était pas encore implémenté au moment de la rédaction (seule l'activation du pré-rendu inter-origine, même site était disponible).
Pour les navigateurs qui le prennent en charge, le préchargement via les règles de spéculation doit être préféré aux anciens mécanismes de préchargement, à savoir <link rel="prefetch"> et fetch() avec l'option priority: "low". En effet, le préchargement par règles de spéculation est destiné aux navigations, et non au préchargement général de ressources :
De plus, le préchargement par règles de spéculation :
Inclure des règles prerender dans un élément <script type="speculationrules"> ou dans l'en-tête Speculation-Rules amène les navigateurs compatibles à récupérer, afficher et charger le contenu dans un onglet invisible, stocké dans un cache en mémoire propre à chaque document. Cela inclut le chargement de toutes les sous-ressources, l'exécution de tout le JavaScript, et même le chargement des sous-ressources et des requêtes de données lancées par JavaScript. Tout pré-rendu mis en cache, ainsi que ses sous-ressources, est supprimé lorsque vous quittez la page courante, sauf si vous naviguez effectivement vers un document pré-rendu.
Les navigations futures vers une page pré-rendue seront quasi instantanées. Le navigateur active l'onglet invisible au lieu d'effectuer le processus de navigation habituel, remplaçant l'ancienne page au premier plan par la page pré-rendue. Si une page est activée avant d'être totalement pré-rendue, elle est activée dans son état actuel puis continue de se charger, ce qui signifie que vous constaterez tout de même une amélioration significative des performances.
Le pré-rendu utilise de la mémoire et de la bande passante réseau. Si vous pré-rendez une ressource que l'utilisateur·ice ne visite pas, ces ressources sont gaspillées (même si le résultat peut remplir le cache HTTP si les en-têtes le permettent, permettant une utilisation ultérieure). Le coût initial d'un pré-rendu est bien plus élevé que celui d'un préchargement, et d'autres conditions peuvent aussi rendre le contenu non sûr à pré-rendre (voir Conditions de chargement spéculatif non sûr pour plus de détails). Il est donc recommandé d'adopter le pré-rendu avec parcimonie, en considérant soigneusement les cas où il y a une forte probabilité que la page soit visitée, et si le bénéfice pour l'expérience utilisateur justifie le coût supplémentaire.
Note : Pour donner un ordre de grandeur du gaspillage potentiel de ressources, un pré-rendu utilise à peu près autant de ressources que le rendu d'un <iframe>.
Note : De nombreuses API seront automatiquement différées lors du pré-rendu ou jusqu'à l'activation. Voir Fonctionnalités de la plateforme différées ou restreintes lors du pré-rendu pour plus de détails.
Le pré-rendu est limité par défaut aux documents de même origine. Le pré-rendu inter-origine, même site, est possible — la cible de la navigation doit alors activer l'option via l'en-tête Supports-Loading-Mode avec la valeur credentialed-prerender. Le pré-rendu intersites n'est pas possible actuellement.
Pour les navigateurs qui le prennent en charge, le pré-rendu via les règles de spéculation doit être préféré aux anciens mécanismes de pré-rendu, à savoir <link rel="prerender"> :
Vous pouvez vérifier si l'API Speculation Rules est prise en charge à l'aide du code suivant :
Par exemple, vous pouvez vouloir insérer des règles de spéculation pour le préchargement dans les navigateurs compatibles, mais utiliser une technologie plus ancienne comme <link rel="prefetch"> dans les autres :
Cette section présente différentes méthodes pour détecter si une page demandée a été préchargée ou pré-rendue.
Les requêtes de pages préchargées et pré-rendues sont envoyées avec l'en-tête de requête Sec-Purpose :
Pour prefetch :
Pour prerender :
Le serveur peut réagir à cet en-tête, par exemple pour consigner les requêtes de chargement spéculatif, retourner un contenu différent, ou même empêcher le chargement spéculatif. Si un code de réponse autre que succès est retourné (tout code HTTP autre que dans la plage 200-299 après redirections), alors la page ne sera pas préchargée/pré-rendue. De plus, les codes d'état 204 et 205 empêchent aussi le pré-rendu (mais pas le préchargement).
Utiliser un code autre que succès (par exemple un 503) est le moyen le plus simple d'empêcher le chargement spéculatif côté serveur, même s'il est généralement préférable d'autoriser le préchargement/pré-rendu et d'utiliser JavaScript pour différer toute action qui ne doit se produire que lorsque la page est effectivement consultée.
Lorsqu'une page est préchargée, son entrée PerformanceResourceTiming.deliveryType retournera la valeur "navigational-prefetch". Vous pouvez utiliser le code suivant pour exécuter une fonction lorsqu'une entrée de performance de type "navigational-prefetch" est reçue :
Cette technique est utile pour mesurer les performances, ou lorsque vous souhaitez différer des actions qui pourraient poser problème si elles se produisent lors du préchargement (voir Préchargement non sûr).
Pour exécuter une action pendant que la page est en pré-rendu, vous pouvez vérifier la propriété Document.prerendering. Vous pouvez par exemple lancer une analyse statistique :
Lorsqu'un document pré-rendu est activé, PerformanceNavigationTiming.activationStart est défini sur un objet DOMHighResTimeStamp représentant le temps écoulé entre le début du pré-rendu et l'activation du document. La fonction suivante permet de vérifier le pré-rendu et les pages pré-rendues :
Lorsque la page pré-rendue est activée par la consultation de l'utilisateur·ice, l'évènement prerenderingchange est déclenché. Cela peut servir à activer des activités qui auparavant démarraient par défaut au chargement de la page, mais que vous souhaitez différer jusqu'à ce que la page soit effectivement consultée. Le code suivant met en place un écouteur d'évènement pour exécuter une fonction une fois le pré-rendu terminé, sur une page pré-rendue, ou l'exécute immédiatement sur une page qui n'est pas pré-rendue :
Cette section présente les conditions à surveiller, pour lesquelles le préchargement et/ou le pré-rendu ne sont pas sûrs. Cela signifie que le préchargement/pré-rendu de pages présentant ces conditions peut nécessiter des mesures de mitigation dans votre code, ou doit être évité.
Comme mentionné précédemment, nous recommandons d'adopter largement le préchargement, car le rapport risque/bénéfice est assez faible : le risque de gaspillage de ressources est minime, et les gains de performance peuvent être significatifs. Cependant, vous devez vous assurer que les pages préchargées ne perturbent pas le fonctionnement de votre application.
Lors d'un préchargement, le navigateur télécharge le corps de la réponse de la page référencée via une seule requête GET, que l'utilisateur·ice pourra consulter ultérieurement. Des problèmes peuvent survenir notamment lorsque l'URL de la requête déclenche un effet de bord côté serveur que vous ne souhaitez voir se produire qu'au moment où l'URL est effectivement visitée.
Par exemple :
De tels problèmes peuvent être atténués côté serveur en surveillant l'en-tête Sec-Purpose: prefetch lors de la réception des requêtes, puis en exécutant un code spécifique pour différer la fonctionnalité problématique. Plus tard, lorsque la page est effectivement visitée, vous pouvez déclencher la fonctionnalité différée via JavaScript si nécessaire.
Note : Vous trouverez plus de détails sur le code de détection dans la section Détection des pages préchargées et pré-rendues.
Il est également potentiellement risqué de précharger un document dont le contenu généré côté serveur changera en fonction des actions que l'utilisateur·ice peut effectuer sur la page courante. Cela peut inclure, par exemple, des pages de ventes flash ou des plans de salle de cinéma. Testez soigneusement ces cas et atténuez ces problèmes en mettant à jour le contenu une fois la page chargée. Voir État variable généré côté serveur pour plus de détails sur ces cas.
Note : Les navigateurs mettent en cache les pages préchargées pendant une courte période (Chrome, par exemple, les conserve 5 minutes) avant de les supprimer, donc vos utilisateur·ice·s peuvent voir un contenu vieux de 5 minutes au maximum.
Les préchargements obsolètes peuvent être supprimés à l'aide de la valeur prefetchCache de l'en-tête de réponse Clear-Site-Data. Ceci peut être utilisé, par exemple, lorsque des requêtes modifiant l'état rendent les données en cache invalides, comme lors de la déconnexion d'un site.
Le préchargement est sûr si tous les effets de bord du chargement de la page résultent de l'exécution de JavaScript, car le JavaScript ne s'exécutera qu'à l'activation.
Un dernier conseil est d'auditer les URL listées comme interdites dans votre fichier robots.txt — normalement ces URL pointent vers des pages accessibles uniquement aux utilisateur·ice·s authentifié·e·s, et ne devraient donc pas figurer dans les résultats des moteurs de recherche. Beaucoup d'entre elles seront acceptables mais c'est un bon moyen d'identifier des URL non sûres pour le préchargement (c'est-à-dire qui présentent les conditions décrites ci-dessus).
Le pré-rendu comporte plus de risques que le préchargement et doit donc être utilisé avec parcimonie, uniquement dans les cas où cela en vaut la peine. Il existe davantage de conditions non sûres à surveiller lors du pré-rendu, la récompense est plus élevée, mais le risque l'est aussi.
Lors d'un pré-rendu, le navigateur effectue une requête GET sur l'URL, puis affiche et charge le contenu dans un onglet invisible. Cela inclut l'exécution du JavaScript du contenu et le chargement de toutes les sous-ressources, y compris celles récupérées par JavaScript. Le contenu peut être potentiellement non sûr à pré-rendre si l'une des conditions suivantes est observée :
Pour atténuer ces problèmes, vous pouvez utiliser les techniques suivantes :
Il existe deux principaux types d'état généré côté serveur à surveiller : état obsolète et état spécifique à l'utilisateur·ice. Cela peut entraîner un préchargement ou un pré-rendu non sûr.
Des problèmes d'état spécifique à l'utilisateur·ice peuvent aussi survenir pour d'autres paramètres utilisateur·ice, par exemple les paramètres de langue, les préférences de mode sombre ou l'ajout d'articles au panier. Ils peuvent également se produire même lorsqu'un seul onglet est impliqué :
La meilleure mitigation pour ces cas, et en fait chaque fois que le contenu peut être désynchronisé avec le serveur, est que les pages s'actualisent elles-mêmes si nécessaire. Par exemple, un serveur peut utiliser l'API Broadcast Channel, ou un autre mécanisme comme fetch() ou un WebSocket. Les pages peuvent alors s'actualiser correctement, y compris les pages chargées de façon spéculative qui n'ont pas encore été activées.
Lorsque l'actualisation n'est pas possible, les spéculations peuvent être supprimées à l'aide de l'en-tête de réponse Clear-Site-Data avec les valeurs prefetchCache ou prerenderCache (ou les deux) selon le cas.
Cet en-tête peut être renvoyé sur n'importe quelle requête HTTP de même site (par exemple un appel d'API /api/add-to-cart).
L'activation d'un document en cours de pré-rendu ou pré-rendu se comporte comme une navigation classique du point de vue de l'utilisateur·ice. Le document activé s'affiche dans l'onglet et est ajouté à l'historique de session, et toutes les entrées d'historique avant sont supprimées. Toute navigation effectuée dans le contexte de navigation du pré-rendu avant l'activation n'affecte pas l'historique de session.
Du point de vue du·de la développeur·euse, un document en cours de pré-rendu peut être considéré comme ayant un historique de session trivial où une seule entrée — l'entrée courante — existe. Toutes les navigations dans le contexte du pré-rendu sont effectivement remplacées.
Bien que les fonctionnalités d'API qui opèrent sur l'historique de session (par exemple History et Navigation) puissent être appelées dans les documents en cours de pré-rendu, elles n'opèrent que sur l'historique de session trivial du contexte. Par conséquent, les documents pré-rendus ne participent pas à l'historique de session commun de leur page référente. Par exemple, ils ne peuvent pas naviguer vers leur référent via History.back().
Cette conception garantit que les utilisateur·ice·s obtiennent l'expérience attendue lors de l'utilisation du bouton de retour — c'est-à-dire qu'ils·elles reviennent à la dernière chose vue. Une fois qu'un document en cours de pré-rendu est activé, une seule entrée d'historique de session est ajoutée à l'historique de session commun, en ignorant toute navigation précédente effectuée dans le contexte de navigation du pré-rendu. Revenir d'un pas dans l'historique de session commun — par exemple, en appuyant sur le bouton de retour — ramène l'utilisateur·ice à la page référente.
Comme une page pré-rendue est ouverte dans un état caché, plusieurs fonctionnalités d'API susceptibles de provoquer des comportements intrusifs ne sont pas activées dans cet état, et sont donc différées jusqu'à l'activation de la page. D'autres fonctionnalités de la plateforme web problématiques lors du pré-rendu sont totalement restreintes. Cette section détaille les fonctionnalités différées ou restreintes.
Note : Dans le petit nombre de cas où le report ou la restriction n'est pas possible, le pré-rendu est annulé.
Le report signifie que la fonctionnalité d'API retourne immédiatement une promesse en attente et ne fait rien jusqu'à l'activation de la page. Après activation, la fonctionnalité s'exécute normalement et la promesse est résolue ou rejetée normalement.
Les résultats des fonctionnalités asynchrones suivantes sont différés dans les documents pré-rendus jusqu'à leur activation :
Les fonctionnalités suivantes échoueront automatiquement ou ne feront rien dans les documents qui ne sont pas activés.
API nécessitant une activation transitoire ou une activation persistante :
API nécessitant que le document contenant ait la sélection :
API nécessitant que la propriété Document.visibilityState du document contenant soit à "visible" :
L'API Speculation Rules ne définit aucune interface propre.
Une propriété booléenne qui retourne true si le document est actuellement en cours de pré-rendu.
L'évènement prerenderingchangeDéclenché sur un document pré-rendu lorsqu'il est activé (c'est-à-dire lorsque l'utilisateur·ice consulte la page).
PerformanceNavigationTiming.activationStartUn nombre représentant le temps écoulé entre le début du pré-rendu d'un document et son activation.
PerformanceResourceTiming.deliveryType valeur "navigational-prefetch"Indique que le type d'une entrée de performance est un préchargement.
Utilisé pour autoriser l'utilisation de <script type="speculationrules"> afin de définir des règles de spéculation sur le document récupéré.
Clear-Site-Data valeurs 'prefetchCache' et 'prerenderCache'Utilisé pour supprimer les spéculations. Par exemple, lorsque des changements d'état rendent les spéculations obsolètes.
Speculation-RulesFournit une liste d'URL pointant vers des ressources textuelles contenant des définitions JSON de règles de spéculation. Lorsque la réponse est un document HTML, ces règles sont ajoutées à l'ensemble de règles de spéculation du document.
Supports-Loading-ModeDéfini par une cible de navigation pour autoriser l'utilisation de divers modes de chargement à risque élevé. Par exemple, le pré-rendu inter-origine, même site, nécessite une valeur Supports-Loading-Mode de credentialed-prerender.
Utilisé pour définir un ensemble de règles de spéculation de préchargement et/ou de pré-rendu dans le document courant, qui sont ajoutées à l'ensemble de règles de spéculation du document.
Pour des exemples de code, voir Pré-rendu des pages dans Chrome pour des navigations instantanées sur developer.chrome.com (2025)
| HTML # speculative-loading |
| Prerendering Revamped |
Activez JavaScript pour afficher ce tableau de compatibilité des navigateurs.
Activez JavaScript pour afficher ce tableau de compatibilité des navigateurs.
Cette page a été modifiée le 23 déc. 2025 par les contributeur·ice·s du MDN.
Votre modèle pour un internet meilleur.
Visitez la société mère à but non lucratif de Mozilla Corporation, la Fondation Mozilla.
Certaines parties de ce contenu sont protégées par le droit d'auteur ©1998—2026 des contributeurs individuels de mozilla.org. Contenu disponible sous une licence Creative Commons.