Nuxt Image
Optimierte Bilder mit automatischer Größenanpassung und Format-Konvertierung
Warum Nuxt Image?
Bilder machen oft über 50 % der Seitengröße aus. Nuxt Image optimiert sie automatisch: Größenanpassung, Format-Konvertierung (WebP, AVIF), Lazy Loading und responsive Breakpoints — alles mit minimaler Konfiguration.
Das Modul stellt zwei Komponenten bereit: <NuxtImg> für normale Bilder und <NuxtPicture> für das <picture>-Element mit mehreren Quellen.
Installation
npx nuxi module add imageexport default defineNuxtConfig({
modules: ['@nuxt/image'],
image: {
// Standard-Qualität für alle Bilder
quality: 80,
// Bildschirmgrößen für responsive Bilder
screens: {
xs: 320,
sm: 640,
md: 768,
lg: 1024,
xl: 1280,
xxl: 1536
},
// Format-Priorität
format: ['avif', 'webp', 'png', 'jpg']
}
})NuxtImg — das optimierte <img>
<NuxtImg> ist ein Drop-in-Ersatz für das native <img>-Tag mit automatischer Optimierung:
<template>
<div>
<!-- Einfachste Verwendung -->
<NuxtImg src="/images/profil.jpg" alt="Profilbild" />
<!-- Mit Größenangabe — Bild wird serverseitig skaliert -->
<NuxtImg
src="/images/profil.jpg"
alt="Profilbild"
width="200"
height="200"
fit="cover"
/>
<!-- Responsive Größen mit sizes -->
<NuxtImg
src="/images/hero.jpg"
alt="Hero-Bild"
sizes="sm:100vw md:50vw lg:400px"
/>
<!-- Qualität und Format steuern -->
<NuxtImg
src="/images/foto.jpg"
alt="Foto"
format="webp"
:quality="75"
loading="lazy"
/>
<!-- Platzhalter während des Ladens -->
<NuxtImg
src="/images/grosses-bild.jpg"
alt="Großes Bild"
placeholder
loading="lazy"
/>
</div>
</template>Verfügbare Props
- src — Bildpfad (lokal oder remote)
- width / height — Zielgröße in Pixeln
- sizes — Responsive Größen pro Breakpoint
- fit — cover, contain, fill, inside, outside
- format — webp, avif, png, jpg, gif
- quality — 1–100
- loading — lazy oder eager
- placeholder — Zeigt unscharfen Platzhalter
NuxtPicture — mehrere Formate
<NuxtPicture> erzeugt ein <picture>-Element mit mehreren <source>-Tags. Der Browser wählt automatisch das beste Format:
<template>
<div>
<!-- Automatisch AVIF, WebP und Fallback -->
<NuxtPicture
src="/images/hero.jpg"
alt="Hero-Bild"
sizes="sm:100vw md:80vw lg:1200px"
:quality="85"
/>
<!--
Erzeugt ungefähr:
<picture>
<source type="image/avif" srcset="..." sizes="..." />
<source type="image/webp" srcset="..." sizes="..." />
<img src="hero.jpg" alt="Hero-Bild" />
</picture>
-->
<!-- Art Direction: verschiedene Bilder pro Breakpoint -->
<NuxtPicture
src="/images/hero-desktop.jpg"
alt="Hero"
:imgAttrs="{ class: 'hero-image' }"
sizes="sm:100vw lg:1200px"
format="avif,webp"
/>
</div>
</template>
<style scoped>
:deep(.hero-image) {
width: 100%;
height: auto;
object-fit: cover;
}
</style>Image Providers
Nuxt Image unterstützt verschiedene Bild-Provider. Der Standard ist IPX (lokal), aber du kannst auch Cloud-Dienste anbinden:
export default defineNuxtConfig({
modules: ['@nuxt/image'],
image: {
// Lokaler Provider (Standard) — optimiert Bilder auf dem Server
provider: 'ipx',
// Cloudinary als Provider
// provider: 'cloudinary',
// cloudinary: {
// baseURL: 'https://res.cloudinary.com/dein-account/image/upload/'
// },
// Mehrere Provider gleichzeitig nutzen
providers: {
cloudinary: {
provider: 'cloudinary',
options: {
baseURL: 'https://res.cloudinary.com/dein-account/image/upload/'
}
}
},
// Externe Domains erlauben
domains: ['images.unsplash.com', 'avatars.githubusercontent.com']
}
})<template>
<div>
<!-- Lokales Bild (IPX) -->
<NuxtImg src="/images/lokal.jpg" alt="Lokal" />
<!-- Cloudinary-Bild -->
<NuxtImg
provider="cloudinary"
src="/v1234/samples/landschaft.jpg"
alt="Cloudinary-Bild"
width="800"
/>
<!-- Externes Bild (Domain muss erlaubt sein) -->
<NuxtImg
src="https://images.unsplash.com/photo-123"
alt="Unsplash"
width="600"
/>
</div>
</template>Verfügbare Provider
Nuxt Image unterstützt unter anderem:
- ipx — Lokaler Provider (Standard)
- cloudinary — Cloudinary CDN
- imgix — Imgix CDN
- vercel — Vercel Image Optimization
- netlify — Netlify Image CDN
- cloudflare — Cloudflare Images
Lazy Loading und Performance
<template>
<div class="galerie">
<!-- Hero-Bild: sofort laden (above the fold) -->
<NuxtImg
src="/images/hero.jpg"
alt="Hero"
loading="eager"
:preload="true"
sizes="100vw"
/>
<!-- Galerie-Bilder: lazy laden -->
<div class="grid">
<NuxtImg
v-for="bild in bilder"
:key="bild.id"
:src="bild.url"
:alt="bild.beschreibung"
loading="lazy"
placeholder
width="400"
height="300"
fit="cover"
format="webp"
:quality="80"
/>
</div>
</div>
</template>
<script setup lang="ts">
const bilder = ref([
{ id: 1, url: '/images/foto-1.jpg', beschreibung: 'Landschaft' },
{ id: 2, url: '/images/foto-2.jpg', beschreibung: 'Stadt' },
{ id: 3, url: '/images/foto-3.jpg', beschreibung: 'Natur' },
{ id: 4, url: '/images/foto-4.jpg', beschreibung: 'Architektur' },
])
</script>
<style scoped>
.grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 1rem;
}
</style>Performance-Tipps
- Nutze
loading="eager"nur für Above-the-Fold-Bilder - Setze immer
widthundheightum Layout Shifts zu vermeiden - Nutze
placeholderfür große Bilder unterhalb des sichtbaren Bereichs - Bevorzuge
format="webp"oder"avif"für kleinere Dateien - Nutze
sizesstatt fester Breiten für responsive Layouts
Zusammenfassung
Wichtige Konzepte
- NuxtImg — Optimiertes
<img>mit automatischer Skalierung - NuxtPicture —
<picture>-Element mit mehreren Formaten - IPX — Lokaler Bild-Optimierer (Standard-Provider)
- sizes — Responsive Bildgrößen pro Breakpoint
- placeholder — Unscharfer Platzhalter beim Laden
- Provider — Cloudinary, Imgix, Vercel u.v.m.