API de Service d'images
astro:assets
a Ă©tĂ© conçu pour permettre Ă nâimporte quel service dâoptimisation dâimages de construire facilement un service au-dessus dâAstro.
Quâest-ce quâun service dâimages ?
Titre de la section Quâest-ce quâun service dâimages ?Astro propose deux types de services dâimages : Local et Externe.
- Les services locaux gĂšrent les transformations dâimages directement lors de la construction pour les sites statiques, ou lors de lâexĂ©cution en mode dĂ©veloppement et SSR. Ce sont souvent des enveloppes autour de bibliothĂšques comme Sharp, ImageMagick, ou Squoosh. En mode dĂ©veloppement et en SSR, les services locaux utilisent un point de terminaison de lâAPI pour effectuer la transformation.
- Les services externes pointent vers des URL et peuvent ajouter la prise en charge de services tels que Cloudinary, Vercel ou tout autre serveur conforme Ă RIAPI.
Construire Ă lâaide de lâAPI dâun service dâimage
Titre de la section Construire Ă lâaide de lâAPI dâun service dâimageLes dĂ©finitions de service prennent la forme dâun objet par dĂ©faut exportĂ© avec diverses mĂ©thodes requises (âhooksâ).
Les services externes fournissent un getURL()
qui pointe vers le src
de la balise <img>
de sortie.
Les services locaux fournissent une méthode transform()
pour effectuer des transformations sur votre image, et les méthodes getURL()
et parseURL()
pour utiliser un point de terminaison pour le mode dev et SSR.
Les deux types de services peuvent fournir getHTMLAttributes()
pour déterminer les autres attributs de la sortie <img>
et validateOptions()
pour valider et augmenter les options passées.
Services Externes
Titre de la section Services ExternesUn service externe pointe vers une URL distante Ă utiliser comme attribut src
de la balise <img>
finale. Cette URL distante est responsable du tĂ©lĂ©chargement, de la transformation et du renvoi de lâimage.
import type { ExternalImageService, ImageTransform, AstroConfig } from "astro";
const service: ExternalImageService = { validateOptions(options: ImageTransform, imageConfig: AstroConfig['image']) { const serviceConfig = imageConfig.service.config;
// Appliquer la largeur maximale définie par l'utilisateur. if (options.width > serviceConfig.maxWidth) { console.warn(`Image width ${options.width} exceeds max width ${serviceConfig.maxWidth}. Falling back to max width.`); options.width = serviceConfig.maxWidth; }
return options; }, getURL(options, imageConfig) { return `https://mysupercdn.com/${options.src}?q=${options.quality}&w=${options.width}&h=${options.height}`; }, getHTMLAttributes(options, imageConfig) { const { src, format, quality, ...attributes } = options; return { ...attributes, loading: options.loading ?? 'lazy', decoding: options.decoding ?? 'async', }; }};
export default service;
Services Local
Titre de la section Services LocalPour créer votre propre service local, vous pouvez pointer vers le built-in point de terminaison (/_image
), ou vous pouvez également créer votre propre point de terminaison qui peut appeler les méthodes du service.
import type { LocalImageService, AstroConfig } from "astro";
const service: LocalImageService = { getURL(options: ImageTransform, imageConfig: AstroConfig['image']) { const searchParams = new URLSearchParams(); searchParams.append('href', typeof options.src === "string" ? options.src : options.src.src); options.width && searchParams.append('w', options.width.toString()); options.height && searchParams.append('h', options.height.toString()); options.quality && searchParams.append('q', options.quality.toString()); options.format && searchParams.append('f', options.format); return `/my_custom_endpoint_that_transforms_images?${searchParams}`; // Vous pouvez également utiliser le point de terminaison intégré, qui appellera vos fonctions parseURL et transform : // retourne `/_image?${searchParams}`; }, parseURL(url: URL, imageConfig) { return { src: params.get('href')!, width: params.has('w') ? parseInt(params.get('w')!) : undefined, height: params.has('h') ? parseInt(params.get('h')!) : undefined, format: params.get('f'), quality: params.get('q'), }; }, transform(buffer: Uint8Array, options: { src: string, [key: string]: any }, imageConfig): { data: Uint8Array, format: OutputFormat } { const { buffer } = mySuperLibraryThatEncodesImages(options); return { data: buffer, format: options.format, }; }, getHTMLAttributes(options, imageConfig) { let targetWidth = options.width; let targetHeight = options.height; if (typeof options.src === "object") { const aspectRatio = options.src.width / options.src.height;
if (targetHeight && !targetWidth) { targetWidth = Math.round(targetHeight * aspectRatio); } else if (targetWidth && !targetHeight) { targetHeight = Math.round(targetWidth / aspectRatio); } }
const { src, width, height, format, quality, ...attributes } = options;
return { ...attributes, width: targetWidth, height: targetHeight, loading: attributes.loading ?? 'lazy', decoding: attributes.decoding ?? 'async', }; }};export default service;
Au moment de la construction des sites statiques et des routes pré-rendues, <Image />
et getImage(options)
appellent la fonction transform()
. Elles passent les options soit par les attributs du composant, soit par un argument options
. Les images transformées seront compilées dans un dossier dist/_astro
.
En mode dev et en mode SSR, Astro ne sait pas Ă lâavance quelles images doivent ĂȘtre optimisĂ©es. Astro utilise un point dâaccĂšs GET (par dĂ©faut, /_image
) pour traiter les images au moment de lâexĂ©cution. <Image />
et getImage()
transmettent leurs options Ă getURL()
, qui renvoie lâURL du point dâaccĂšs. Ensuite, le point dâaccĂšs appelle parseURL()
et transmet les propriétés résultantes à transform()
.
getConfiguredImageService & imageConfig
Titre de la section getConfiguredImageService & imageConfigSi vous implĂ©mentez votre propre point dâaccĂšs comme point dâaccĂšs Astro, vous pouvez utiliser getConfiguredImageService
et imageConfg
pour appeler les méthodes parseURL
et transform
de votre service et fournir la configuration de lâimage.
Pour accĂ©der Ă la configuration du service dâimage (image.service.config
 (EN)), vous pouvez utiliser imageConfig.service.config
