Mengurangi INP: Optimasi Penangan Event
Tunda handler berat, gunakan scheduler.yield(), dan hindari tugas panjang yang memblokir thread utama.
Mengurangi INP: Optimasi Penangan Event adalah pelajaran React Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar React Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus React Academy mencakup 4 pelajaran total.
Apa Itu INP?
Interaction to Next Paint (INP) mengukur latensi sejak interaksi pengguna (klik, ketukan, penekanan tombol) hingga browser merender respons. INP > 200ms terasa lambat.
Mengapa Peristiwa React Bisa Lambat
Penangan peristiwa React yang melakukan terlalu banyak pekerjaan secara sinkron akan memblokir utas utama. Browser tidak dapat merender respons hingga tugas JS selesai, sehingga INP menjadi tinggi.
Debounce pada Input Ketikan
Terapkan debounce pada operasi mahal (panggilan API pencarian, perhitungan berat) yang dipicu oleh pengetikan. Pembaruan status React pada setiap ketikan tidak masalah; pekerjaan mahalnya yang perlu diberi debounce.
import { useDeferredValue, useState } from 'react';
function SearchPage() {
const [query, setQuery] = useState('');
const deferredQuery = useDeferredValue(query); // defers re-render of slow parts
return (
<>
<input value={query} onChange={e => setQuery(e.target.value)} />
<SearchResults query={deferredQuery} /> {/* re-renders with lower priority */}
</>
);
}Pembaruan yang Tidak Mendesak dengan useTransition
Bungkus pembaruan status yang lambat dalam startTransition untuk menandainya sebagai pembaruan yang tidak mendesak. React menundanya agar input tetap responsif.
const [isPending, startTransition] = useTransition();
function handleFilter(value) {
setInputValue(value); // urgent — update input immediately
startTransition(() => {
setFilteredList(expensiveFilter(value)); // non-urgent — can be interrupted
});
}Memindahkan Pekerjaan Berat dari Utas Utama
Gunakan Web Workers untuk tugas yang membutuhkan banyak CPU (menguraikan kumpulan data besar, memproses gambar). Utas utama tetap responsif saat worker melakukan perhitungan.
const worker = new Worker(new URL('./heavy-worker.js', import.meta.url));
function processData(data) {
return new Promise(resolve => {
worker.postMessage(data);
worker.onmessage = e => resolve(e.data);
});
}
// In component:
const handleClick = async () => {
const result = await processData(largeDataset); // doesn't block main thread
setResult(result);
};Menghindari Tugas Panjang
Tugas panjang (>50ms) memblokir utas utama dan meningkatkan INP. Pecah tugas tersebut menggunakan setTimeout, scheduler.yield(), atau requestIdleCallback.
async function processInChunks(items) {
const CHUNK_SIZE = 100;
for (let i = 0; i < items.length; i += CHUNK_SIZE) {
const chunk = items.slice(i, i + CHUNK_SIZE);
processChunk(chunk);
await new Promise(r => setTimeout(r, 0)); // yield to browser between chunks
}
}scheduler.yield() (API Modern)
scheduler.yield() mengembalikan kendali ke loop peristiwa browser, sehingga interaksi pengguna yang tertunda dapat diproses sebelum kode Anda dilanjutkan.
async function longTask() {
for (const item of largeList) {
processItem(item);
if (/* every N items */) {
await scheduler.yield(); // let browser handle pending clicks/inputs
}
}
}Hindari Tata Letak Sinkron dalam Penangan
Membaca properti tata letak (offsetWidth, getBoundingClientRect()) memaksa penghitungan ulang tata letak secara sinkron. Kelompokkan pembacaan sebelum penulisan untuk menghindari perubahan tata letak berulang.
// Bad — forces layout recalculation on each iteration:
items.forEach(item => {
const height = item.offsetHeight; // READ — forces layout
item.style.height = height * 2 + 'px'; // WRITE — dirties layout
});
// Good — batch reads, then writes:
const heights = items.map(item => item.offsetHeight); // all reads
heights.forEach((h, i) => items[i].style.height = h * 2 + 'px'); // all writesActions React 19 untuk INP Asinkron
Actions React 19 menangani mutasi asinkron tanpa memblokir UI—pembaruan status tertunda berlangsung secara terpisah sehingga halaman tetap interaktif.
function LikeButton({ postId }) {
const [optimistic, setOptimistic] = useOptimistic(false);
async function handleLike() {
setOptimistic(true);
await likePost(postId); // async — doesn't block
}
return <button onClick={handleLike}>{optimistic ? 'Liked' : 'Like'}</button>;
}Jebakan Delegasi Peristiwa
React menggunakan delegasi peristiwa sintetis (memasang satu listener pada root). Hindari memasang ratusan listener DOM individual dalam useEffect—gunakan peristiwa sintetis React pada elemen JSX.
Mengukur INP di DevTools
Gunakan panel Performance di Chrome DevTools untuk merekam interaksi dan memeriksa tugas panjang. Cari entri 'Interaksi' di linimasa, lalu perluas entri tersebut untuk menemukan evaluasi skrip yang memblokir.
Pemeriksaan Cepat
Hook React mana yang menandai pembaruan status sebagai tidak mendesak agar dapat disela oleh interaksi pengguna?
Ringkasan
Kurangi INP dengan memberi debounce pada pekerjaan mahal, menggunakan startTransition untuk pembaruan yang tidak mendesak, memindahkan pekerjaan CPU ke Web Workers, dan memecah tugas panjang dengan scheduler.yield(). Kelompokkan pembacaan DOM sebelum penulisan untuk menghindari perubahan tata letak berulang.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengurangi INP: Optimasi Penangan Event” gratis?
Ya — teks lengkap “Mengurangi INP: Optimasi Penangan Event” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus React Academy, upgrade ke CoddyKit PRO. Kursus React Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mengurangi INP: Optimasi Penangan Event”?
Tunda handler berat, gunakan scheduler.yield(), dan hindari tugas panjang yang memblokir thread utama. Kamu berlatih React Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai React Academy?
Tidak diperlukan pengalaman sebelumnya. React Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Mengurangi INP: Optimasi Penangan Event” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran React Academy ini?
Ya. Setiap pelajaran React Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mengukur Core Web Vitals dalam Aplikasi React
- Analisis Bundel & Strategi Pemisahan Kode
- Optimasi Gambar & Font dalam React
- Mengurangi INP: Optimasi Penangan Event