Menampilkan data agar mudah dipahami: memilih jenis chart yang tepat, menggunakan Recharts dan D3, membangun dashboard interaktif penjualan TokoKita, dan teknik performa rendering data dalam jumlah besar

Data tanpa visualisasi hanyalah tabel. Episode 23 membahas data visualization — mengubah data menjadi chart dan dashboard yang bisa dipahami manusia dalam hitungan detik. Pemilik TokoKita butuh menjawab pertanyaan: "produk mana yang laris minggu ini?" Satu chart menjawab lebih cepat daripada seribu baris tabel.
Mengapa topik ini bagian dari frontend? Karena visualisasi yang baik adalah perpaduan desain (episode 4, 10) dan data. Kalian akan memilih chart yang sesuai maknanya, membangun dashboard interaktif, dan — bagian yang sering dilupakan — memastikan data ratusan ribu baris tetap mulus dirender.
Chart bukan dekorasi — ia jawaban untuk pertanyaan data. Pilih berdasarkan makna:
| Makna | Chart yang Tepat |
|---|---|
| Perbandingan antar kategori | Bar chart |
| Proporsi terhadap total | Pie/donut (maks. ~6 irisan) |
| Perubahan seiring waktu | Line chart |
| Hubungan dua variabel | Scatter plot |
| Distribusi nilai | Histogram |
const sales = [
{ week: "W1", kopi: 120, teh: 90, susu: 60 },
{ week: "W2", kopi: 140, teh: 85, susu: 75 },
{ week: "W3", kopi: 135, teh: 110, susu: 70 },
{ week: "W4", kopi: 160, teh: 120, susu: 88 },
];| Recharts | D3 | |
|---|---|---|
| Paradigma | Deklaratif (komponen React) | Imperatif (pemrograman data-DOM) |
| Kemudahan | Tinggi, cocok dashboard umum | Curam, fleksibilitas maksimal |
| Ukuran | Komponen modular | Modul per kebutuhan |
| Kontrol | Cukup untuk kebanyakan kasus | Total — buat apa pun |
| Pilihan untuk | 90% kebutuhan dashboard | Visualisasi kustom/skala besar |
Recharts adalah titik mulai yang tepat: komponen <LineChart>, <BarChart>, <ResponsiveContainer> langsung dipakai. D3 untuk kasus khusus: grafik jaringan, peta, atau visualisasi yang tidak tersedia di library.
Tip
Mulai dari Recharts, dan pindah ke D3 hanya saat dibutuhkan. Kebanyakan dashboard tidak butuh D3 — dan memakai D3 untuk semua hal membuat waktu development membengkak tanpa nilai tambah.
Dashboard penjualan sederhana dengan Recharts:
import {
ResponsiveContainer,
LineChart,
Line,
XAxis,
YAxis,
Tooltip,
Legend,
} from "recharts";
export function SalesChart({ data }: { data: typeof sales }) {
return (
<ResponsiveContainer width="100%" height={300}>
<LineChart data={data}>
<XAxis dataKey="week" />
<YAxis />
<Tooltip />
<Legend />
<Line type="monotone" dataKey="kopi" stroke="#b45309" />
<Line type="monotone" dataKey="teh" stroke="#16a34a" />
<Line type="monotone" dataKey="susu" stroke="#2563eb" />
</LineChart>
</ResponsiveContainer>
);
}ResponsiveContainer membuat chart menyesuaikan lebar kontainer — penting untuk dashboard yang responsif (episode 4).
Saat data membesar (ribuan poin per chart), aturan-aturannya:
React.memo dan pastikan data tidak direkonstruksi setiap render (ingat episode 8 & React Compiler).next/dynamic (episode 12): jangan bawa library chart ke bundle halaman katalog.import dynamic from "next/dynamic";
const SalesChart = dynamic(() => import("./SalesChart"), {
ssr: false,
loading: () => <ChartSkeleton />,
});| Kesalahan | Dampak | Perbaikan |
|---|---|---|
| Pie chart terlalu banyak irisan | Tidak terbaca | Bar chart / gabungkan "lainnya" |
| Chart tanpa label sumbu | Menyesatkan | Label + unit yang jelas |
| Render 100k titik penuh | Jank parah | Sampling + lazy |
| Chart tanpa fallback a11y | Tidak accessible | Data table alternatif |
| Bundle chart di semua halaman | LCP memburuk | next/dynamic |
Inti yang harus dibawa pulang:
Di episode 24 selanjutnya kita memasuki era baru: AI-native frontend — AI-generated UI, streaming responses, agentic UX, dan UI untuk aplikasi LLM, yang makin menjadi pembeda kompetitif di 2026. Sampai jumpa di episode 24!