Tips & Tricks (Diperbarui: 23/7/2026)

Claude Code dan Node.js lambat: ukur bottleneck sebelum memperbaiki

Alur terukur untuk mempercepat Node.js dengan Claude Code, timer, kasus penggunaan, jebakan, dan verifikasi.

Claude Code dan Node.js lambat: ukur bottleneck sebelum memperbaiki

Endpoint laporan di Node.js terasa lambat, rilis sudah dekat, dan saran pertama di ruang kerja adalah “tambahkan indeks”. Saran itu bisa benar, tetapi tetap tebakan kalau belum ada angka yang menunjukkan bagian mana yang memakan waktu.

Panduan ini memakai Claude Code sebagai asisten coding, bukan peramal. Bottleneck adalah bagian paling lambat yang membatasi seluruh request. Profiling berarti mengukur waktu jalan program agar bottleneck terlihat. Alur yang aman adalah menambahkan timer kecil, menjalankan satu perintah yang bisa diulang dengan data sintetis, memperbaiki satu bagian paling lambat, lalu menjalankan perintah yang sama lagi.

Fokusnya adalah pekerjaan Node.js di sisi server: handler API, batch job, ekspor CSV, dan pemrosesan data. Jika masalahnya ada pada tampilan browser, baca panduan performa Core Web Vitals. Jika waktu habis di query SQL, lanjutkan ke panduan optimasi SQL.

Langkah pertama

Mulai dari artefak paling kecil yang mereproduksi rasa sakit: satu route, satu script, satu fixture, atau satu ekspor CSV. Jangan meminta Claude Code “buat proyek ini lebih cepat” sebelum ada perintah yang menunjukkan kelambatan. Perintah yang sempit mengurangi pembacaan file dan membuat bukti akhir mudah ditinjau.

Samakan istilahnya. Masalah N+1 berarti daftar diambil sekali, lalu data terkait diambil lagi untuk setiap item. await serial berarti pekerjaan async yang tidak saling bergantung dipaksa menunggu berurutan. Memoization berarti memakai ulang hasil untuk input yang sama, bukan menghitung lagi.

Prompt awal yang berguna memisahkan pengukuran dan izin:

claude -p "src/api/report.ts is slow. Do not rewrite it yet.
Add timing around database fetch, API fetch, transform, and response formatting.
Use synthetic fixture data only. Return the changed files, command to run, and the slowest measured section.
Do not change production settings, billing limits, credentials, or customer-data handling without human approval."

Kode ukur siap salin

Perubahan pertama sebaiknya membosankan: mencetak waktu, bukan mendesain ulang layanan. Node.js menyediakan performance.now() di dokumentasi resmi node:perf_hooks, jadi tidak perlu memasang paket tambahan.

Buat measured-report.mjs di branch percobaan atau folder sementara, lalu jalankan dengan Node. Datanya sintetis: tidak ada secret, token, URL produksi, atau baris pelanggan.

import { performance } from "node:perf_hooks";

const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

function createTimer() {
  const records = [];
  return {
    async measure(label, fn) {
      const start = performance.now();
      const value = await fn();
      records.push({ label, ms: Number((performance.now() - start).toFixed(1)) });
      return value;
    },
    report() {
      return records.sort((a, b) => b.ms - a.ms);
    },
  };
}

async function fetchUsers() {
  await wait(60);
  return Array.from({ length: 6 }, (_, index) => ({ id: index + 1 }));
}

async function fetchOrdersOneByOne(users) {
  const orders = [];
  for (const user of users) {
    await wait(45);
    orders.push({ userId: user.id, total: user.id * 10 });
  }
  return orders;
}

async function fetchOrdersInBatch(users) {
  await wait(55);
  return users.map((user) => ({ userId: user.id, total: user.id * 10 }));
}

function buildReport(users, orders) {
  const ordersByUser = new Map(orders.map((order) => [order.userId, order]));
  return users.map((user) => ({ ...user, orderTotal: ordersByUser.get(user.id)?.total ?? 0 }));
}

async function run(fetchOrders) {
  const timer = createTimer();
  const users = await timer.measure("users", fetchUsers);
  const orders = await timer.measure("orders", () => fetchOrders(users));
  await timer.measure("report", () => buildReport(users, orders));
  console.table(timer.report());
}

console.log("slow version");
await run(fetchOrdersOneByOne);

console.log("batch version");
await run(fetchOrdersInBatch);

Jalankan perintah ini:

node measured-report.mjs
node --prof measured-report.mjs
node --prof-process isolate-*.log > profile.txt

node --prof adalah profiler bawaan yang dijelaskan di referensi resmi CLI Node.js. Pakai saat kerja CPU masih belum jelas setelah timer sederhana; untuk banyak API dan batch job, tabel kecil sudah cukup untuk menentukan target pertama.

Tiga kasus penggunaan nyata

Kasus 1: respons API lambat

Masukan: handler API, test route, dan payload request sintetis. Claude Code boleh menambahkan timer pada fetch database, fetch eksternal, transformasi, dan serialisasi. Manusia harus menyetujui perubahan pada kredensial, autentikasi, batas trafik, atau penyimpanan data pelanggan.

