Xây dựng REST API ‘siêu tốc’ với ElysiaJS và Bun: Type Safety từ A đến Z

Development tutorial - IT technology blog
Development tutorial - IT technology blog

Tại sao Bun và ElysiaJS lại gây sốt cộng đồng Dev?

Mệt mỏi vì cấu hình tsconfig.json hay cài package chậm chạp trên Node.js? Combo Bun + ElysiaJS chính là giải pháp thay thế cực kỳ đáng gờm. Bạn sẽ không còn phải đợi dài cổ mỗi khi npm install nữa.

Mình bắt đầu đưa Bun vào các microservices thực tế khoảng 6 tháng trước. Ấn tượng đầu tiên gói gọn trong một từ: Nhanh. Bun không đơn thuần là runtime; nó tích hợp sẵn cả package manager, test runner và bundler. Trong khi đó, ElysiaJS được sinh ra để tận dụng tối đa sức mạnh này với triết lý: Tốc độ tối đa và Type Safety tuyệt đối.

Sau khi refactor một hệ thống API từ Express sang Elysia, mình nhận thấy lượng code boilerplate giảm gần 40%. Đặc biệt, lỗi “undefined is not a function” phía Frontend gần như biến mất nhờ cơ chế đồng bộ kiểu dữ liệu thông minh.

Sức mạnh cốt lõi từ Bun Runtime

Thay vì dùng V8 như Node.js, Bun chọn JavaScriptCore (JSC) – engine đứng sau trình duyệt Safari. JSC có lợi thế khởi động nhanh và quản lý bộ nhớ cực kỳ chặt chẽ.

Một điểm cộng lớn là Bun hỗ trợ chạy trực tiếp file .ts. Bạn chỉ cần gõ bun run index.ts là xong. Không còn cảnh loay hoay cấu hình Babel hay esbuild phức tạp như trước nữa.

Thực hành: Xây dựng REST API trong 5 phút

Đầu tiên, hãy cài đặt Bun qua terminal:

curl -fsSL https://bun.sh/install | bash

Tiếp theo, khởi tạo dự án ElysiaJS bằng một câu lệnh duy nhất:

bun create elysia my-api
cd my-api

Cấu trúc Server tối giản

Mở src/index.ts, bạn sẽ thấy phong cách viết code của Elysia rất hiện đại, tương đồng với Fastify nhưng gọn hơn:

import { Elysia, t } from 'elysia'

const app = new Elysia()
  .get('/', () => 'Chào anh em từ itfromzero.com!')
  .post('/user', ({ body }) => body, {
    body: t.Object({
      name: t.String(),
      age: t.Number()
    })
  })
  .listen(3000)

console.log(`Server chạy tại: ${app.server?.hostname}:${app.server?.port}`);

Điểm “ăn tiền” ở đây là object t (TypeBox). Nó đóng vai trò như một người gác cổng. Nếu client gửi thiếu trường name, Elysia tự động chặn lại và trả lỗi 400 ngay lập tức. Bạn không cần viết thêm bất kỳ dòng logic validation thủ công nào.

Tự động hóa tài liệu với Swagger

Viết API mà thiếu tài liệu là ác mộng với team Frontend. Với Elysia, bạn có ngay Swagger UI chỉ sau vài giây thiết lập.

Cài đặt plugin:

bun add @elysiajs/swagger

Tích hợp vào code:

import { Elysia } from 'elysia'
import { swagger } from '@elysiajs/swagger'

new Elysia()
  .use(swagger())
  .get('/posts', () => [{ id: 1, title: 'Học Bun cùng IT From Zero' }])
  .listen(3000)

Truy cập localhost:3000/swagger, bạn sẽ thấy một giao diện test API chuyên nghiệp, giúp tiết kiệm hàng giờ viết tài liệu tay.

Tuyệt chiêu Eden Treaty: Kết nối Front-Back không kẽ hở

Đây là tính năng mình tâm đắc nhất. Thông thường, khi Backend thay đổi kiểu dữ liệu, Frontend rất dễ bị “vỡ” nếu không cập nhật kịp.

Eden Treaty giải quyết triệt để vấn đề này bằng cách cho phép Frontend “thừa hưởng” toàn bộ Type từ Backend. Bạn không cần copy-paste interface thủ công nữa.

Tại dự án Backend, chỉ cần export type của app:

export type App = typeof app;

Tại Frontend (React/Next.js):

import { edenTreaty } from '@elysiajs/eden'
import type { App } from '../backend/src/index'

const client = edenTreaty<App>('http://localhost:3000')

// Intellisense sẽ gợi ý chính xác endpoint và kiểu dữ liệu
const { data } = await client.hello.get() 

Trong một dự án thực tế với hơn 100 endpoints, việc refactor tên biến trở nên cực kỳ an toàn. Nếu bạn đổi tên field ở Backend, IDE sẽ báo lỗi đỏ ngay tại code Frontend. Đây chính là sức mạnh của End-to-End Type Safety.

Kinh nghiệm thực tế khi làm việc với Bun

  • Bun SQLite: Với các app nhỏ hoặc cần cache, hãy dùng SQLite tích hợp sẵn. Tốc độ truy vấn của nó nhanh hơn đáng kể so với các driver truyền thống.
  • Quản lý Context: Hãy ưu tiên dùng .state().derive() của Elysia để quản lý user session thay vì dùng biến toàn cục.
  • Tốc độ Test: bun test nhanh hơn Jest khoảng 10-20 lần. Hãy tận dụng nó để duy trì vòng lặp feedback ngắn, giúp code tự tin hơn.

Nhiều người lo ngại Bun chưa đủ ổn định. Tuy nhiên, từ phiên bản 1.x, Bun đã thực sự trưởng thành và sẵn sàng cho môi trường production. Đừng để bản thân dậm chân tại chỗ với những công cụ cũ kỹ và chậm chạp.

Trải nghiệm ElysiaJS và Bun không chỉ là chạy theo xu hướng. Đó là cách bạn tối ưu năng suất và loại bỏ những lỗi ngớ ngẩn trong lập trình. Hãy thử tạo một project nhỏ ngay hôm nay để cảm nhận độ mượt mà của combo này!

Share: