Panduan optimasi performa JavaScript untuk aplikasi web yang cepat
Optimasi performa adalah praktik membuat aplikasi JavaScript berjalan lebih cepat dan efisien dengan mengurangi waktu eksekusi, penggunaan memori, dan konsumsi sumber daya.
// Mengukur waktu eksekusi
console.time('loop');
for (let i = 0; i < 1000000; i++) {
// Operasi yang diukur
}
console.timeEnd('loop');
// Mengurangi operasi DOM
const fragment = document.createDocumentFragment();
for (let i = 0; i < 100; i++) {
const div = document.createElement('div');
fragment.appendChild(div);
}
document.body.appendChild(fragment);
đ Penjelasan Detail:
âĸ console.time()
- Mengukur waktu eksekusi kode
âĸ DocumentFragment
- Mengelompokkan operasi DOM untuk mengurangi reflow
âĸ debounce/throttle
- Mengoptimalkan event handlers yang sering dipanggil
âĸ Web Workers
- Menjalankan tugas berat di thread terpisah
âĸ Lazy loading
- Menunda pemuatan sumber daya yang tidak kritis
// Debounce untuk event scroll/resize
function debounce(func, delay) {
let timeoutId;
return function() {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => func.apply(this, arguments), delay);
};
}
window.addEventListener('resize', debounce(() => {
console.log('Resize handler');
}, 200));
// Web Worker untuk tugas berat
const worker = new Worker('worker.js');
worker.postMessage({ data: largeData });
worker.onmessage = (e) => {
console.log('Result from worker:', e.data);
};
Beberapa teknik penting: minimifikasi kode, code splitting, caching, menggunakan algoritma yang efisien, dan menghindari memory leaks.
// Perbandingan Loop Performance (ops/detik)
for // 1,000,000 (tercepat)
forEach // 800,000
for...of // 600,000
while // 950,000
map // 500,000 (terlambat)
// Perbandingan Query Selector
getElementById // Tercepat
querySelector // Cepat
getElementsByClassName // Cepat
querySelectorAll // Sedang
getElementsByTagName // Sedang
đ Penjelasan Detail:
âĸ Loop Performance - For loop tradisional umumnya paling cepat
âĸ DOM Queries - getElementById lebih cepat daripada querySelector
âĸ Event Delegation mengurangi jumlah event listeners
âĸ Memory Usage - Hindari menyimpan referensi yang tidak perlu
âĸ Garbage Collection - Variabel global bertahan lebih lama
// Virtual DOM dengan DocumentFragment
function updateUI(data) {
const fragment = document.createDocumentFragment();
data.forEach(item => {
const div = document.createElement('div');
div.textContent = item.name;
fragment.appendChild(div);
});
document.body.textContent = '';
document.body.appendChild(fragment);
}
// Memoization untuk optimasi fungsi
function memoize(fn) {
const cache = {};
return function(...args) {
const key = JSON.stringify(args);
if (cache[key]) return cache[key];
const result = fn.apply(this, args);
cache[key] = result;
return result;
};
}
const factorial = memoize(n => n <= 1 ? 1 : n * factorial(n - 1));
Virtual DOM, memoization, algoritma caching, web assembly, service workers untuk caching offline, dan teknik rendering progresif.
Ukur sebelum mengoptimasi, fokus pada bottleneck, gunakan tools profiling, optimalkan critical rendering path, dan hindari premature optimization.
// â
Good - Event delegation
document.addEventListener('click', (e) => {
if (e.target.matches('.btn')) {
handleClick(e.target);
}
});
// â Avoid - Banyak event listeners
document.querySelectorAll('.btn').forEach(btn => {
btn.addEventListener('click', handleClick);
});
// â
Better - RequestAnimationFrame untuk animasi
function animate() {
// Kode animasi
requestAnimationFrame(animate);
}
requestAnimationFrame(animate);
đ Penjelasan Detail:
âĸ Gunakan event delegation - Kurangi jumlah event listeners
âĸ Hindari forced synchronous layouts - Baca dan tulis DOM secara terpisah
âĸ Gunakan requestAnimationFrame untuk animasi yang halus
âĸ Minimalkan repaint/reflow - Batasi perubahan style yang mahal
âĸ Gunakan Web Workers untuk tugas komputasi berat
âĸ Lazy load resources - Tingkatkan waktu muat awal
âĸ Monitor memory usage - Hindari memory leaks
Chrome DevTools (Lighthouse, Performance tab), WebPageTest, Bundle Analyzer, Memory Profiler, dan berbagai library benchmarking.
đ Sumber Belajar Lanjutan:
âĸ Google Web Fundamentals - Panduan performa dari Google
âĸ MDN Performance - Dokumentasi resmi Mozilla
âĸ Web.dev - Artikel tentang optimasi modern
âĸ JavaScript Performance Patterns - Buku dan tutorial
âĸ Benchmark.js - Library untuk pengujian performa