Keluaran: tabel waktu pendek dan patch pada bagian paling lambat. Jika bagian paling lambat adalah query, masuk ke checklist SQL sebelum menambah indeks. Jika lambatnya di format JSON, perbaikan tetap di kode aplikasi.

Kasus 2: ekspor CSV batch

Masukan: fixture lokal berisi baris palsu dan perintah untuk membuat CSV. Claude Code boleh mengukur pemuatan baris, join, format, dan penulisan file. Manusia harus menyetujui perpindahan dari fixture ke ekspor produksi karena data pelanggan dan biaya komputasi bisa terlibat.

Keluaran: bukti apakah masalah berasal dari pembacaan N+1, panggilan serial, atau format yang diulang. Perbaikan biasanya batching, batas concurrency, atau memoization formatter, bukan menulis ulang seluruh job.

Kasus 3: review pull request sebelum rilis

Masukan: diff pull request, test performa yang sudah ada, dan anggaran respons yang diharapkan. Claude Code boleh memeriksa diff dan menyarankan timer tambahan. Keputusan rilis, rollback, dan klaim SLA ke pelanggan harus disetujui manusia.

Keluaran: catatan review yang menyebut risiko terukur, perintah yang dijalankan, dan area yang belum terukur. Itu lebih berguna daripada komentar “sepertinya lebih cepat”.

Pola perbaikan setelah mengukur

Gejala terukurPenyebab mungkinKoreksi pertama yang aman
Banyak query atau panggilan miripN+1Kumpulkan ID, eager load relasi, atau pakai endpoint bulk
Panggilan independen menjumlah waktuawait serialPakai Promise.all hanya untuk kerja yang independen
Transformasi yang sama berulangHitung ulangMemoize berdasarkan input atau pindahkan setup ke luar loop
Waktu naik tajam saat baris bertambahScan bersarangBuat Map sekali, atau cek query plan sebelum menambah indeks

Tabel ini bukan pengganti pengukuran. Fungsinya mengubah hasil timer menjadi patch terkecil. Jika perbaikan menyentuh keamanan, trafik produksi, billing, atau data pelanggan, berhenti dan minta persetujuan sebelum menjalankannya di luar fixture.

Jebakan dan koreksi

Jebakan: meminta Claude Code “optimalkan endpoint ini” tanpa perintah. Koreksi: wajibkan perintah reproduksi, fixture, dan tabel waktu sebelum rewrite apa pun.

Jebakan: memperlakukan angka sintetis sebagai benchmark produksi. Koreksi: beri label bahwa data lokal adalah sintetis dan gunakan hanya untuk menemukan bottleneck kemungkinan. Kesimpulan produksi membutuhkan observability yang disetujui dari sistem sendiri.

Jebakan: mengganti loop serial dengan Promise.all tanpa batas. Koreksi: pastikan pekerjaannya independen, lalu gunakan batas concurrency kalau menyentuh database, API berbayar, atau layanan dengan rate limit.

Jebakan: menambah indeks hanya karena kata “database” muncul di jalur lambat. Koreksi: lihat query plan dan tulis tradeoff biaya tulis serta storage.

Ruang kerja Claude Code dan persetujuan manusia

Biarkan Claude Code mengerjakan tugas yang dapat diulang: menambah timer sementara, membuat fixture sintetis, mencari query di dalam loop, mengusulkan batching, memperbarui test, dan merangkum bukti sebelum-sesudah. Semua itu mudah dibalik dan mudah ditinjau.

Simpan persetujuan manusia untuk keputusan produksi: autentikasi, catatan pelanggan, pengiriman data ke layanan luar, concurrency API berbayar, batas billing, deployment, dan klaim SLA. Agen bisa menyiapkan diff dan checklist; manusia menerima risikonya.

Kalimat handoff yang jelas: “Claude boleh mengubah pengukuran lokal dan test. Persetujuan manusia wajib sebelum memakai data produksi, mengubah secret, mengubah kontrol billing, atau deploy.”

CTA utama

Tim yang ingin menjadikan alur ini kebiasaan bersama dapat memakai halaman training dan konsultasi Claude Code. Hasil yang dicari bukan janji kecepatan ajaib, melainkan review berulang dengan perintah, fixture, bottleneck terukur, patch, dan risiko tersisa.

Verifikasi praktik

Untuk pembaruan ini saya memeriksa bahwa link internal memakai /id/, link eksternal menuju dokumentasi resmi Node.js, blok kode berisi JavaScript dan perintah yang dapat dijalankan, contoh memakai data sintetis saja, dan CTA menuju halaman training bahasa Indonesia.

Saya tidak menjalankan benchmark produksi, tidak melihat insiden pelanggan nyata, dan tidak mengklaim percepatan dari layanan hidup. Pemeriksaan praktiknya adalah isi artikel, bentuk sintaks blok kode, lokalitas link, serta pemisahan antara pekerjaan Claude Code dan keputusan yang harus disetujui manusia.

#claude-code #performance #optimization #prompt-engineering #productivity
Gratis

PDF gratis: cheatsheet Claude Code

Masukkan email dan unduh satu halaman berisi command, kebiasaan review, dan workflow aman.

Kami menjaga datamu dan tidak mengirim spam.

Masa

Tentang penulis

Masa

Engineer yang berfokus pada workflow Claude Code praktis dan adopsi tim.