.
import type { APIRoute } from "astro";import { getConfiguredImageService, imageConfig } from 'astro:assets';
export const GET: APIRoute = async ({ request }) => { const imageService = await getConfiguredImageService();
const imageTransform = imageService.parseURL(new URL(request.url), imageConfig); // ... récupÚre l'image à partir de imageTransform.src et la stocke dans inputBuffer const { data, format } = await imageService.transform(inputBuffer, imageTransform, imageConfig); return new Response(data, { status: 200, headers: { 'Content-Type': mime.getType(format) || '' } } );}
Voir le point de terminaison intégré pour un exemple complet.
getURL()
Titre de la section getURL()Requis pour les services locaux et externes
getURL(options: ImageTransform, imageConfig: AstroConfig['image']): string
Pour les services locaux, ce hook renvoie lâURL du point dâaccĂšs qui gĂ©nĂšre votre image (en mode SSR et dev). Il nâest pas utilisĂ© pendant la construction. Le point dâaccĂšs local vers lequel getURL()
pointe peut appeler Ă la fois parseURL()
et transform()
.
Pour les services externes, ce hook renvoie lâURL finale de lâimage.
Pour les deux types de services, les options
sont les propriĂ©tĂ©s passĂ©es par lâutilisateur comme attributs du composant <Image />
ou comme options de getImage()
. Elles sont du type suivant :
export type ImageTransform = { // Images importées par l'ESM | chemins d'accÚs aux images distantes/publiques src: ImageMetadata | string; width?: number; height?: number; widths?: number[] | undefined; densities?: (number | `${number}x`)[] | undefined; quality?: ImageQuality; format?: OutputFormat; alt?: string; [key: string]: any;};
parseURL()
Titre de la section parseURL()Requis pour les services locaux ; indisponible pour les services externes
parseURL(url: URL, imageConfig: AstroConfig['image']): { src: string, [key: string]: any}
Ce hook analyse les URLs générées par getURL()
en un objet avec les différentes propriétés à utiliser par transform
(en SSR et en mode dev). Il nâest pas utilisĂ© pendant la construction.
transform()
Titre de la section transform()Requis pour les services locaux ; indisponible pour les services externes
transform(buffer: Uint8Array, options: { src: string, [key: string]: any }, imageConfig: AstroConfig['image']): { data: Uint8Array, format: OutputFormat }
Ce hook transforme et renvoie lâimage et est appelĂ© pendant la construction pour crĂ©er les fichiers dâactifs finaux.
Vous devez retourner un format
pour vous assurer que le bon type MIME est servi aux utilisateurs en mode SSR et développement.
getHTMLAttributes()
Titre de la section getHTMLAttributes()Facultatif pour les services locaux et externes
getHTMLAttributes(options: ImageTransform, imageConfig: AstroConfig['image']): Record<string, any>
Ce hook renvoie tous les attributs supplĂ©mentaires utilisĂ©s pour rendre lâimage en HTML, en fonction des paramĂštres passĂ©s par lâutilisateur (options
).
getSrcSet()
Titre de la section getSrcSet()astro@3.3.0
Experimental
Facultatif pour les services locaux et externes
getSrcSet?: (options: ImageTransform, imageConfig: AstroConfig['image']): SrcSetValue[] | Promise<SrcSetValue[]>;
Ce hook gĂ©nĂšre plusieurs variantes de lâimage spĂ©cifiĂ©e, par exemple, pour gĂ©nĂ©rer un attribut srcset
sur une <img>
ou source
sur <picture>
.
Ce hook retourne un tableau dâobjets avec les propriĂ©tĂ©s suivantes :
export type SrcSetValue = { transform: ImageTransform; descriptor?: string; attributes?: Record<string, any>;};
validateOptions()
Titre de la section validateOptions()Facultatif pour les services locaux et externes
validateOptions(options: ImageTransform, imageConfig: AstroConfig['image']): ImageTransform
Ce hook vous permet de valider et dâaugmenter les options passĂ©es par lâutilisateur. Câest utile pour dĂ©finir des options par dĂ©faut, ou pour indiquer Ă lâutilisateur quâun paramĂštre est nĂ©cessaire.
Voir comment validateOptions()
est utilisé dans les services intégrés Astro.
Configuration de lâutilisateur
Titre de la section Configuration de lâutilisateurConfigurez le service dâimage Ă utiliser dans astro.config.mjs
. La configuration prend la forme suivante :
import { defineConfig } from "astro/config";
export default defineConfig({ image: { service: { entrypoint: "votre-point-dâentrĂ©e", // 'astro/assets/services/squoosh' | 'astro/assets/services/sharp' | string, config: { // ... configuration spĂ©cifique au service. En option. } } },});