Optimasi Gambar dengan next/image
Memakai komponen Image agar gambar otomatis di-resize, lazy load, dan tidak bikin layout bergeser.
Masalah gambar biasa
Tag <img> biasa memuat file asli apa adanya. Foto 5MB dari kamera ikut terkirim 5MB ke HP user. Selain itu, gambar yang belum dimuat bikin teks lompat-lompat (layout shift) saat gambar muncul.
Komponen Image
Ganti <img> dengan Image dari next/image:
// app/page.tsx
import Image from "next/image";
export default function Home() {
return (
<Image
src="/hero.jpg"
alt="Foto hero"
width={1200}
height={600}
priority
/>
);
}Next.js otomatis: menyajikan ukuran yang pas dengan layar, mengonversi ke format modern (WebP/AVIF), lazy load gambar di bawah lipatan, dan mencadangkan ruang agar layout tidak bergeser.
Gambar dari URL eksternal
Untuk gambar dari domain luar (misal API), daftarkan domainnya di konfigurasi:
// next.config.mjs
export default {
images: {
remotePatterns: [
{ protocol: "https", hostname: "cdn.example.com" },
],
},
};Kapan pakai priority
Tambahkan priority hanya untuk gambar hero yang terlihat pertama kali (LCP). Jangan pakai di semua gambar karena mematikan lazy load dan memperlambat halaman.
Tips praktis
Simpan gambar di public/ dengan nama deskriptif seperti hero-produk.webp, bukan IMG_20240101.jpg. Untuk gambar yang tampil beda ukuran di mobile dan desktop, pakai prop sizes agar browser mengunduh ukuran yang paling pas. Ini bisa memangkas ratusan kilobyte per halaman di HP.
Kesalahan umum pemula
- Tetap memakai
<img>biasa. Kehilangan semua optimasi: tidak ada resize otomatis, tidak ada format modern, tidak ada lazy load. prioritydi semua gambar. Ini mematikan lazy load dan memperlambat halaman. Hanya untuk gambar hero/LCP.- Lupa
widthdanheight. Tanpa dimensi, browser tidak bisa mencadangkan ruang dan layout bergeser (CLS buruk).
Latihan singkat
- Ganti semua
<img>di project latihamu denganImage, isiwidth,height, danaltyang deskriptif. - Buka DevTools tab Network, filter "Img", dan bandingkan ukuran file yang diunduh sebelum dan sesudah memakai
next/image.
Rangkuman
Imagedarinext/imageotomatis resize, konversi format modern, dan lazy load.- Wajib isi
widthdanheight(ataufill) untuk mencegah layout shift. - Daftarkan domain eksternal di
next.config.mjsviaremotePatterns. priorityhanya untuk gambar hero/LCP, bukan semua gambar.
Catatan teknis:
widthdanheightwajib diisi (atau pakaifill) agar Next.js bisa menghitung rasio aspek dan mencegah layout shift. Tanpa ini, skor Core Web Vitals-mu (CLS) akan jeblok dan peringkat SEO ikut turun.