iT邦幫忙

2026 iThome 鐵人賽

DAY 16
0

day16_title

前言

隨著 Bun 的崛起,最具代表性的後端框架為 Elysia 在 bun beta 版的時候
就有聽聞 Elysia 這個框架,在那時候開始 Hono 以及 Elysia 是這時代的超新星

今天會介紹 Elysia 主要是他是 bun-first 的框架,最早也是從 bun 起家,
雖然我也很喜歡 hono 但我核心主題講 bun 所以我們個需要介紹 Elysia 才能展現 bun 的威能

今天我們會介紹 Elysia 比較基本的操作,隨後會開始運用 Elysia 做一些 webService

為什麼我要用 Elysia

  1. 效能極高 : 跟著我實作,如果跑得通的話,就會感受到 Elysia 的快速啟動
    不是 Express 或其他可以比擬的,這個很自然會感受到

  2. Type-safe : 傳統在搞 js 的 肯定會知道會有弱型別,的問題,無庸置疑,這年頭
    各種後端框架都在往強型別靠齊,那講到強型別,由於 typescript 的歷史包袱,勢必有型別驗證的問題
    熟悉的朋友肯定會知道用 zod typebox 或是 valibot 等,我們這裡用與 Elysia 內建 typebox 可以做型別驗證
    以及有e2e 的型別安全 Eden Treaty: 可以參考 Eden Treaty

  3. 語法簡單 : 這個其實和 express 以及 hono 差不多,現在應該比較少人願意學困難的語法

  4. plugins : 現在這時候 swagger, jwt, cors, static...etc 一應俱全

開始第一個 Elysia 專案

我們輸入指令

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 的結果

hello world result

接下來我們開始做一些常見的範例熟悉一下 Elysia

路由(Route)

const app = new Elysia()

app
  .get('/:id', ({ params: { id } }) => `這個是 userid ${id}`)
  .post('/user', ({ body }) => body)
  .listen(3000);

我們看一下結果

route_result

type-safe : Schema 驗證

我們這裡用 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);

我們這也看一下結果

validation_result

如果驗證不過就會噴 400 回去

Context & derive

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);

derive_result

插件

我們來做一個簡單的 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_result

踩雷分享

如果 plugin 這邊不用鏈式處理會出現型別判別的錯誤
這跟建立的時機有關係,建議用我上面這樣的寫法

結論

Elysia.js 結合了 Bun 的高效能與 TypeScript 的型別安全,特別適合想打造現代化、型別嚴謹 API 的開發者。
若你的專案已採用 Bun,或正在尋找一個比 Express 更現代、比 Fastify 更輕巧的選擇,Elysia 絕對值得一試。


上一篇
Bun Macros:編譯時執行程式碼的黑魔法(下篇- 實戰例子篇)
下一篇
Elysia + Eden:端到端型別安全,不再手刻 API 型別
系列文
不只是快 —— Bun 30 天:從底層架構、全套工具鏈到生產部署19
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言