09 — Image komponenta (next/image)
Výuka
Proč to existuje?
Obrázky jsou často největší soubory na webových stránkách — mohou mít několik megabytů. Pokud je nenačítáš efektivně, stránka bude pomalá a uživatelé odejdou.
Tradiční tag má problémy:
- Načítá obrázky v původní velikosti (i když je zobrazuješ malé)
- Nenabízí moderní formáty (WebP, AVIF) které jsou menší
- Načítá všechny obrázky najednou (i ty, které uživatel ještě nevidí)
- Způsobuje "layout shift" — stránka skáče, když se obrázky načtou
next/image všechny tyto problémy řeší automaticky.
Jak to funguje?
Komponenta Image z next/image:
- Automaticky mění velikost — generuje správnou velikost pro zařízení uživatele
- Používá moderní formáty — WebP/AVIF místo PNG/JPG (menší soubory)
- Lazy loading — načítá obrázky, až když jsou blízko zobrazení
- Prevence layout shift — rezervuje prostor, aby stránka neskákala
- Blur placeholder — zobrazí rozmazaný náhled během načítání
K čemu to slouží?
- Rychlejší načítání — menší soubory = rychlejší web
- Lepší Core Web Vitals — lepší skóre v Google (SEO)
- Automatická optimalizace — nemusíš ručně upravovat obrázky
- Responsivní — správná velikost pro mobil, tablet, desktop
JavaScript
// app/page.js
import Image from 'next/image'
export default function Home(){
return (
<div>
<h1>Naše galerie</h1>
{/* Místní obrázek (z public/ složky) */}
<Image
src="/logo.png"
alt="Logo firmy"
width={200}
height={100}
/>
{/* Obrázek z externí URL */}
<Image
src="https://example.com/photo.jpg"
alt="Fotka produktu"
width={600}
height={400}
/>
{/* S prioritou (pro LCP - Largest Contentful Paint) */}
<Image
src="/hero.jpg"
alt="Hlavní obrázek"
width={1200}
height={600}
priority // Načte se hned, nepoužívá lazy loading
/>
</div>
)
}
Import lokálních obrázků (doporučeno)
import Image from 'next/image'
import logoImg from '@/public/logo.png' // Import obrázku
export default function Header(){
return (
<header>
{/* Next.js automaticky vyplní width a height */}
<Image
src={logoImg}
alt="Logo"
// width a height se doplní automaticky z importu!
/>
</header>
)
}
Responsivní obrázky (fill)
import Image from 'next/image'
export default function Hero(){
return (
<div style={{ position: 'relative', width: '100%', height: '400px' }}>
<Image
src="/hero.jpg"
alt="Hero obrázek"
fill // Vyplní celý rodičovský element
style={{ objectFit: 'cover' }} // Jak se obrázek přizpůsobí
/>
</div>
)
}
TypeScript
import Image from 'next/image'
import type { StaticImageData } from 'next/image'
import logoImg from '@/public/logo.png'
export default function Header(): JSX.Element{
return (
<header>
<Image
src={logoImg}
alt="Logo"
/>
</header>
)
}
// Komponenta s prop pro obrázek
interface AvatarProps {
src: string | StaticImageData
alt: string
size?: number
}
export default function Avatar({ src, alt, size = 64 }: AvatarProps): JSX.Element{
return (
<Image
src={src}
alt={alt}
width={size}
height={size}
style={{ borderRadius: '50%' }}
/>
)
}
Rozdíl JS vs TS
TypeScript přidává:
- Typy pro props (
ImagePropstyp z Next.js) StaticImageDatatyp pro importované obrázky- Kontrolu povinných props (width, height, nebo fill)
Konfigurace pro externí obrázky
Pro obrázky z externích URL musíš povolit domény v next.config.js:
// next.config.js
module.exports = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'example.com',
},
{
protocol: 'https',
hostname: 'cdn.example.com',
pathname: '/images/**',
},
],
},
}
Důležité props komponenty Image
<Image
src="/photo.jpg" // Povinné: cesta k obrázku
alt="Popis" // Povinné: popis pro accessibility
width={600} // Povinné (kromě fill): šířka
height={400} // Povinné (kromě fill): výška
// Volitelné
priority={true} // Načte hned (pro hlavní obrázky)
quality={90} // Kvalita 1-100 (výchozí 75)
placeholder="blur" // Rozmazaný placeholder během načítání
blurDataURL="data:..." // Custom blur placeholder
fill // Vyplní rodičovský element
sizes="(max-width: 768px) 100vw, 50vw" // Responsivní velikosti
style={{ objectFit: 'cover' }} // CSS object-fit
className="rounded-lg" // CSS třída
onLoadingComplete={() => {}} // Callback po načtení
/>
Tip
- Vždy používej
Imagemísto— automatická optimalizace zdarma - Priority pro hlavní obrázky — použij
prioritypro hero images (zlepší LCP) - Import lokálních obrázků — Next.js automaticky doplní šířku/výšku
- Externí obrázky — nezapomeň přidat domény do
next.config.js - Alt text je povinný — důležité pro SEO a accessibility
- Fill pro responsivní — když chceš, aby obrázek vyplnil prostor
Blur placeholder (lokální obrázky)
import Image from 'next/image'
import photo from '@/public/photo.jpg'
export default function Gallery(){
return (
<Image
src={photo}
alt="Fotka"
placeholder="blur" // Automatický blur z importu!
/>
)
}
Sizes prop pro responsivní obrázky
<Image
src="/photo.jpg"
alt="Fotka"
fill
sizes="(max-width: 768px) 100vw,
(max-width: 1200px) 50vw,
33vw"
// Na mobilu = 100% šířky viewportu
// Na tabletu = 50% šířky
// Na desktopu = 33% šířky
/>
Kvíz
K čemu slouží komponenta next/image v Next.js?
Komponenta Image z next/image automaticky optimalizuje obrázky na webové stránce. Mění jejich velikost podle zařízení uživatele, používá moderní formáty (WebP, AVIF) které jsou menší, načítá obrázky líně (lazy loading) až když jsou blízko zobrazení, a prevencí layout shift zajišťuje, že stránka neskáče během načítání. Výsledek: rychlejší web, lepší SEO, menší datový objem — vše automaticky bez ruční práce.
🎯 Závěrečný projekt
Po dokončení všech 8 dílů vytvoříte jednoduchou Todо aplikaci v čistém JavaScriptu. Naučíte se, jak aplikovat vše, co jste se naučili, na reálný projekt.
Zobrazit podrobnosti projektu →Informace o seriálu
Obtížnost
Délka
Cca 480 minut
Počet videí
8 videí + projekty
Certifikát
Po dokončení obdržíte certifikát
Lekce v této sekci
- 01 — Co je Next.js
- 02 — Vytvoření projektu
- 03 — Struktura projektu (app/)
- 04 — Page komponenty (page.js / page.tsx)
- 05 — Layout komponenty (layout.js / layout.tsx)
- 06 — File-based routing
- 07 — Dynamické routy ([id]/page.js)
- 08 — Link komponenta (navigace)
- 09 — Image komponenta (next/image)
- 10 — Metadata (title, description, Open Graph)
- 11 — Loading UI (loading.js / loading.tsx)
- 12 — Error handling (error.js / error.tsx)
- 13 — Not Found (not-found.js / not-found.tsx)
Struktura lekcí (souborový strom)
- 1.1 Úvod do JavaScriptu a TypeScriptu
- 1.2 Nastavení prostředí
- 1.3 První program
- 1.4 Proměnné: var, let, const
- 1.5 Datové typy - přehled
- 1.6 String (řetězce)
- 1.7 Number (čísla)
- 1.8 Boolean (pravda/nepravda)
- 1.9 Null a Undefined
- 1.10 Type Inference vs Annotations
- 1.11 Aritmetické operátory
- 1.12 Porovnávací operátory
- 1.13 Logické operátory
- 1.14 Komentáře
- 1.15 Console metody
- 03.01 Deklarace funkce
- 03.02 Function Expression
- 03.03 Arrow Functions
- 03.04 Parametry a argumenty
- 03.05 Return hodnoty
- 03.06 Výchozí parametry
- 03.07 Rest parametry
- 03.08 Co je Scope
- 03.09 Lexikální Scope
- 03.10 Řetězec Scope
- 03.11 Globální Scope
- 03.12 Životní Cyklus Proměnných
- 03.13 Omezení Scope
- 03.14 Použití Closures
- 03.15 Callback funkce
- 03.16 Higher-order Functions
- 03.17 IIFE
- 03.18 Void funkce
- 03.19 Rekurze
- v přípravě
- v přípravě
- v přípravě
- v přípravě
- 01 — Co je Next.js
- 02 — Vytvoření projektu
- 03 — Struktura projektu (app/)
- 04 — Page komponenty (page.js / page.tsx)
- 05 — Layout komponenty (layout.js / layout.tsx)
- 06 — File-based routing
- 07 — Dynamické routy ([id]/page.js)
- 08 — Link komponenta (navigace)
- 09 — Image komponenta (next/image)
- 10 — Metadata (title, description, Open Graph)
- 11 — Loading UI (loading.js / loading.tsx)
- 12 — Error handling (error.js / error.tsx)
- 13 — Not Found (not-found.js / not-found.tsx)
- v přípravě
- v přípravě
- v přípravě