Optimasi Kinerja JavaScript: Tips Performance dan Memory Management

By | 19 October 2025

Dalam dunia pengembangan web modern, performa bukan lagi sekadar bonus melainkan kebutuhan utama. Website yang lambat bisa menyebabkan pengguna meninggalkan halaman bahkan sebelum mereka melihat isinya. Salah satu penyebab utama kinerja lambat adalah kode JavaScript yang tidak efisien, berlebihan, atau tidak dikelola dengan baik.

Itulah mengapa penting bagi setiap developer memahami Optimasi Kinerja JavaScript. Tidak hanya soal mempercepat loading halaman, tetapi juga bagaimana mengelola penggunaan memori, mengurangi blocking script, dan memastikan kode berjalan efisien di berbagai perangkat. Artikel ini akan membahas berbagai teknik praktis untuk meningkatkan performa JavaScript di dunia nyata, lengkap dengan contoh penerapannya.

Minimalkan Manipulasi DOM Langsung

DOM (Document Object Model) adalah struktur yang merepresentasikan halaman web. Setiap kali kamu memodifikasi DOM, browser harus melakukan proses repaint dan reflow yang memakan waktu.

Best Practice
Gunakan fragment atau batch update:

const list = document.getElementById('items');
const fragment = document.createDocumentFragment();

for (let i = 0; i < 1000; i++) {
  const li = document.createElement('li');
  li.textContent = `Item ${i + 1}`;
  fragment.appendChild(li);
}

list.appendChild(fragment);

Anti-Pattern

for (let i = 0; i < 1000; i++) {
  const li = document.createElement('li');
  li.textContent = `Item ${i + 1}`;
  document.getElementById('items').appendChild(li);
}

Dengan cara ini, DOM hanya diperbarui sekali, bukan 1000 kali.

Gunakan Debounce dan Throttle pada Event Listener

Event seperti scroll dan resize bisa memicu ratusan event per detik. Gunakan teknik debounce atau throttle agar fungsi tidak dijalankan terlalu sering.

Contoh Debounce

function debounce(func, delay) {
  let timer;
  return function(...args) {
    clearTimeout(timer);
    timer = setTimeout(() => func.apply(this, args), delay);
  };
}

window.addEventListener('resize', debounce(() => {
  console.log('Resized!');
}, 300));

Contoh Throttle

function throttle(func, limit) {
  let inThrottle;
  return function(...args) {
    if (!inThrottle) {
      func.apply(this, args);
      inThrottle = true;
      setTimeout(() => inThrottle = false, limit);
    }
  };
}

window.addEventListener('scroll', throttle(() => {
  console.log('Scrolled!');
}, 500));

Gunakan Lazy Loading untuk Gambar dan Script

Teknik lazy loading memastikan elemen seperti gambar dan script hanya dimuat ketika dibutuhkan, bukan saat halaman pertama kali terbuka.

Lazy Loading Gambar

<img src="placeholder.jpg" data-src="gambar-asli.jpg" class="lazy" alt="Gambar">
const images = document.querySelectorAll('img.lazy');
const observer = new IntersectionObserver(entries => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.dataset.src;
      observer.unobserve(img);
    }
  });
});
images.forEach(img => observer.observe(img));

Lazy Loading Script

<script src="script.js" defer></script>

Tag defer menunda eksekusi script sampai seluruh HTML selesai dimuat.

Gunakan Web Storage dan Cache API

Untuk mengurangi permintaan ke server, simpan data statis di LocalStorage atau SessionStorage.

Contoh

if (!localStorage.getItem('userData')) {
  fetch('https://api.example.com/user')
    .then(res => res.json())
    .then(data => localStorage.setItem('userData', JSON.stringify(data)));
} else {
  console.log(JSON.parse(localStorage.getItem('userData')));
}

Kamu juga dapat menggunakan Cache API untuk menyimpan file statis seperti CSS, JS, atau gambar di browser agar halaman lebih cepat diakses kembali.

Kurangi Ukuran dan Jumlah File JavaScript

Gunakan bundler seperti Webpack, Rollup, atau Parcel untuk menggabungkan dan meminimalkan file JavaScript.
Selain itu, gunakan code splitting agar hanya file yang dibutuhkan pada halaman tertentu yang dimuat.

Contoh Dynamic Import

document.getElementById('loadChart').addEventListener('click', async () => {
  const { initChart } = await import('./modules/chart.js');
  initChart();
});

Hapus Listener dan Interval yang Tidak Digunakan

Event listener dan interval yang tidak dihapus bisa menyebabkan memory leak.
Selalu bersihkan setelah tidak dibutuhkan.

Best Practice

function init() {
  const btn = document.getElementById('start');
  const handleClick = () => console.log('Clicked!');
  btn.addEventListener('click', handleClick);

  // Bersihkan listener
  setTimeout(() => {
    btn.removeEventListener('click', handleClick);
    console.log('Listener dihapus!');
  }, 5000);
}
init();

Gunakan Web Worker untuk Tugas Berat

Jika kamu menjalankan proses berat (seperti sorting data besar atau komputasi kompleks), gunakan Web Worker agar tidak mengganggu thread utama (UI).

Contoh
worker.js

onmessage = function(e) {
  const result = e.data.numbers.sort((a, b) => a - b);
  postMessage(result);
};

main.js

const worker = new Worker('worker.js');
worker.postMessage({ numbers: [5, 2, 9, 1] });
worker.onmessage = e => console.log('Hasil:', e.data);

Dengan Web Worker, proses berat dijalankan di thread terpisah.

Optimalkan Penggunaan Memori

Beberapa hal penting untuk memory management:

  • Gunakan variabel lokal, bukan global.

  • Hapus referensi ke objek yang sudah tidak digunakan.

  • Hindari menampung data besar di array tanpa dibersihkan.

  • Gunakan WeakMap dan WeakSet untuk cache agar garbage collector bisa membersihkannya otomatis.

Contoh

let cache = new WeakMap();
function getUserData(user) {
  if (!cache.has(user)) {
    const data = { name: 'Arvian', id: Date.now() };
    cache.set(user, data);
  }
  return cache.get(user);
}

Gunakan Performance API untuk Analisis

Gunakan Performance API untuk mengukur waktu eksekusi dan mendeteksi bagian kode yang lambat.

Contoh

performance.mark('start');
// proses berat
for (let i = 0; i < 1e6; i++) {}
performance.mark('end');
performance.measure('loopTime', 'start', 'end');
console.log(performance.getEntriesByName('loopTime'));

Kesimpulan

Melakukan Optimasi Kinerja JavaScript bukan hanya soal mempercepat aplikasi, tetapi juga tentang membuat pengalaman pengguna lebih mulus dan efisien. Dengan menerapkan teknik seperti debounce, lazy loading, web worker, dan cache management, kamu bisa menghemat sumber daya sekaligus memperpanjang umur aplikasi.

Ingat, performa bukan hasil dari satu trik besar, melainkan akumulasi dari banyak perbaikan kecil yang konsisten.