bun-elysia について
bun-elysiaは、BunとElysia.jsで開発する人向けのリファレンススキルです。プロジェクト作成、フレームワークの機能、Bun API、Fastifyからの移行を扱います。
主な機能
- 01BunとElysia.jsのプロジェクト作成
- 02ルーティング、ハンドラー、検証
- 03ライフサイクルフック、プラグイン、WebSocket
- 04BunのデータベースとストレージAPI
- 05OpenAPIドキュメントとEden型付きクライアント
- 06Fastifyからの移行ガイド
活用シーン
- 01Elysiaアプリを作成して開発サーバーを起動
- 02APIにルートとリクエスト検証を追加
- 03BunのデータベースやRedis APIを利用
- 04Fastifyの機能をElysiaへ移行
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ ymc182/ bun-elysia-skill --skill bun-elysiaインストール後、Claude Code で/bun-elysiaを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/monorepo.mdreferences/elysia/swagger.mdlifecycle.mdcore.mdwebsocket.mdeden.mdvalidation.mdreferences/migration/fastify-advanced.mdfastify-hooks.mdfastify-auth.mdfastify-plugins.mdfastify-basics.mdfastify-validation.mdreferences/native-apis/http-server.mdredis.mds3.mdsql.md詳細
Bun + Elysia.js 開発
Bun ランタイムと Elysia.js フレームワークで、高性能なフルスタックアプリケーションを構築します。
クイックスタート
Elysia プロジェクトの新規作成
bun create elysia my-app
cd my-app
bun run dev
基本的なサーバー
import { Elysia, t } from "elysia";
const app = new Elysia()
.get("/", () => "Hello, World!")
.get("/users/:id", ({ params }) => ({ id: params.id }), {
params: t.Object({ id: t.Number() })
})
.post("/users", ({ body }) => ({ created: body }), {
body: t.Object({
name: t.String(),
email: t.String({ format: "email" })
})
})
.listen(3000);
Bun ネイティブ API を使用する
import { Elysia } from "elysia";
import { sql } from "bun";
import { redis } from "bun";
const app = new Elysia()
.decorate("sql", sql)
.decorate("redis", redis)
.get("/users", async ({ sql }) => {
return sql`SELECT * FROM users`;
})
.get("/cache/:key", async ({ redis, params }) => {
return redis.get(params.key);
})
.listen(3000);
リファレンスナビゲーション
何をしますか?
プロジェクトをセットアップする:
- ワークスペースを使ったモノレポ → monorepo.md
Bun ネイティブ API を使用する:
- PostgreSQL/MySQL/SQLite → native-apis/sql.md
- Redis/Valkey → native-apis/redis.md
- S3/オブジェクトストレージ → native-apis/s3.md
- HTTP サーバーの基本 → native-apis/http-server.md
Elysia で構築する:
- ルーティングとハンドラー → elysia/core.md
- リクエスト/レスポンスのバリデーション → elysia/validation.md
- フック、ミドルウェア、プラグイン → elysia/lifecycle.md
- WebSocket のサポート → elysia/websocket.md
- OpenAPI/Swagger ドキュメント → elysia/swagger.md
- 型安全なクライアント(Eden) → elysia/eden.md
Fastify から移行する:
- ルーティング、パラメーター、ボディ → migration/fastify-basics.md
- スキーマのバリデーション → migration/fastify-validation.md
- ライフサイクルフック → migration/fastify-hooks.md
- プラグインアーキテクチャ → migration/fastify-plugins.md
- 認証 → migration/fastify-auth.md
- WebSocket、Swagger、ファイル → migration/fastify-advanced.md
よく使われるパターン
認証ミドルウェア
import { Elysia } from "elysia";
import { jwt } from "@elysiajs/jwt";
const app = new Elysia()
.use(jwt({ secret: process.env.JWT_SECRET! }))
.derive(async ({ headers, jwt }) => {
const token = headers.authorization?.replace("Bearer ", "");
const user = token ? await jwt.verify(token) : null;
return { user };
})
.get("/profile", ({ user, error }) => {
if (!user) return error(401);
return user;
});
バリデーション付きデータベース
import { Elysia, t } from "elysia";
import { sql } from "bun";
const app = new Elysia()
.post("/users", async ({ body }) => {
const [user] = await sql`
INSERT INTO users (name, email)
VALUES (${body.name}, ${body.email})
RETURNING *
`;
return user;
}, {
body: t.Object({
name: t.String({ minLength: 1 }),
email: t.String({ format: "email" })
})
});
ガード付きのグループ化ルート
app.group("/api", (app) =>
app
.guard({
headers: t.Object({
authorization: t.String()
}),
beforeHandle: ({ headers, error }) => {
if (!isValidToken(headers.authorization)) {
return error(401);
}
}
}, (app) =>
app
.get("/users", getUsers)
.post("/users", createUser)
)
);
WebSocket チャット
app.ws("/chat", {
body: t.Object({
room: t.String(),
message: t.String()
}),
open(ws) {
ws.subscribe("general");
},
message(ws, { room, message }) {
ws.publish(room, { from: ws.id, message });
}
});
主な違い:Fastify と Elysia
| Fastify | Elysia |
|---|---|
request.params | { params } |
request.query | { query } |
request.body | { body } |
reply.code(n).send(x) | set.status = n; return x |
reply.header(k, v) | set.headers[k] = v |
| JSON Schema | TypeBox (t.*) |
preHandler hook | beforeHandle |
fastify.decorate() | .decorate() |
fastify.register(plugin) | .use(plugin) |
インストール
# Elysia and plugins
bun add elysia @elysiajs/swagger @elysiajs/jwt @elysiajs/cors @elysiajs/static @elysiajs/eden
# Types
bun add -d @types/bun typescript
コメント
Markdown 対応