Dans cette leçon on va apprendre à précharger une feuille de style, une police ou une image avec la fonction links.
avec React Router 7
Posez vos questions 24/7 à notre IA experte en React Router 7
Validez vos acquis avec des quiz personnalisés et un feedback instantané
Dans ce lesson, tu vas apprendre à précharger un fichier CSS (ou toute autre ressource) uniquement sur les pages qui en ont besoin, grâce à l’API links()
de React Router 7.
Tu verras comment :
<Links />
dans le head généré côté serveurQuand tu relies un fichier CSS (ou une police web) avec un simple
1<link rel="stylesheet" href="/styles/users.css" />
le navigateur démarre sa requête après avoir parsé le HTML et le JavaScript.
Résultat :
Tip
En préchargeant ta feuille de style, le navigateur la récupère dès qu’il voit la balise<link rel="preload">
. Puis il l’applique dès que possible, avant de rendre le contenu.
Dans ton app/root.tsx
, utilise la méthode links()
pour déclarer un préconnect :
1import type { LinksFunction } from "./+types/root";23export const links: LinksFunction = () => [4// ^? On préconnecte d'abord google-fonts pour accélérer la TLS5{ rel: "preconnect", href: "https://fonts.googleapis.com" },6{7rel: "preconnect",8href: "https://fonts.gstatic.com",9crossOrigin: "anonymous",10},11];
Le composant <Links />
insère ces balises avant le rendu du <body>
.
Ainsi, la handshake TLS est lancée plus tôt.
Imaginons que sur la page /users
tu as un CSS dédié :
app/styles/users.css
1/* Styles spécifiques à la page Utilisateurs */2.user-list {3list-style: none;4padding: 0;5}6.user-list li {7margin-bottom: 1rem;8}
Dans app/routes/users.tsx
, utilise links()
pour précharger ce fichier :
1import type { LinksFunction } from "react-router";23export const links: LinksFunction = () => {4return [5// ^? on indique au navigateur de précharger ce CSS avant le render6{ rel: "preload", as: "style", href: "/styles/users.css" },7];8};
Le résultat généré côté serveur :
1<link rel="preload" as="style" href="/styles/users.css" />2<link rel="stylesheet" href="/styles/users.css" />
Pourquoi `as='style'` ?
Le navigateur comprend qu’il s’agit d’une feuille de style, ce qui active les optimisations CSS (priorité, blocage du rendu).
Ensuite, dans ton composant React, importe simplement le CSS ou ajoute-le globalement :
1import "./styles/users.css"; // ^? Import standard (Tailwind ou CSS global)
Ou si tu utilises un bundler, fais un import "/styles/users.css";
dans ton root.tsx
.
1import type { LinksFunction } from "./+types/root";2import { Links, Meta, Outlet } from "react-router";34export const links: LinksFunction = () => [5{ rel: "preconnect", href: "https://fonts.googleapis.com" },6{7rel: "preconnect",8href: "https://fonts.gstatic.com",9crossOrigin: "anonymous",10},11{ rel: "stylesheet", href: "/styles/app.css" },12];1314export default function App() {15return (16<html lang="fr">17<head>18<Meta />19<Links />20</head>21<body>22<Outlet />23</body>24</html>25);26}
1import { useLoaderData } from "react-router";2import type { LinksFunction } from "react-router";34// Préchargement CSS spécifique5export const links: LinksFunction = () => [6{ rel: "preload", as: "style", href: "/styles/users.css" },7];89export default function Users() {10const { users } = useLoaderData();11return (12<ul className="user-list">13{users.map((u) => (14<li key={u.id}>{u.name}</li>15))}16</ul>17);18}
1.user-list {2list-style: none;3padding: 0;4}5.user-list li {6margin-bottom: 1rem;7}
Ne charge pas ton CSS global sur chaque page si ce n’est pas nécessaire. Précharge seulement les fichiers utilisés par la route active.
links()
de React Router 7 te permet de déclarer toutes les balises <link>
:
rel="preconnect"
pour démarre la handshake TLS en amont.rel="preload" as="style"
pour précharger un CSS.rel="stylesheet"
pour appliquer le CSS.<Links />
injecte ces balises dans le <head>
avant tout rendu du <body>
.links()
dans la route désirée pour éviter les surcharges.preconnect
+ preload
pour un LCP plus rapide et moins de layout shift.crossOrigin
si ta ressource vient d’un CDN externe.root.tsx
, ajoute un <link rel="preload" as="font" ...>
crossOrigin: "anonymous"
et le bon type="font/woff2"
.app/routes/dashboard.tsx
, précharge un script <link rel="preload" as="script" href="/js/dashboard.js" />
.as="script"
est bien pris en compte.https://api.example.com
.root.tsx
avec rel="preconnect"
.Bonne optimisation ! 🚀
Quelle est la principale différence entre les composants client et serveur dans React ?
Quelle technique est recommandée pour éviter les rendus inutiles dans React ?
Quel hook permet de gérer les effets de bord dans un composant React ?
Comment implémenter la gestion des erreurs pour les requêtes API dans React ?
Quelle est la meilleure pratique pour déployer une application React en production ?