Optimisation des images

Déposez une image en pleine taille dans src/ ou public/, pointez une balise <img> dessus, et sitelo la redimensionne, la convertit dans un format moderne et réécrit la balise avec un srcset. Rien à importer, aucun composant à apprendre.

Activation

export default {
  images: true,
}

L’encodage est assuré par sharp, une dépendance peer optionnelle — installez-la aux côtés de sitelo quand vous activez les images :

npm install -D sharp

Les sites qui n’optimisent pas les images n’ont jamais besoin de l’installer.

Écrivez un <img> ordinaire

import { html, body, img } from 'javascript-to-html'

export default () =>
  html({ lang: 'fr' },
    body(
      img({ src: '/images/hero.png', alt: 'Lever de soleil sur le port' }),
    ),
  )

Une source de 3000×2000 ressort ainsi :

<img src="/assets/img/hero.a1b2c3d4-1200.webp"
     alt="Lever de soleil sur le port"
     sizes="(max-width: 1200px) 100vw, 1200px"
     width="1200" height="800"
     loading="lazy" decoding="async"
     srcset="/assets/img/hero.9f8e7d6c-400.webp 400w,
             /assets/img/hero.5b4a3c2d-800.webp 800w,
             /assets/img/hero.a1b2c3d4-1200.webp 1200w">

Ce que vous obtenez

La réécriture s’applique au HTML construit : elle couvre donc aussi bien les images de src/ que celles de public/.

Options

export default {
  images: {
    widths: [400, 800, 1200],
    formats: ['avif', 'webp'],
    quality: { avif: 55, webp: 78, jpeg: 82 },
    exclude: ['**/og/**'],
  },
}

Deux formats vous donnent

AVIF est plus léger mais plus récent que WebP : lister les deux laisse le navigateur choisir tout en gardant un repli pour les anciens.

<picture>
  <source type="image/avif" srcset="/assets/img/hero.*-400.avif 400w, ..." sizes="...">
  <source type="image/webp" srcset="/assets/img/hero.*-400.webp 400w, ..." sizes="...">
  <img src="/assets/img/hero.*-1200.png" alt="..." srcset="..." width="1200" height="800">
</picture>

Exclure des images

Les balises qui ont déjà un srcset, qui se trouvent dans un <picture>, ou qui pointent vers un SVG, un GIF animé ou une URL distante sont laissées intactes. Pour les autres, dites-le explicitement :

<img src="/images/exact.png" alt="Pixel art" data-no-optimize>

Les images de cartes sociales et les favicons vivent dans des <meta> et des <link>, que cela ne réécrit jamais — elles conservent leur URL fixe.

Images distantes

Le contenu importé d’un CMS pointe souvent vers le serveur de quelqu’un d’autre. Activez remote et ces images sont téléchargées, optimisées et servies depuis votre propre domaine :

export default {
  images: {
    remote: true,
    prune: true,
  },
}

Un téléchargement qui échoue laisse la balise exactement telle quelle, avec un avertissement — une origine instable ne fait jamais échouer votre build. Ensuite, prune supprime les originaux locaux que plus rien ne référence.