Skip to main content
BlogWeb Dev

Speculation Rules API: Prerender dan Prefetch Instan di Chrome

Cara saya memakai Speculation Rules API untuk prefetch dan prerender halaman di Chromium — sintaks JSON, level eagerness, document rules, dan bedanya dengan Next.js Link prefetch.

Matthews Wong

Software Engineer

Agustus 20269 menit baca
Speculation Rules API: Prerender dan Prefetch Instan di Chrome

Foto oleh Tyler Hardie on Unsplash

Ringkasan Utama

Speculation Rules API memungkinkan Anda menambah blok JSON script type speculationrules yang memberi tahu browser Chromium URL mana yang perlu di-prefetch atau di-prerender sebelum diklik. Prefetch mengunduh body respons; prerender merender penuh halaman di tab tersembunyi untuk navigasi hampir instan. Pengaturan eagerness mengontrol seberapa agresif spekulasi berjalan.

Jeda antara klik dan halaman yang tampil adalah tempat pengguna merasakan situs sebagai lambat. Saya bisa memangkas milidetik di sisi server, tetapi kemenangan tunggal terbesar sering kali adalah mengerjakan pekerjaan itu sebelum klik terjadi sama sekali. Speculation Rules API adalah cara native browser untuk melakukan persis itu: Anda mendeklarasikan halaman mana yang kemungkinan dikunjungi pengunjung berikutnya, lalu Chromium mengambil atau bahkan merender penuh halaman tersebut di latar belakang.

API ini menggantikan resource hint lama yang lebih terbatas seperti link rel prefetch dengan tata bahasa JSON yang bisa mencocokkan tautan berdasarkan pola URL, memilih antara prefetch yang murah dan prerender penuh, serta menyetel seberapa agresif browser bertindak. Di tulisan ini saya membahas sintaksnya, trade-off antara prefetch dan prerender, level eagerness, perbandingannya dengan komponen Link Next.js, dan jebakan yang saya temui di produksi.

Apa itu Speculation Rules API

Anda mengaktifkannya dengan menyisipkan tag script bertipe speculationrules ke dalam halaman. Isinya adalah objek JSON dengan dua kunci yang mungkin, prefetch dan prerender, masing-masing memuat sebuah array aturan. Bentuk paling sederhana adalah list rule: Anda menyebutkan URL persis yang ingin dispekulasikan browser. Deteksi fitur cukup satu baris — HTMLScriptElement.supports dengan argumen speculationrules mengembalikan true di tempat API ini ada.

<script type="speculationrules">
{
  "prefetch": [
    {
      "source": "list",
      "urls": ["/pricing", "/docs/getting-started"]
    }
  ],
  "prerender": [
    {
      "source": "list",
      "urls": ["/checkout"]
    }
  ]
}
</script>

Prefetch versus prerender: dua biaya yang sangat berbeda

Prefetch hanya mengunduh body respons halaman target dan menyimpannya di cache dalam memori. Ia tidak mengambil subresource, dan tidak mengeksekusi JavaScript halaman. Biayanya rendah, dan hasilnya saat navigasi adalah HTML sudah tersedia — Anda melewati perjalanan jaringan tetapi tetap perlu mem-parse, merender, dan menjalankan skrip setelah klik.

Prerender melangkah jauh lebih dalam: browser memuat halaman ke tab tersembunyi, mengambil setiap subresource, dan menjalankan JavaScript-nya, sehingga aktivasi saat klik nyaris instan. Biayanya pun tinggi — kira-kira setara membuka halaman di iframe tak terlihat. Prerender bersifat same-origin secara default; prerender same-site lintas origin membutuhkan header opt-in eksplisit dari target.

Jadikan prefetch sebagai default yang aman dan tingkatkan sebuah tautan menjadi prerender hanya saat Anda yakin ia akan diklik — tombol checkout, halaman berikutnya pada paginasi, hasil pencarian teratas. Prerender memberi kecepatan paling besar tetapi menghabiskan bandwidth, memori, dan CPU paling banyak, jadi ia harus dipantaskan, bukan ditaburkan di mana-mana.

