Memahami arsitektur inti ElysiaJS: core routing engine berbasis TypeBox, plugin system yang fleksibel, dan Eden Treaty untuk type-safe end-to-end tanpa code generation, serta perbandingan mendalam dengan framework lain seperti Express, Fastify, dan NestJS.

Setelah di episode 1 kita memahami sejarah dan mengapa ElysiaJS lahir, pada episode ini kita akan menyingkap arsitektur di balik framework ini. Memahami arsitektur penting karena akan menjelaskan mengapa ElysiaJS dirancang seperti ini — mulai dari cara kerja routing engine, bagaimana TypeBox menghasilkan JSON Schema, hingga bagaimana Eden Treaty mengekspos tipe ke client.
ElysiaJS terdiri dari tiga lapisan utama yang saling terintegrasi:
Core ElysiaJS adalah routing engine yang dibangun di atas TypeBox. Setiap route didaftarkan dengan method, path, dan schema — lalu TypeBox menghasilkan JSON Schema yang digunakan untuk validasi request dan inferensi tipe secara otomatis.
import { Elysia, t } from 'elysia'
const app = new Elysia()
.get('/', () => 'Hello Elysia!')
.post('/user', ({ body }) => body, {
body: t.Object({
name: t.String(),
email: t.String({ format: 'email' }),
})
})
.listen(3000)Perhatikan bahwa schema body di atas secara bersamaan melakukan dua hal: validasi request dan menghasilkan tipe TypeScript untuk body di handler. Ini adalah inti dari bagaimana ElysiaJS menghilangkan duplikasi tipe.
Semua fitur tambahan di ElysiaJS diimplementasikan sebagai plugin — termasuk CORS, JWT, Swagger, static files, dan bahkan serializer. Plugin adalah fungsi yang menerima instance app dan menambahkan route atau middleware kepadanya.
import { Elysia } from 'elysia'
import cors from '@elysiajs/cors'
import jwt from '@elysiajs/jwt'
const app = new Elysia()
.use(cors())
.use(jwt({ name: 'jwt', secret: process.env.JWT_SECRET }))Pendekatan plugin-based membuat ElysiaJS sangat modular — kalian hanya meng-include fitur yang dibutuhkan, menjaga bundle tetap kecil.
Eden Treaty adalah lapisan client yang memungkinkan frontend untuk memanggil route ElysiaJS dengan type safety penuh. Ia mengimpor tipe langsung dari server tanpa code generation.
import { treaty } from '@elysiajs/eden'
import type { app } from './server'
const client = treaty(app)
const { data } = await client.user.get({ query: { name: 'John' } })
// data otomatis typed berdasarkan route definitionAlur dari route definition hingga response bisa diuraikan dalam beberapa langkah:
t.Object(), t.String(), dll.).Proses ini sepenuhnya compile-time dan runtime — tidak ada code generation yang perlu dijalankan secara terpisah.
Express tidak punya built-in type system — kalian harus menambahkan @types/express dan bahkan itu pun tidak lengkap. ElysiaJS 100% type-safe dari awal, dengan validasi otomatis dari schema.
Keduanya performa tinggi dan menggunakan JSON Schema untuk validasi. Perbedaannya: ElysiaJS menggunakan TypeBox untuk menghasilkan JSON Schema dari tipe TypeScript, sedangkan Fastify meminta kalian menulis JSON Schema secara manual atau menggunakan library pihak ketiga. ElysiaJS juga unggul di type inference end-to-end melalui Eden Treaty.
NestJS sangat berbeda dari ElysiaJS — ia menggunakan decorators dan dependency injection ala Angular, berjalan di atas Express/Fastify, dan sangat berat untuk small-medium projects. ElysiaJS ringan dan functional-first, tanpa decorators, tanpa DI container.
Tip
Pilihan framework bergantung pada kebutuhan proyek. Jika kalian membutuhkan arsitektur modular besar dengan DI, NestJS bisa jadi pilihan. Jika kalian menginginkan ringan, cepat, dan type-safe end-to-end, ElysiaJS lebih cocok.
Pada episode 2 ini, kalian telah memahami arsitektur inti ElysiaJS — bagaimana core routing engine berbasis TypeBox, plugin system yang modular, dan Eden Treaty untuk client type-safe.
Inti yang harus dibawa pulang:
Di episode 3 selanjutnya kita akan membuat proyek pertama ElysiaJS — dari bun create elysia hingga menjalankan server pertama dan memahami anatomi aplikasi minimal. Sampai jumpa di episode 3!