😀
🌟 22歳の大学生がAPIフレームワークを作ってみた話
副作用が見えないNext.js API Routes、300msのCold Start、グローバルミドルウェア…。
「これ、全部設計の失敗では…?」そんな疑問から、一人の大学生がOSSを暴発させました。
☕️ これは、はじめてのフレームワーク開発
少し自分の話をさせてください。
私は大学でTypeScriptやWeb開発を勉強しながら、Next.jsのAPI Routesに一緒になれない悩みを持っていました。
- ルーティングがファイルシステムに分散
- middlewareが全部globalでよく分からない
- APIが悪くなってもスタックトレースの地獄
これ、誰が設計したんだ?…そう思った時、わたしは決めました。
「ないなら作ればいいじゃん」
✨ Tirneという挙動
そうして生まれたのが「Tirne」です。
名前はアングロサクソン語の「structure / strength」からとりました。
Tirne doesn’t just run your code. It structures it.
基本思想:
- 路線もロジックも「振る舞いではなく構造」
- middlewareは「明示的」であるべき
- BunやCloudflare Workersで「サブms弁度」
- TypeScriptの型が「振る舞いを定義する」
⚡️ ベンチマーク結果
メトリック | Tirne (Bun) | Next.js API |
---|---|---|
❄️ Cold Start | 0.02ms | 約200~300ms |
⚡️ First Hit | 0.79ms | 20~30ms |
押し払いRPS | 90,000+ | 8,000~10,000 |
平均レーテンシ | <1ms | 約15ms |
ちなみに、これ「チューニング前」の値です。
🔑 Tirneのコードイメージ
📁 Hello API
import { Server } from "tirne";
const server = new Server([
{ method: "GET", path: "/health", handler: () => new Response("OK") }
]);
export default {
fetch: (req: Request) => server.fetch(req),
};
🔐 Cookie & Auth
import { Server, json, setCookie, requireAuth } from "tirne";
import type { Route } from "tirne";
const routes: Route[] = [
{
method: "GET",
path: "/login",
handler: () => {
const headers = new Headers();
headers.append("Set-Cookie", setCookie("auth", "token", {
httpOnly: true,
path: "/",
maxAge: 3600,
}));
return json({ message: "Logged in" }, 200, headers);
},
},
{
method: "GET",
path: "/private",
handler: () => json({ message: "Secret" }),
middleware: [requireAuth],
},
];
🌐 最後に
私はまだまだ学生で、Tirneも成長途中のプロダクトです。
もし、コンセプトや思想に革命を感じた方がいれば、GitHubでスターして頂けたら嬉しいです。
【外部リンク】
評価と感想、お待ちしております🌟
Discussion