Document rules dan pencocokan href

Menuliskan daftar URL secara manual tidak skalabel untuk situs yang kaya konten. Document rules menyelesaikannya: alih-alih urls, Anda memberikan klausa where yang mencocokkan tautan yang sudah ada di halaman. href_matches menerima URL Pattern, dan selector_matches menerima selektor CSS, lalu Anda menggabungkannya dengan and dan not. Aturan di bawah ini men-prerender setiap tautan same-origin kecuali rute logout dan apa pun yang ditandai sebuah kelas sebagai tidak aman.

<script type="speculationrules">
{
  "prerender": [
    {
      "where": {
        "and": [
          { "href_matches": "/*" },
          { "not": { "href_matches": "/logout" } },
          { "not": { "selector_matches": ".no-prerender" } }
        ]
      },
      "eagerness": "moderate"
    }
  ]
}
</script>

Eagerness: dari conservative ke immediate

Field eagerness menentukan kapan browser bertindak atas sebuah aturan. Ada empat nilai, dan default-nya berbeda menurut jenis aturan — list rule default ke immediate, document rule default ke conservative:

  • immediate — berspekulasi segera setelah aturan di-parse, hanya tunduk pada batas sumber daya browser. Ini adalah default untuk list rule di mana Anda sudah berkomitmen pada URL tertentu.
  • eager — bertindak pada isyarat paling tipis sekalipun, seperti kursor bergerak menuju tautan atau hover sebentar. Cocok untuk mem-prefetch banyak tujuan yang mungkin sejak dini.
  • moderate — titik keseimbangan: memicu saat ada sinyal yang wajar, kira-kira hover atau fokus 200 milidetik. Pilihan yang masuk akal untuk prerender berbasis document rule.
  • conservative — menunggu hingga pengguna pada dasarnya berkomitmen, pada pointerdown atau mousedown. Ini adalah default untuk document rule dan opsi berbasis interaksi yang paling murah.

Chrome membatasi spekulasi untuk melindungi perangkat: pada eagerness immediate atau eager ia mengizinkan hingga 50 prefetch dan 10 prerender, tetapi hanya 2 masing-masing untuk level berbasis interaksi moderate dan conservative. Spekulasi berlebihan memboroskan bandwidth, memori, dan CPU pengguna — dan setiap prerender yang tak pernah diklik adalah pemborosan murni, jadi cocokkan eagerness dengan kemungkinan klik yang nyata.

Jika Anda membangun dengan Next.js, komponen Link sudah melakukan prefetch — tetapi itu mekanisme yang berbeda, bukan Speculation Rules API. Next.js mem-prefetch payload rute itu sendiri, data RSC dan JavaScript yang diperlukan untuk transisi sisi klien, saat sebuah Link masuk viewport di produksi. Speculation Rules adalah fitur browser yang bisa mem-prefetch atau merender penuh navigasi dokumen sungguhan. Keduanya saling melengkapi, bukan saling menggantikan:

AspekNext.js Link prefetchSpeculation Rules API
Siapa yang menjalankanFramework Next.js di aplikasi AndaBrowser Chromium itu sendiri
Apa yang dimuatPayload RSC rute dan JS untuk transisi klienDokumen penuh: HTML untuk prefetch, atau halaman terender untuk prerender
PemicuLink masuk viewport, hanya di produksiAturan eagerness — immediate, eager, moderate, atau conservative
Jenis navigasiTransisi SPA sisi klien di dalam aplikasiNavigasi browser sungguhan ke sebuah URL
Dukungan browserBrowser apa pun yang menjalankan aplikasi React AndaChromium saja — Chrome dan Edge, bukan Firefox atau Safari

Jebakan yang saya waspadai

