Questions sur les images en Base64
Formats, taille, cache et les limites qui comptent.
Qu'est-ce qu'une data URI d'image en Base64 ?+
C'est le fichier entier réécrit sous forme d'URL. La chaîne commence par data:image/png;base64, et tout ce qui suit la virgule correspond aux octets du fichier écrits dans l'alphabet de 64 caractères composé de lettres, de chiffres, du signe plus et de la barre oblique. Comme l'image voyage dans la référence, ce qui a chargé la feuille de style ou le HTML dispose déjà de l'image, et aucune seconde requête n'est faite pour elle.
Pourquoi Base64 plutôt que l'encodage pourcent, alors que le SVG s'encode mieux en pourcent ?+
Parce que les octets sont binaires. L'encodage pourcent laisse l'ASCII imprimable tel quel et dépense trois caractères pour tout le reste, ce qui est une aubaine pour du balisage et un désastre pour un PNG : les données d'image compressées sont quasi aléatoires, donc presque chaque octet devrait être échappé et la chaîne approcherait le triple de la taille du fichier. Base64 applique un tarif fixe de quatre caractères pour trois octets quel que soit le contenu, et son alphabet ne demande aucun échappement supplémentaire en CSS, HTML ou JSON. Pour le SVG, qui est du texte, le compromis s'inverse, et c'est pourquoi ce format a sa propre page ici.
Intégrer une image rend-il vraiment une page plus rapide ?+
Pour une petite ressource sur le chemin critique, en général oui : une requête a des coûts fixes (établissement de la connexion, en-têtes, latence) qui écrasent le poids d'une icône de 600 octets. Au-delà, la réponse devient vite négative. Les octets rejoignent un fichier qui bloque le rendu, ils sont retéléchargés chaque fois que ce fichier change, ils ne peuvent être ni chargés en différé ni rendus moins prioritaires, et ils ne peuvent pas être récupérés en parallèle comme le serait une URL séparée. L'intégration échange une requête contre du poids au mauvais endroit ; elle n'est rentable que tant que ce poids reste négligeable.
De combien la version encodée est-elle plus lourde, exactement ?+
La charge utile fait ceil(bytes / 3) × 4 caractères (une hausse fixe de 33.3% avant arrondi), plus le remplissage nécessaire pour atteindre un multiple de quatre, plus le préfixe data:…;base64, d'environ vingt octets. Un PNG de 10 KB devient environ 13.4 KB de texte. La compression n'y change rien non plus : gzip et brotli exploitent les répétitions, et une image déjà compressée n'en contient presque plus, donc vous récupérez quelques pour cent, pas le surcoût.
Quels formats fonctionnent, et lesquels non ?+
PNG, JPEG, WebP, GIF, AVIF, BMP et ICO s'encodent et s'affichent tous en data URI, et le SVG est accepté ici aussi, même si sa place est sur la page dédiée au SVG. Le refus notable est HEIC : c'est le format qu'un iPhone enregistre par défaut et aucun navigateur ne sait le décoder, donc en encoder un ne produirait qu'une URI qui ne s'affiche nulle part. Même chose pour TIFF, PDF et les fichiers RAW d'appareil photo. Convertissez-les d'abord en PNG ou JPEG, puis encodez le résultat.
L'outil indique que mon fichier n'a pas le format de son extension. Qui a raison ?+
Les octets. Une extension est une convention de nommage que n'importe qui peut modifier, et les fichiers sont renommés en permanence : une capture PNG enregistrée en .jpg, un WebP téléchargé avec le suffixe .png. Chaque format d'image commence par une signature fixe, donc l'en-tête fait foi et c'est lui que cette page utilise. Si vous écrivez dans l'URI le type MIME de l'extension, les navigateurs ne s'accordent pas sur le fait d'analyser le contenu ou de se fier à la déclaration, et c'est ainsi qu'une image finit par s'afficher sur votre machine et pas sur celle de quelqu'un d'autre.
Puis-je utiliser une data URI dans un e-mail ou comme favicon ?+
Comme favicon, oui : <link rel="icon" href="data:image/png;base64,…"> fonctionne dans tous les navigateurs actuels et économise une requête au premier affichage. Pour l'e-mail, c'est l'inverse : Outlook ignore purement et simplement les data URI et Gmail les supprime, donc les images intégrées à un e-mail exigent toujours une pièce jointe CID ou une URL hébergée. Bon à savoir aussi : depuis 2017, les navigateurs bloquent la navigation directe vers les URL data:, donc en coller une dans la barre d'adresse pour la vérifier ne fonctionnera pas. Utilisez plutôt l'aperçu ci-dessus.
La longueur de l'URI elle-même est-elle limitée ?+
Pas de façon significative dans les navigateurs modernes : une data URI de plusieurs mégaoctets se charge depuis une feuille de style ou une balise image. Les limites qui comptent sont pratiques. Cette page plafonne l'entrée à 10 MB, car la chaîne encodée doit tenir dans la mémoire de l'onglet et dans le DOM. Au-delà, les bundles minifiés et les source maps deviennent illisibles, certains champs de CMS et de bases de données tronquent les valeurs longues sans prévenir, les DevTools rament quand vous inspectez l'élément, et chaque kilo-octet est renvoyé avec le fichier qui le contient.