Bun: Native APIs dan SQLite
Manfaatkan built-in APIs dan database tanpa dependency tambahan
Tujuan Pembelajaran
- Mengerti Bun.serve() untuk HTTP server
- Bisa menggunakan bun:sqlite
- Mengerti file I/O dan streams di Bun
Analogi
Bun APIs:
├── Bun.serve() → HTTP server
├── bun:sqlite → Database
├── Bun.file() → File I/O
├── Bun.write() → Write file
└── Bun.hash() → Hashing
Semua built-in, tanpa npm install
Bun menyediakan API modern yang siap pakai tanpa dependency
Penjelasan Konsep
Salah satu kekuatan Bun adalah built-in APIs yang biasanya membutuhkan library tambahan di Node.js.
Ini mengurangi jumlah dependency dan meningkatkan performa.
Bun.serve(): HTTP Server Built-in
Bun punya web server built-in yang sangat cepat dan simple.
Support HTTP/1.1 dan HTTP/2, WebSocket, TLS/HTTPS, dan static file serving.
Bun.serve({
port: 3000,
fetch(req) {
const url = new URL(req.url);
if (url.pathname === '/') {
return new Response('Hello World!');
}
if (url.pathname === '/api/users') {
return Response.json([{ id: 1,
Name: 'Budi' }]);
}
return new Response('Not Found', { status: 404 });
},
});
Notice: return new Response() — ini adalah API web standard (fetch API), bukan API khusus Bun.
Ini berarti kode kamu lebih portable dan familiar.
bun:sqlite: Database Built-in
Ini salah satu fitur paling menarik Bun.
SQLite adalah database file-based yang sangat cepat dan reliable.
Dengan bun:sqlite, kamu punya database tanpa install APAPUN.
SQLite cocok untuk:
- Prototyping dan development
- Aplikasi desktop/embedded
- Caching layer
- Aplikasi dengan read-heavy workload
- Single-node deployments
File I/O dengan Bun
Bun menyederhanakan file I/O:
- Bun.file(path) untuk membaca file
- Bun.write(path,
Data) untuk menulis file
- Support streaming dan lazy loading
WebSocket Built-in
Bun.serve() juga support WebSocket — tidak perlu library seperti ws atau socket.io:
Bun.serve({
port: 3000,
fetch(req, server) {
if (server.upgrade(req)) {
return; // WebSocket upgrade
}
return new Response('Regular HTTP');
},
websocket: {
open(ws) { ws.subscribe('chat'); },
message(ws, message) {
ws.publish('chat', message);
},
},
});
Notice: pub/sub built-in!
Tidak perlu Redis untuk use case sederhana.
Inti yang Perlu Dipahami
Bagian ini berfokus pada mengerti Bun.serve() untuk HTTP server., bisa menggunakan bun:sqlite., dan mengerti file I/O dan streams di Bun. Jangan terburu-buru menghafal istilahnya. Lebih penting untuk memahami peran setiap konsep dan kapan konsep itu muncul dalam pekerjaan web development.
Saat membaca Bun, gunakan tujuan belajar sebagai penanda arah. Kalau kamu sudah bisa menjelaskan tujuan itu dengan kata-katamu sendiri, berarti fondasinya mulai terbentuk.
Cara Membayangkannya
Bun menyediakan API modern yang siap pakai tanpa dependency. Analogi ini dipakai supaya konsep teknis tidak terasa melayang. Hubungkan setiap istilah dengan perannya: siapa yang meminta, siapa yang memproses, data apa yang berpindah, dan hasil apa yang diharapkan.
Kalau analoginya sudah terasa masuk akal, barulah lihat istilah teknisnya. Cara ini membuat materi lebih mudah dipahami daripada langsung menghafal definisi.
Saat Melihat Contoh Kode
Contoh kode pada chapter ini memakai bahasa typescript. Bacalah contoh kode sebagai ilustrasi alur, bukan sebagai bagian yang harus langsung dihafal. Baris 4-8: SQLite database setup dengan schema creation. Baris 23-24: Serve static file. Baris 26-27: Query database dan return JSON.
Perhatikan nama fungsi, urutan langkah, dan data yang berpindah. Biasanya tiga hal itu sudah cukup untuk memahami hubungan antara teori dan praktik.
Konteks dalam Perjalanan Belajar
Setiap konsep di platform ini dipilih karena dipakai di industri. Fokus pada pemahaman, bukan hafalan.
Kamu sudah di bagian lanjutan. Mulai pikirkan bagaimana konsep ini dipakai di dunia kerja — bukan hanya untuk belajar, tapi untuk membangun produk nyata.
Gunakan pertanyaan reflektif dan prompt AI di akhir chapter sebagai latihan aktif. Membaca saja tidak cukup — kamu perlu menjelaskan ulang dengan kata-katamu sendiri.
Contoh Kode
// HTTP Server + SQLite + File I/O
import { Database } from 'bun:sqlite';
// Setup database
const db = new Database('app.db');
db.exec(`
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE
)
`);
// Seed data
const insert = db.prepare('INSERT OR IGNORE INTO users (name, email) VALUES (?, ?)');
insert.run('Budi', 'budi@email.com');
insert.run('Ani', 'ani@email.com');
// Query
const users = db.query('SELECT * FROM users').all();
console.log('Users:', users);
// HTTP Server
Bun.serve({
port: 3000,
async fetch(req) {
const url = new URL(req.url);
// Static file serving
if (url.pathname === '/') {
return new Response(Bun.file('./public/index.html'));
}
// API endpoint
if (url.pathname === '/api/users') {
const allUsers = db.query('SELECT * FROM users').all();
return Response.json(allUsers);
}
if (url.pathname === '/api/users' && req.method === 'POST') {
const body = await req.json();
const result = db.prepare('INSERT INTO users (name, email) VALUES (?, ?)').run(body.name, body.email);
return Response.json({ id: result.lastInsertRowid }, { status: 201 });
}
return new Response('Not Found', { status: 404 });
},
});
console.log('Server running at http://localhost:3000');Penjelasan Kode
Prompt AI
Buat REST API CRUD lengkap dengan Bun.serve() dan bun:sqlite untuk resource 'products' (id, name, price, stock).
Pertanyaan Reflektif
SQLite di Bun ini sangat cepat. Coba benchmark insert 10.000 rows dan bandingkan dengan database lain yang pernah kamu pakai.