Kori(サーバーサイドTS用のウェブアプリケーションフレームワーク)の0.4.0をリリースした

Kori(氷)は、自分好みのものを作ってみようと思って開発したフレームワーク。コアとして入れたい機能はできたのでひとまず満足している。もうAPIに対する大きな変更は入れないつもり。ちなみに、ルーターにはHonoのルーターを使っている。

スキーマを中心としている

Koriはスキーマを中心としている(と言っても外部化してるから要らないなら使わなくていい)。それと型。

スタンダードスキーマを指定して、バリデーションをかけられる。バリデーション済みのデータには型安全にアクセスできる。さらに、そのスキーマがそのままOpenAPIのスキーマになる(スタンダードJSONスキーマを使用している)。こういう感じ

  app.post("/todos", {
    pluginMeta: openApiMeta({
      summary: "Create a new TODO",
      tags: ["todos"],
    }),
    requestSchema: stdRequestSchema({
      body: z.object({
        text: z.string().min(1, "Text field is required and cannot be empty"),
      }),
    }),
    responseSchema: stdResponseSchema({
      201: todoSchema,
      400: errorSchema,
    }),
    handler: async (ctx) => {
      const { text } = ctx.req.validatedBody();

      const result = await ctx.env.db
        .insertInto("todos")
        .values({ text, done: false })
        .returning(["id", "text", "done", "created_at"])
        .executeTakeFirstOrThrow();

      ctx.log().info("Created todo", { id: result.id, text: result.text });
      return ctx.res.status(201).json(result);
    },
  });

自分好みの書き心地で嬉しい

↑のコードがそうなんだけど、試しにちょっとしたTODOアプリを作ってみたら、自分好みの書き心地で嬉しい(それはそう)。

↓バリデーション済みのデータを型つきでとれるし

↓起動時に差し込んだDBコネクション用のオブジェクト(ここではKyselyを使った)を型つきでとれるし

↓リクエスト内で扱えるロガーをコンテキストから取得できるし

そんなこんなで、満足している。

パフォーマンスも悪くない

Honoのルーターを薄くラッピングしてるから、Honoよりちょっと遅いけど悪くはないなというところ。画像は青がKoriで、オレンジがHono。10%遅いくらいかなぁ。

参照: GitHub - bufferings/bun-http-framework-benchmark: Performance benchmarks for Kori across Bun, Node.js, and Deno runtimes.

薄いフレームワークにしておこうと思っている

Koriはサーバーサイドの薄いフレームワークにしておこうと思っている。フロントエンドには、はみ出さずに、サーバーサイドだけに留めて、自分の目の届く範囲でちまちまと開発をできたらいいなと思っている。

プライベートで何か作ってみようかな

まだ、これを使ってちゃんとアプリを書いたことはないので、来年はプライベートで何かKoriを使ったプロダクトを作ってみて、足りていない部分を足したり、変なところを修正したりしていこうかな。それと、基本的なプラグイン(CORSとかリクエストIDとか)をちょこちょこ作っていこうかな。

もし遊んでみてもいいよって人がいたら、使ってみて感想を聞かせてください!