Node/Express を使っている人で、Bun/Elysia に興味がある人向けの移行ガイドです。まぁマイグレーションというかポーティングというか。
各項目に「なぜそうなるのか」の簡単な解説を付けています。
🚀 Bun/Elysia を使うと何が良いのか(まず最初に)
Bun と Elysia を使う最大のメリットは、高速・シンプル・型安全の三拍子が揃っていることです。
例えば Express は成熟している一方で、Node.js の HTTP 実装やミドルウェアチェーンのオーバーヘッドが大きく、大量リクエスト時のスループットが伸びにくいという課題があります。JSON パースや CORS などの設定も都度追加が必要で、規模が大きくなるほど負担が増えがちですよね。
🌟 Bun のメリット(公式より)
- Node.js より高速な JavaScript ランタイム
- npm 互換のパッケージマネージャー
- TypeScript をそのまま実行可能
- Web API が標準で使える
- テストランナーやバンドラーも内蔵(オールインワン)
🌟 Elysia のメリット(公式より)
- Bun の性能を最大限に引き出す高速 Web フレームワーク
- JSON パースや型安全が標準で組み込まれている
- ルーティングやミドルウェアがシンプル
- TypeScript 前提で設計されているため補完が強力
- プラグインが軽量で扱いやすい
📊 公式ベンチマーク(引用)
Bun と Elysia の公式ページには、Node.js や他フレームワークとの比較チャートが掲載されています。
Bun 公式ベンチマーク
(引用元:https://bun.sh/)
例:
- Bun は Node.js より高速な HTTP サーバー性能
- JavaScript/TypeScript の実行速度が高速
- パッケージインストールが高速
※チャート画像は公式ページを参照してください。
Elysia 公式ベンチマーク
例:
- Express より圧倒的に高速
- Fastify や Hono と比較しても高いパフォーマンス
- Bun 上で動作するためさらに高速化
※チャート画像は公式ページを参照してください。
📝 なぜ Express → Bun/Elysia なのか(簡単に)
- Express は成熟しているが、Node.js の速度がボトルネックになる
- Elysia は Bun の高速ランタイムを前提に設計されている
- JSON パースや型安全など、Express で必要な設定が最初から揃っている
- API が増えるほど、Elysia の “設定不要の強さ” が効いてくる
この記事では、Express のコードを Elysia に「移植(ポーティング)」する方法をまとめています。
🌀 1. Express の基本構造
Express は Node.js の代表的な Web フレームワークで、最小構成でもミドルウェア設定が必要です。
import express from 'express'
const app = express()
app.get('/hello', (req, res) => {
res.json({ message: 'Hello World' })
})
app.listen(3000)
🌀 2. Bun + Elysia 版(最小構成)
Elysia は Bun 向けに最適化された高速フレームワークで、Express で必要な設定やミドルウェアが最初から組み込まれているため、余計な準備なしで API を書き始められます。
コード量そのものよりも、設定・依存関係・初期化の手間が大幅に減るのが大きなメリットです。
import { Elysia } from 'elysia'
const app = new Elysia()
.get('/hello', () => ({ message: 'Hello World' }))
.listen(3000)
console.log(`🟢 Elysia running at http://localhost:3000`)
🌀 3. JSON Body を受け取る(Express → Elysia)
Express は express.json() が必要ですが、Elysia は デフォルトで JSON をパースします。
Express
app.use(express.json())
app.post('/user', (req, res) => {
res.json({ name: req.body.name })
})
Elysia
new Elysia()
.post('/user', ({ body }) => ({
name: body.name
}))
.listen(3000)
🌀 4. ルーティング(Router → Group)
Express の Router に相当するのが Elysia の group()。
ネスト構造がわかりやすく、型も引き継がれるのが強みです。
Express
const router = express.Router()
router.get('/a', ...)
router.get('/b', ...)
app.use('/api', router)
Elysia
new Elysia()
.group('/api', app =>
app
.get('/a', () => 'A')
.get('/b', () => 'B')
)
.listen(3000)
🌀 5. Middleware(Express → Elysia)
Express の app.use() に相当するのが Elysia の onRequest()。
リクエスト前後のフックが細かく用意されているのが特徴です。
Express
app.use((req, res, next) => {
console.log(req.path)
next()
})
Elysia
new Elysia()
.onRequest(({ request }) => {
console.log(request.url)
})
.get('/', () => 'OK')
.listen(3000)
🌀 6. CORS(Express → Elysia)
Express と同じくプラグイン方式ですが、Elysia は 公式プラグインが軽量で高速です。
Express
import cors from 'cors'
app.use(cors())
Elysia
import { cors } from '@elysiajs/cors'
new Elysia()
.use(cors())
.listen(3000)
🌀 7. 静的ファイル(Express → Elysia)
Express の express.static() と同じ役割を、Elysia では staticPlugin() が担います。
Express
app.use(express.static('public'))
Elysia
import { staticPlugin } from '@elysiajs/static'
new Elysia()
.use(staticPlugin())
.listen(3000)
🌀 8. Bun の強みを活かすポイント
Bun + Elysia は 高速・型安全・設定不要 の三拍子が揃っています。
| 項目 | Express | Bun + Elysia |
|---|---|---|
| 起動速度 | 遅い | 爆速 |
| TypeScript | 手動設定 | デフォルトで型安全 |
| JSON パース | express.json() 必要 | 標準搭載 |
| ルーティング | Router 必須 | group() で簡潔 |
| パフォーマンス | 中 | 高速(Deno/Go 並) |
🌀 9. 関連リンクまとめ
Bun や Elysia をさらに深掘りしたい人向けのリンク集です。
🔗 Bun 関連(Qiita)
- Bun 全体検索
https://qiita.com/search?q=Bun - Bun + Elysia 記事検索
https://qiita.com/search?q=Elysia+Bun - toshirotによる Bun 記事一覧
https://qiita.com/search?q=Bun+toshirot
🔗 公式ドキュメント
- Bun 公式
https://bun.sh - Elysia 公式
https://elysiajs.com - Bun GitHub
https://github.com/oven-sh/bun - Elysia GitHub
https://github.com/elysiajs/elysia
🌀 10. まとめ
Express のコードはそのままでも動きますが、まぁ一般的に
Bun + Elysia に移行するとコード量が減り、速度が上がり、型安全になりますね。