Episode ini membahas optimasi gambar di Gatsby: gatsby-plugin-image untuk gambar responsif, konfigurasi gatsby-plugin-sharp dan gatsby-transformer-sharp, lazy loading dan placeholder, serta penanganan audio dan video di halaman.

Gambar adalah kontributor terbesar bobot sebuah halaman web. Gatsby menyelesaikan ini dengan rangkaian plugin Sharp yang menghasilkan gambar responsif secara otomatis: format modern, ukuran pas untuk setiap layar, lazy loading, dan placeholder yang halus.
Episode 6 membedah gatsby-plugin-image, dua komponen utamanya, konfigurasi plugin pendukung, serta cara menangani media lain seperti audio dan video.
gatsby-plugin-image bekerja bersama Sharp. Install empat paket sekaligus:
npm install gatsby-plugin-image gatsby-plugin-sharp
npm install gatsby-transformer-sharp gatsby-source-filesystemKemudian daftarkan di gatsby-config.js:
module.exports = {
plugins: [
"gatsby-plugin-image",
"gatsby-plugin-sharp",
"gatsby-transformer-sharp",
{
resolve: "gatsby-source-filesystem",
options: {
name: "images",
path: `${__dirname}/src/images`,
},
},
],
}Tiga plugin pertama berjalan bersama: source filesystem menyediakan file, transformer-sharp mengubah gambar menjadi node, dan plugin-image memberi field gatsbyImageData yang siap di-render.
Untuk gambar yang alamatnya tetap (misalnya logo dan ilustrasi), pakai StaticImage tanpa query:
import { StaticImage } from "gatsby-plugin-image"
const Hero = () => (
<StaticImage
src="../images/hero.png"
alt="Ilustrasi hero"
width={1200}
placeholder="blurred"
/>
)<StaticImage src="../images/hero.png" alt="Ilustrasi hero"{:jsx}> mengharuskan path di-resolve saat build. Properti width dan layout mengontrol ukuran responsif yang dihasilkan.
Untuk gambar dinamis — misalnya gambar dari frontmatter setiap post — query gambar lalu render dengan GatsbyImage:
import { graphql } from "gatsby"
import { GatsbyImage, getImage } from "gatsby-plugin-image"
export const query = graphql`
query {
markdownRemark {
frontmatter {
featuredImage {
childImageSharp {
gatsbyImageData(layout: FULL_WIDTH, placeholder: BLURRED)
}
}
}
}
}
`
const PostPage = ({ data }) => {
const image = getImage(data.markdownRemark.frontmatter.featuredImage)
return (
<GatsbyImage
image={image}
alt="Gambar utama post"
/>
)
}Helper getImage mengubah node gambar menjadi object yang siap dipakai GatsbyImage. layout: FULL_WIDTH membuat gambar meregang penuh selebar kontainer.
Pilih layout sesuai kebutuhan:
FIXED: ukuran tetap, cocok untuk avatar dan ikon.CONSTRAINED: ukuran maksimum tertentu, menyusut jika layar kecil.FULL_WIDTH: selebar kontainer, dipakai untuk hero dan banner.Gatsby otomatis memilih format terbaik di antara WebP dan AVIF, lalu memakai source set untuk tiap resolusi layar. Kualitas bisa diatur lewat argumen query seperti quality: 80 dan transformOptions untuk cropping.
Placeholder blurred menampilkan versi blur kecil sambil gambar asli dimuat. Untuk gambar di luar area layar, Gatsby memakai Intersection Observer sehingga hanya gambar yang terlihat yang dimuat — inilah lazy loading bawaan.
Tip
Selalu isi properti alt dengan deskripsi yang bermakna. Gambar dekoratif boleh memakai alt="" kosong, tapi jangan dihilangkan sama sekali karena akan mengganggu aksesibilitas.
Gatsby tidak men-transcode video secara otomatis; file media besar sebaiknya ditempatkan di folder static atau CDN eksternal, lalu dirender dengan elemen HTML standar:
const MediaSection = () => (
<section>
<video controls preload="none" poster="../images/cover.png">
<source src="/video/demo.mp4" type="video/mp4" />
</video>
<audio controls preload="metadata">
<source src="/audio/episode.mp3" type="audio/mpeg" />
</audio>
</section>
)Atribut preload="none" pada video mencegah unduhan data sebelum diputar. Untuk embed dari layanan eksternal seperti YouTube, iframe standar tetap bekerja baik.
Folder static di akar project disalin apa adanya ke public saat build. Taruh di sana file yang tidak perlu diproses oleh data layer, sehingga URL-nya langsung bisa diakses seperti /video/demo.mp4.
Episode 6 menuntaskan optimasi media: gatsby-plugin-image dan Sharp untuk gambar responsif, StaticImage untuk gambar statis, GatsbyImage untuk gambar dari query, serta penanganan audio dan video.
Inti yang harus dibawa pulang:
StaticImage untuk gambar dengan path tetap; GatsbyImage untuk gambar dari GraphQL.static atau CDN.alt untuk aksesibilitas.Di episode 7 selanjutnya kita akan membahas plugins dan themes — memahami ekosistem plugin Gatsby, cara install dan konfigurasi, membuat theme yang reusable, serta best practice urutan plugin dan dampaknya terhadap performa.