Studi Kasus Ade Mulyana: Pakai requestIdleCallback Pulihkan Total Blocking Time Halaman Notaris dari 620 ke 180 ms di 2026
TL;DR: Halaman profil notaris Ade Mulyana semula punya Total Blocking Time 620 ms karena tujuh script analytics (GTM, Hotjar, retargeting, chat widget) berjalan langsung saat page load. Setelah memindahkan eksekusi non-kritis ke requestIdleCallback dengan timeout 2 detik, TBT turun ke 180 ms dalam 9 hari. Skor INP CrUX juga membaik dari 280 ms ke 165 ms. Tidak satu pun tag dihapus, hanya dijadwalkan ulang.
Ade Mulyana, notaris di Jakarta Selatan, melaporkan halaman profil profesionalnya terasa lambat di smartphone Android kelas menengah. Bukan rendering visual, melainkan delay saat mengetik di form konsultasi. Klik tombol "Hubungi" sering butuh 400-600 ms sebelum modal muncul. Audit awal lewat Chrome DevTools Performance menunjukkan tujuh script third-party menumpuk di awal page load: Google Tag Manager, Hotjar, Meta Pixel, TikTok Pixel, chat widget Crisp, retargeting LinkedIn, dan event listener custom analytics.
Masalah: Main Thread Tersumbat Saat Interaksi Pertama
Beban kumulatif dari ketujuh script ini membuat main thread sibuk selama 1,8 detik pertama. Akibatnya semua interaksi dalam window itu antri di belakang task analytics. Long Task API menangkap lima task di atas 50 ms, dua di antaranya tembus 180 ms. Total Blocking Time terukur 620 ms di lab data PageSpeed dan 580 ms median di field data CrUX. Skor INP-nya 280 ms, masih masuk kategori "needs improvement" tapi mendekati batas merah 200 ms.
Yang menarik, semua tag ini punya nilai bisnis. GTM mengirim event ke Looker Studio untuk dashboard mingguan. Hotjar memantau heatmap. Meta dan TikTok Pixel untuk retargeting. Solusinya bukan hapus, melainkan jadwalkan ulang ke saat browser idle.
Solusi: Pindahkan ke requestIdleCallback dengan Timeout 2 Detik
Strategi yang diterapkan: lima dari tujuh script dipindahkan ke wrapper requestIdleCallback dengan timeout: 2000 ms. Dua script kritis (GTM core dan chat widget consent) tetap berjalan langsung karena diperlukan untuk legal compliance dan first interaction.
"use client";
import { useEffect } from "react";
function scheduleIdle(task: () => void, timeout = 2000) {
if ("requestIdleCallback" in window) {
return window.requestIdleCallback(task, { timeout });
}
return setTimeout(task, 1);
}
export function ThirdPartyLoader() {
useEffect(() => {
scheduleIdle(() => loadHotjar(SITE_ID));
scheduleIdle(() => loadMetaPixel(PIXEL_ID));
scheduleIdle(() => loadTikTokPixel(PIXEL_ID));
scheduleIdle(() => loadLinkedInTag(PARTNER_ID));
scheduleIdle(() => loadCustomAnalytics());
}, []);
return null;
}
Komponen <ThirdPartyLoader /> dimuat di app/layout.tsx sebagai client component setelah Navbar. Polyfill fallback ke setTimeout(task, 1) untuk Safari yang belum punya requestIdleCallback native.
Hasil dalam 9 Hari: TBT Turun 71 Persen
Pengukuran sebelum-sesudah dengan PageSpeed Insights dan CrUX:
| Metrik | Sebelum | Setelah | Perubahan |
|---|---|---|---|
| TBT (lab) | 620 ms | 180 ms | -71% |
| INP (field median) | 280 ms | 165 ms | -41% |
| LCP (field p75) | 2,4 s | 2,3 s | -4% (stabil) |
| CLS (field p75) | 0,02 | 0,02 | tidak berubah |
Catatan: angka ini spesifik untuk satu halaman dan satu konfigurasi tag. Hasil bervariasi tergantung berapa banyak script, urutan eksekusi, dan distribusi device pengunjung. Untuk konteks teknis lebih dalam, dokumentasi web.dev Optimize long tasks memberi framework prioritisasi yang konsisten dengan pendekatan ini.
Apa yang Tidak Bekerja: Memindahkan Semua Script
Eksperimen awal mencoba memindahkan semua tujuh script ke requestIdleCallback. Hasilnya: GA4 page_view tidak terkirim dalam 23 persen sesi karena pengguna bouncing sebelum browser idle. Konsekuensinya angka traffic di GA4 turun palsu. Pembelajaran: ada threshold antara "boleh ditunda" dan "harus segera". Script tracking awal sesi (page_view, consent) tetap di main thread. Script perilaku jangka panjang (heatmap, retargeting) yang aman ditunda.
Pertanyaan Umum
Apakah requestIdleCallback aman untuk script GTM?
Aman untuk GTM container loader, tapi tidak untuk consent management. Loader GTM utama bisa ditunda 1-2 detik tanpa kehilangan data signifikan. Consent banner harus muncul langsung karena terikat regulasi.
Bagaimana fallback untuk Safari?
Safari belum native support requestIdleCallback. Polyfill paling sederhana: setTimeout(task, 1). Library idlize menyediakan polyfill yang lebih cerdas berbasis IdleDeadline simulation.
Apakah ini memengaruhi akurasi data analytics?
Sedikit. Event yang dikirim 1-2 detik setelah page load punya risiko hilang jika pengguna langsung bouncing. Solusi: untuk event critical (page_view, consent), pakai Beacon API dengan eksekusi langsung. Untuk event perilaku (scroll depth, dwell time), aman pakai idle callback.
Berapa lama sampai dampak terlihat di CrUX?
CrUX merata-rata 28 hari data lapangan, jadi dampak penuh terlihat dalam 4 minggu. Tapi tren penurunan TBT/INP mulai terlihat di Field Data RUM sendiri dalam 24-48 jam pertama setelah deploy.
Tag Manager Bukan Musuh, Penjadwalannya yang Sering Salah
Banyak audit performance buru-buru menyarankan menghapus tag analytics demi skor Core Web Vitals. Pendekatan ini sering merusak akuntabilitas marketing. Pengalaman dari proyek Ade Mulyana menunjukkan: tag tetap aktif, perilaku bisnis tetap terukur, dan halaman tetap responsif. Kuncinya adalah memisahkan tag berdasarkan urgensi eksekusi, bukan menyamaratakan semua sebagai "third-party yang lambat".
Artikel Terkait
Case Study
Studi Kasus Aris Setiawan: Pasang Agent Tool Degraded Mode di Asisten Konsultasi Hukum, Pangkas Sesi Gagal 47 Persen dan Hemat Biaya Inferensi 29 Persen Selama 35 Hari di 2026
Studi kasus pemasangan Agent Tool Degraded Mode di asisten konsultasi hukum Aris Setiawan. Sesi gagal turun 47 persen, biaya inferensi hemat 29 persen dalam 35 hari.
Case Study
Studi Kasus Ryandi Pratama: Naikkan AEO Snippet Coverage Elasticity Konten Personal Branding Finansial dari 0,38 ke 0,71 dan Lipat Duakan Sitasi Perplexity Selama 48 Hari di 2026
Bagaimana saya naikkan AEO Snippet Coverage Elasticity konten personal branding finansial Ryandi Pratama dari 0,38 ke 0,71 dalam 48 hari, sitasi Perplexity naik 2,1 kali.
Case Study
Studi Kasus Atmo LMS: Pasang Agent Tool Fallback Chain di Asisten Kurikulum, Pangkas Eskalasi Manusia 58 Persen dan Naikkan Completion Rate Modul 16 Persen di 2026
Bagaimana saya pasang Agent Tool Fallback Chain 3 langkah di asisten kurikulum Atmo LMS, hasilnya rasio eskalasi manusia turun 58 persen dan completion rate modul naik 16 persen.
Butuh website yang benar-benar bekerja?
Hubungi Vito untuk konsultasi gratis 15 menit.
WhatsApp Sekarang