Resource Hints — Performance

Resource Hints Resource hints memberi tahu browser tentang resource yang akan dibutuhkan, sehingga browser bisa mulai loading lebih awal. preload Untuk…

Resource hints adalah tag <link> di <head> yang memberi tahu browser lebih awal soal sesuatu yang bakal dibutuhkan, supaya dia bisa mulai menyambung atau mengunduh sebelum menemukannya sendiri. Mirip makan di restoran: dns-prefetch itu mencari alamat restorannya dulu, preconnect itu sudah jalan ke sana dan duduk di meja, preload itu memesan hidangan utama sekarang juga karena pasti kamu makan, dan prefetch itu minta dibungkuskan makanan untuk nanti malam, dibuat kalau dapur sedang senggang.

🧪 Tebakan cepat: tanpa hint, teks halaman di Lab tampil dengan font-nya di 863 ms. Kalau font itu kamu preload tapi lupa atribut crossorigin, teksnya tampil lebih cepat, sama, atau lebih lambat? Tebak dulu, jawabannya ada di bagian "preload: unduh sekarang, pasti dipakai".

Kenapa browser telat tahu

Browser baru tahu sebuah file dibutuhkan saat dia menemukannya. Masalahnya, sebagian file baru ketahuan belakangan. Ini halaman toko di Lab (jaringan dengan jeda bolak-balik 100 ms dan kecepatan 400 KB per detik):

File Ditemukan saat Selesai
index.html awal 450 ms
style.css, app.js <head> HTML terbaca, 400 ms 650 ms, 976 ms
font inter.woff2 CSS selesai dibaca, 650 ms 863 ms
data api.tokoku.id/produk app.js selesai jalan, 1.026 ms 1.451 ms

Font baru diminta setelah CSS selesai, karena @font-face ada di dalam CSS. Data produk baru diminta setelah app.js jalan, dan karena alamatnya di origin lain, browser masih harus menyambung ke sana dulu. Resource hints memindahkan pekerjaan itu ke depan.

preconnect dan dns-prefetch: siapkan jalannya

Menyambung ke origin baru (gabungan protokol, domain dan port, misalnya https://api.tokoku.id) butuh tiga langkah, masing-masing sekitar satu kali bolak-balik ke server:

  1. DNS: mencari alamat IP dari nama domain.
  2. TCP: membuka sambungan.
  3. TLS: menyepakati enkripsi untuk HTTPS.

Di Lab itu 3 × 100 ms = 300 ms sebelum request pertama bisa dikirim.

<!-- Pasti dipakai sebentar lagi: siapkan DNS + TCP + TLS sekarang -->
<link rel="preconnect" href="https://api.tokoku.id" crossorigin>

<!-- Dipakai belakangan: cukup cari alamatnya dulu -->
<link rel="dns-prefetch" href="https://stats.analitik.com">

preload: unduh sekarang, pasti dipakai

preload menyuruh browser mengunduh satu file sekarang, dengan prioritas tinggi, karena halaman ini pasti memakainya sebentar lagi.

<link rel="preload" href="/fonts/inter.woff2" as="font" type="font/woff2" crossorigin>

Di Lab, font yang di-preload dengan benar membuat teks tampil di 726 ms, bukan 863 ms. Tanpa crossorigin, teksnya malah tampil di 939 ms: lebih lambat daripada tanpa hint sama sekali, karena 30 KB terbuang ikut berebut bandwidth. Itu jawaban tebakannya. Chrome juga menulis peringatan di Console: "A preload for '...' is found, but is not used because the request credentials mode does not match."

prefetch: untuk halaman berikutnya

prefetch untuk file yang mungkin dibutuhkan halaman berikutnya. Browser mengunduhnya dengan prioritas paling rendah, setelah halaman ini selesai, lalu menyimpannya di cache.

<link rel="prefetch" href="/assets/produk.js">

Di Lab, produk.js (chunk halaman Produk dari pelajaran code splitting) diunduh diam-diam setelah halaman selesai. Waktu user mengklik Produk, dia langsung ada di cache: menunggu 0 ms, bukan 225 ms.

Bedanya dengan preload: preload untuk halaman ini dan pasti dipakai; prefetch untuk halaman berikutnya dan mungkin dipakai.

Hint itu gak gratis

Tiap hint membuat browser bekerja berdasarkan tebakanmu. Tebakan yang salah membuang tenaga:

💡 fetchpriority, modulepreload, dan Speculation Rules

⚠️ Jebakan yang sering ketemu

TL;DR: Resource hints adalah <link> di <head> yang memindahkan pekerjaan ke depan. preconnect menyiapkan DNS, TCP dan TLS ke origin yang pasti dipakai (di Lab data produk 1.451 ms jadi 1.151 ms); dns-prefetch cuma DNS, untuk origin yang dipakai belakangan. preload mengunduh file kritis halaman ini sekarang, wajib dengan as (as="font"), dan font juga butuh crossorigin (teks 863 ms jadi 726 ms; tanpa crossorigin malah 939 ms). prefetch mengunduh file halaman berikutnya dengan prioritas rendah. Hint gak gratis: terlalu banyak preload memperlambat yang kritis, dan prefetch yang jarang dipakai membuang kuota, CPU dan baterai user.

Yang akan kamu pelajari