Skip to content

Assets

Optimierbare Originalbilder liegen unter src/assets/ und laufen durch die Bildpipeline von Astro. public/ ist nur für Dateien gedacht, die unverändert ausgeliefert werden müssen.

Die Regel

Bilder werden über ihren Schlüssel im Manifest angesprochen, nicht über einen Dateipfad.

astro
---
import Pic from '../components/media/Pic.astro';
---

<Pic asset="startseite-hero" priority />

Alt-Text, Bildnachweis, Fokuspunkt und Preset stehen in src/content/assets.yaml. Ein zweiter Einsatzort erbt dadurch denselben Alt-Text, statt einen neuen zu erfinden. Ein Tippfehler im Schlüssel bricht den Build ab — Seiten werden beim Bauen gerendert, und getAsset() wirft bei einem unbekannten Schlüssel.

Das Manifest

src/content/assets.yaml ist eine Content Collection mit file()-Loader. Das Schema in src/content.config.ts wird beim Bauen ausgewertet.

yaml
startseite-hero:
  file: ../assets/startseite-hero-arbeitsplatz.jpg
  alt: Platzhalterbild des Starters mit diagonalem Streifenmuster in der Markenfarbe.
  altApproved: true
  preset: hero
  focalPoint:
    x: 0.35
    y: 0.4
FeldPflichtBedeutung
filejaPfad relativ zur YAML-Datei; wird beim Bauen aufgelöst
altjaAlternativtext, nicht leer
presetjahero, card, logo oder og
altApprovedneinfalse heißt: Vorschlag, noch nicht menschlich geprüft
creditneinBildnachweis; ist er gesetzt, wird er sichtbar ausgegeben
focalPointneinAnteile 0–1; Vorgabe Mitte

Drei Dinge brechen den Build ab: ein fehlender Alt-Text, ein unbekanntes Preset und eine Bilddatei, die es nicht gibt. Das letzte kommt von image() im Schema — ein Tippfehler im Dateinamen scheitert beim Bauen und nicht erst als fehlendes Bild auf der fertigen Seite.

Alt-Texte

Ein Sprachmodell darf Alt-Texte vorschlagen. Bis zur menschlichen Freigabe gelten sie als Vorschlag, nicht als endgültige Wahrheit — dafür ist altApproved da. Ein Modell sieht das Bild, kennt aber nicht seine Rolle im Text.

Dekorative Bilder

Ein leerer Alt-Text ist nicht vorgesehen. Rein dekorative Bilder gehören nicht ins Manifest, sondern als Hintergrund ins CSS.

Benennung

bereich-motiv-variante.ext — etwa startseite-hero-arbeitsplatz.jpg. Der Dateiname beschreibt das Bild, der Manifest-Schlüssel seinen Einsatzort. Beide dürfen sich unabhängig ändern: Wird ein Foto getauscht, bleibt der Schlüssel und keine Seite muss angefasst werden.

Die Bilder im Starter sind Platzhalter und werden im Kundenprojekt ersetzt.

Presets

Ein Preset bündelt, was zusammengehört: erzeugte Breiten, die im Layout belegte Breite und das Skalierungsverhalten. widths ohne passendes sizes lädt zuverlässig die falsche Datei — und das fällt nur mit einem Netzwerkprofil auf. Deshalb wählen Seiten ein Preset, keine Einzelwerte.

PresetLayoutEinsatz
herofull-widthBild über die volle Seitenbreite
cardconstrainedBild in Karte oder Raster
logoconstrainedWort- oder Bildmarke, hohe Güte
ogfixedVorschaubild für soziale Netzwerke

Die Presets stehen in src/lib/images.ts. Am Einsatzort lässt sich das Preset des Manifests überschreiben (<Pic asset="…" preset="card" />), ebenso sizes.

Erzeugt werden AVIF und WebP plus eine Fallback-Datei im Ursprungsformat. Der Browser nimmt das erste Format, das er beherrscht.

Bilder über der Falz

Das LCP-Bild einer Seite bekommt priority:

astro
<Pic asset="startseite-hero" priority />

Das setzt loading="eager", decoding="sync" und fetchpriority="high".

Genau eines pro Seite

Mehrere vorrangige Bilder konkurrieren um dieselbe Bandbreite und verschlechtern genau die Kennzahl, für die sie gesetzt wurden. Ein Post-Build-Test prüft das auf jeder Seite jeder Ausgabe.

Fokuspunkt

Bildausschnitte entstehen nicht beim Erzeugen der Datei, sondern erst im Layout: Ein Hero-Bild in einem flachen Container beschneidet der Browser. Ohne Angabe beschneidet er zur Mitte — und schneidet zuverlässig Köpfe ab.

focalPoint aus dem Manifest wird zu object-position. Der Styleguide zeigt den Effekt an einem sehr flachen Container.

Bildnachweis

Ist credit gesetzt, gibt <Pic /> ihn als <figcaption> aus — ohne Schalter am Einsatzort. Ein Nachweis, den man vergessen kann, ist bei fremdem Bildmaterial ein rechtliches Risiko. Wer keinen sichtbaren Nachweis will, trägt keinen ein.

Was geprüft wird

pnpm verify enthält mit test:dist Prüfungen auf dem ausgelieferten HTML — für alle drei Ausgaben, also auch die Fixtures:

  • kein <img> ohne alt
  • kein <img> ohne width und height (sonst springt der Text beim Nachladen)
  • jedes <picture> bietet AVIF und WebP an
  • höchstens ein Bild je Seite mit fetchpriority="high"
  • alle übrigen Bilder laden verzögert
  • der Fokuspunkt landet tatsächlich in object-position

Noch offen

  • Import-Skillimport-assets pflegt Benennung und Manifest und markiert vorgeschlagene Alt-Texte (M9)
  • OG-Bilder im Kopfseo.defaultOgImage wird ab M4 von der <Seo />-Komponente ausgegeben