Spekulasi itu ampuh, tetapi beberapa mode kegagalan menggigit di produksi jika Anda tidak hati-hati:

  • Prerender sia-sia. Prerender yang tak pernah diaktifkan sudah menghabiskan biaya halaman penuh. Document rule agresif atas selektor yang terlalu luas bisa men-prerender puluhan halaman yang tak pernah dibuka pengguna — pilih eagerness conservative atau moderate dan pola href_matches yang sempit.
  • Penghitungan ganda analitik. Karena halaman yang diprerender menjalankan JavaScript-nya sebelum terlihat, analitik yang naif memicu pageview saat prerender dan sekali lagi saat aktivasi. Lindungi inisialisasi di balik document.prerendering dan event prerenderingchange agar sebuah view dihitung hanya ketika pengguna benar-benar melihat halaman.
  • Efek samping tak aman saat load. Setiap URL yang mengubah state pada GET — sign-out, add-to-cart, token sekali pakai, penghitung penggunaan, impresi iklan — harus dikecualikan dengan klausa not href_matches, atau prerender akan memicunya sebelum pengguna sempat mengklik.

Penjaga analitiknya kecil. Google Analytics dan Google Publisher Tag sudah memperhitungkan prerendering, tetapi untuk apa pun yang buatan sendiri Anda menunda inisialisasi hingga halaman benar-benar ditampilkan:

if (document.prerendering) {
  document.addEventListener(
    "prerenderingchange",
    initAnalytics,
    { once: true }
  );
} else {
  initAnalytics();
}

Dukungan browser adalah catatan jujurnya: Speculation Rules API hanya untuk Chromium. Chrome merilis prerendering via speculation rules di versi 109 dan field eagerness di versi 121, dan Edge mengikuti rilis tersebut. Firefox dan Safari tidak mendukungnya. Itu tidak masalah — ini adalah progressive enhancement, jadi browser yang tak mendukung cukup bernavigasi seperti biasa sementara pengguna Chromium mendapat pengalaman instan. Mulai dengan satu document rule conservative pada satu tautan berminat tinggi, pantau activation rate Anda, lalu perluas dari sana.

FAQ

Pertanyaan Umum

Jawaban singkat untuk pertanyaan yang paling sering diajukan pembaca tentang topik ini.

Apa itu Speculation Rules API?

Ini adalah API browser yang memungkinkan Anda mendeklarasikan, dalam sebuah script JSON bertipe speculationrules, URL mana yang harus di-prefetch atau di-prerender browser sebelum pengguna mengeklik, sehingga navigasi berikutnya terasa instan. Ia menggantikan resource hint prerender lama dengan sintaks fleksibel berbasis daftar URL eksplisit atau document rule yang mencocokkan tautan di halaman.

Apa beda prefetch dan prerender?

Prefetch mengunduh respons dokumen berikutnya sehingga navigasi melewati pengambilan jaringan, sementara prerender melangkah lebih jauh dan merender halaman sepenuhnya di latar belakang sehingga muncul seketika saat diklik. Prerender lebih cepat bagi pengguna tetapi memakan lebih banyak CPU dan memori serta bisa memicu efek samping halaman, jadi pakai lebih hati-hati daripada prefetch.

Apa yang dikendalikan pengaturan eagerness?

Eagerness (conservative, moderate, eager, atau immediate) memberi tahu browser seberapa agresif menindaklanjuti sebuah rule. Conservative menunggu sampai pointer atau sentuhan turun, moderate bertindak saat hover, dan eager atau immediate bertindak lebih awal. Ini memungkinkan Anda menyeimbangkan navigasi instan dengan prefetch, prerender, dan bandwidth yang terbuang.

Browser mana yang mendukung Speculation Rules API?

Didukung di browser berbasis Chromium seperti Chrome dan Edge. Sampai 2026 Safari dan Firefox belum mendukungnya, jadi perlakukan sebagai progressive enhancement: browser yang tidak memahami script speculationrules cukup mengabaikannya dan situs Anda tetap berjalan normal.

Apa bedanya dengan prefetch Link Next.js?

Prefetch Link Next.js mengambil data rute dan potongan JavaScript untuk tautan di viewport, di dalam framework. Speculation Rules API adalah mekanisme native browser yang bisa mem-prerender seluruh dokumen berikutnya, bukan sekadar mengambil datanya. Keduanya bisa saling melengkapi, tetapi Speculation Rules bekerja untuk navigasi apa pun dan bisa prerender penuh, yang tidak dilakukan prefetch Link.