Open1

Bun+Hono+Prisma+Supabaseでバックエンドを構成する

MygMyg

動機

BunおよびHonoが軽量で超高速という情報を得たため、試しに使ってみようと思った

結論

超早い+開発が快適
実際に速度を測定したわけではないが、コンテナの立ち上げスピードが早かったり、修正後の反映が早かったりとだいぶ快適に開発を行えている。
ちなみに開発に使っているMac Book airのスペックが終わっており、これまでの開発では、コンテナを立ち上げるだけで動きが超絶重くなっていたが、そういったストレスも今のところ感じられない。

🔥 Bunのメリット

  1. 圧倒的に高速
  • Node.jsやDenoよりも圧倒的に高速な実行速度。
  • JavaScript/TypeScriptの実行、npmパッケージのインストール、ビルド、テストなどがすべて高速。
  1. オールインワン設計
  • パッケージマネージャ(npm互換)、ビルドツール、タスクリンナー、テストランナー、JSランタイムが1つに統合。
  • 他のツールチェーン(Webpack, Vite, Jest, etc.)を組み合わせずにシンプルに構築可能。
  1. TypeScriptがデフォルト対応
  • tsconfigの設定なしでもTypeScriptがそのまま動く。

🔥 Honoのメリット

  1. 超軽量 & 高速
  • 世界最速クラスのWebフレームワーク。
  • Rustベースの「itty-router」にインスパイアされている。
  • ランタイムに依存しない(Node.js, Bun, Cloudflare Workers, Deno, Vercel Functionsなどに対応)。
  1. ミニマルで分かりやすいAPI
  • ExpressやKoaのような書き心地。
  • 学習コストが非常に低く、コードが読みやすい。
  1. エッジ対応が簡単
  • Cloudflare WorkersやVercel Edge Functionsでの使用が容易。
  • 低レイテンシなAPI開発に向いている。

Bun+Honoのメリット

特徴 内容
🚀 超高速な開発 & 実行環境 開発・ビルド・実行すべてが速く、ストレスフリー。
🧼 シンプルな構成 複雑な設定不要。小規模から中規模のプロジェクトならこれだけでOK。
🔧 モダンなツールチェーン TypeScriptが自然に使え、不要な設定も減らせる。
🌐 マルチランタイム対応 将来的にCloudflare WorkersやVercel Functionsへの移行もスムーズ。
📦 依存ライブラリが少ない 脆弱性管理や保守コストも削減できる。

実装

まずローカルの開発環境にBunをインストールする

// macOS、Linux
curl -fsSL https://bun.sh/install | bash

// WindowsOS
powershell -c "irm bun.sh/install.ps1 | iex"

Honoのインストール

mkdir honoApp && cd honoApp
bun create hono myapp

Dockerfile、docker-compose.ymlをそれぞれ作成
また、Prismaを自動でインストールしたいので、shファイルに記載しコンテナ立ち上げ時実行する。

Dockerfile
# Bun公式イメージを使用
FROM oven/bun:latest

# 作業ディレクトリ作成
WORKDIR /app

# プロジェクトファイルをコピー
COPY . .

# 依存関係のインストール
RUN cd /app/myApp&& bun install

# ワークディレクトリを切り替え
WORKDIR /app/myApp

ENTRYPOINT ["./install-lib.sh"]
# アプリ起動
CMD ["bun", "run", "dev"]
docker-compose.yml
version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    volumes:
      - .:/app
    environment:
      - NODE_ENV=development
install-lib.sh
#!/bin/bash

# Prismaのインストール
bun add -d prisma

# PrismaClientのインストール
bun add @prisma/client

# そのスクリプトに渡された引数を "置き換えて" 実行する
#ここでは、bun run devが実行される
exec "$@"

コンテナが立ち上がったら、http://localhost:3000にアクセスする。
「Hello Hono!」が出ていれば成功

Supabaseに接続

  • Supabaseで新しいプロジェクトを作成し、パスワードを控えておく
  • プロジェクトの画面で Connect > ORMs を選択し、DATABASE_URLをコピー
  • Honoのプロジェクトルートに.envを作成し、DATABASE_URLをペースト、[Password]部分を控えておいたパスワードに変更
  • bunx prisma initでPrismaが初期化されschema.prismaが作成される。datasource dbの中身を下記のようにしておく。(Supbaseはpostgresqlを使っているため、Providerに注意)また、接続テストのため、Userモデルも作成しておく(後でかえてもよい)
datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id          String       @id @default(autoincrement())
  email       String       @unique
  name        String
}
  • bunx prisma migrate devを実行しmigrateする
  • bunx prisma generateを実行する

参考:
BunとPrisma
https://bun.sh/guides/ecosystem/prisma

BunとHono
https://bun.sh/guides/ecosystem/hono

Honoのベストプラクティス (エンドポイントの分け方など)
https://hono-ja.pages.dev/docs/guides/best-practices