
隨著 Bun 的崛起,最具代表性的後端框架為 Elysia 在 bun beta 版的時候
就有聽聞 Elysia 這個框架,在那時候開始 Hono 以及 Elysia 是這時代的超新星
今天會介紹 Elysia 主要是他是 bun-first 的框架,最早也是從 bun 起家,
雖然我也很喜歡 hono 但我核心主題講 bun 所以我們個需要介紹 Elysia 才能展現 bun 的威能
今天我們會介紹 Elysia 比較基本的操作,隨後會開始運用 Elysia 做一些 webService
效能極高 : 跟著我實作,如果跑得通的話,就會感受到 Elysia 的快速啟動
不是 Express 或其他可以比擬的,這個很自然會感受到
Type-safe : 傳統在搞 js 的 肯定會知道會有弱型別,的問題,無庸置疑,這年頭
各種後端框架都在往強型別靠齊,那講到強型別,由於 typescript 的歷史包袱,勢必有型別驗證的問題
熟悉的朋友肯定會知道用 zod typebox 或是 valibot 等,我們這裡用與 Elysia 內建 typebox 可以做型別驗證
以及有e2e 的型別安全 Eden Treaty: 可以參考 Eden Treaty
語法簡單 : 這個其實和 express 以及 hono 差不多,現在應該比較少人願意學困難的語法
plugins : 現在這時候 swagger, jwt, cors, static...etc 一應俱全
我們輸入指令
bun create elysia <專案名稱>
cd <專案名稱>
這時候可以看到 index.ts 內是長這樣的
import { Elysia } from "elysia";
const app = new Elysia().get("/", () => "Hello Elysia").listen(3000);
console.log(
`🦊 Elysia is running at ${app.server?.hostname}:${app.server?.port}`
);
直接跑起來
bun run dev
可以看到 host在 3000 port
這時候 curl http://localhost:3000
就可以看到 Hello Elysia 的結果

接下來我們開始做一些常見的範例熟悉一下 Elysia
const app = new Elysia()
app
.get('/:id', ({ params: { id } }) => `這個是 userid ${id}`)
.post('/user', ({ body }) => body)
.listen(3000);
我們看一下結果

我們這裡用 Elysia 提供的 typeBox 做簡單的實作
typeBox 做型別驗證的部分處理方式和 zod 是蠻像的
import { Elysia, t } from 'elysia';
const app = new Elysia();
// 這個寫法很像 zod
app
.post('/user', ({ body }) => body, {
body: t.Object({
name: t.String(),
email: t.String(),
age: t.Number(),
})
})
app.listen(3000);
我們這也看一下結果

如果驗證不過就會噴 400 回去
derive 可以擴充 context
最常用的當然就是 把 jwt token 送過去,我們範例簡單一點,不送一個正規的 token
有送就好,所以帶個隨意的資料
import { Elysia } from 'elysia';
const app = new Elysia();
app
.derive(({ headers }) => {
return {
token: headers['authorization'] ?? ''
}
})
.get('/profiles', ({ token }) => `收到的 token 是 ${token ?? ''}`)
app.listen(3000);

我們來做一個簡單的 plugins
其實 plugins 對 Elysia 來說就是一個簡單的 new Elysia
import { Elysia } from 'elysia';
// -------------------------------
const easyPlugin = new Elysia()
.derive(() => {
return {
pluginResult: '這裏有 plugins --'
}
}).as('global');
// -------------------------------
const app = new Elysia()
.use(easyPlugin);
app.get('/', ({ pluginResult }) => `hello ${pluginResult}`);
app.listen(3000);

如果 plugin 這邊不用鏈式處理會出現型別判別的錯誤
這跟建立的時機有關係,建議用我上面這樣的寫法
Elysia.js 結合了 Bun 的高效能與 TypeScript 的型別安全,特別適合想打造現代化、型別嚴謹 API 的開發者。
若你的專案已採用 Bun,或正在尋找一個比 Express 更現代、比 Fastify 更輕巧的選擇,Elysia 絕對值得一試。