Episode ini membahas aset dan konten statis: static assets di direktori static, image optimization dan gambar responsif dengan enhanced-img, content sourcing dari Markdown dan MDX, serta caching dan build-time optimizations. Kalian akan menyajikan konten cepat dengan aset yang terkelola rapi.

Sebuah aplikasi tidak hanya soal logika — ia juga soal aset: logo, foto, ikon, dan dokumen. Cara aset dikelola memengaruhi waktu loading, biaya bandwidth, dan pengalaman pengguna. Episode 9 membahas tiga kategori: aset statis, gambar teroptimasi, dan konten berbasis file.
SvelteKit menawarkan dua jalur aset yang berbeda: direktori static untuk file yang disalin apa adanya, dan import modul untuk file yang diproses Vite. Memahami perbedaan ini adalah kunci untuk memilih jalur yang tepat.
Di akhir episode ini, kalian bisa menyajikan gambar responsif yang teroptimasi otomatis, memuat konten Markdown sebagai halaman, dan mengatur caching aset dengan benar.
Folder static disalin utuh ke output build dan disajikan dari akar domain. Cocok untuk file yang tidak perlu diproses: favicon, robots.txt, manifest, PDF, dan gambar yang memang sudah dioptimasi.
static/
|-- favicon.ico
|-- robots.txt
|-- manifest.webmanifest
|-- images/
| |-- logo.png
| |-- banner.jpgFile di static diakses langsung dari URL root: static/robots.txt menjadi /robots.txt, dan static/images/logo.png menjadi /images/logo.png. Tidak ada hash nama file, jadi pastikan kalian memakai nama yang stabil.
Gunakan static untuk file yang jarang berubah dan tidak butuh pemrosesan. Untuk gambar yang dipakai di dalam komponen dan ingin dioptimasi, import langsung dari modul sebagai gantinya — Vite akan menangani transformasi dan hashing.
Paket @sveltejs/enhanced-img mengintegrasikan gambar responsif ke Vite. Ia menghasilkan beberapa ukuran dan format sekaligus saat build, serta menyediakan komponen untuk memilih srcset secara otomatis.
import { sveltekit } from "@sveltejs/kit/vite";
import { enhancedImages } from "@sveltejs/enhanced-img";
const config = {
plugins: [enhancedImages(), sveltekit()]
};
export default config;Setelah plugin dipasang, import gambar dari src/lib dan Vite akan menghasilkan varian webp dan avif dengan beberapa ukuran. Hashing nama file juga membuat cache invalidasi otomatis saat gambar berubah.
<script>
import { enhanced: img } from "$lib/assets/hero.png";
</script>
<img
src={img.src}
srcset={img.srcset}
sizes="(min-width: 768px) 50vw, 100vw"
alt="Hero halaman utama"
loading="lazy"
decoding="async"
/>Attribut srcset dan sizes meminta browser memilih ukuran paling sesuai dengan viewport dan density layar. Tambahkan loading="lazy" untuk gambar di bawah fold dan decoding="async" agar decoding tidak menghambat rendering halaman.
Konten editorial — artikel, dokumentasi, changelog — sebaiknya ditulis sebagai Markdown atau MDX, bukan disimpan di database. File mudah direview, di-versioning dengan Git, dan di-render sebagai halaman.
src/content/
|-- sveltekit/
| |-- pengenalan.md
| |-- routing.md
|-- vite/
| |-- dasar.mdUntuk membuat Markdown menjadi halaman, gunakan preprocessor mdsvex yang mengubah file .md menjadi komponen Svelte, atau pakai pustaka konten seperti Velite (pasang dengan npm install velite) yang menghasilkan data terstruktur dan tipe TypeScript. Polanya: kumpulkan daftar file, parse frontmatter dan body, lalu muat isinya di load function dan render dengan komponen Markdown.
Dynamic route [slug] yang di-preprerender adalah pasangan alami untuk konten statis: setiap file Markdown menjadi halaman yang dihasilkan saat build, cepat dan ramah SEO.
Setelah aset dibangun, header cache menentukan seberapa lama browser boleh menyimpan salinan. Di SvelteKit, atur header di dalam hook handle.
export const handle = async ({ event, resolve }) => {
const res = await resolve(event);
const url = event.url.pathname;
if (url.startsWith("/images/")) {
res.headers.set("cache-control", "public, max-age=31536000, immutable");
} else {
res.headers.set("cache-control", "no-cache");
}
return res;
};Gambar dengan nama hash yang berubah saat konten berubah aman di-cache lama dengan immutable. Halaman HTML dan dokumen dinamis lebih baik memakai no-cache agar selalu di-revalidate.
SvelteKit meminimalkan duplikasi dengan memakai kembali asset dari src/lib di banyak halaman. File Markdown yang diproses saat build mengurangi pekerjaan runtime. Pasangan static untuk file jarang berubah dan src/lib untuk aset yang diproses memberi keseimbangan antara kesederhanaan dan performa.
Inti yang harus dibawa pulang:
static disalin apa adanya dan disajikan dari root URL, cocok untuk file yang jarang berubah.src/lib agar Vite memproses dan meng-hash file.enhanced-img menghasilkan varian ukuran dan format saat build dengan srcset otomatis.loading="lazy" dan decoding="async" untuk gambar di bawah fold.cache-control di hooks menentukan umur cache; nama file ber-hash aman diberi immutable.Di episode 10 selanjutnya kita masuk ke sisi server: API routes & back-end integration. Kalian akan membuat endpoint dengan +server.js, memakai dan mengekspos API internal, menyusun authentication middleware untuk protected endpoints, serta integrasi database dengan ORM.