mcpField
B
bun-nuxt

bun-nuxt

github.com/secondsky開発240391 回インストール5 週間前に更新
リポジトリ

bun-nuxt について

BunでNuxt 3アプリを実行するための開発者向けスキルです。プロジェクト設定、サーバーコードでのBun API利用、Nitroの設定、デプロイ方法を扱います。

主な機能

  1. 01Bunを使ったNuxt 3の設定
  2. 02BunランタイムとNitroの設定
  3. 03サーバールートでのBun API利用
  4. 04データベースとファイル操作
  5. 05ビルドとデプロイのガイド

活用シーン

  1. 01BunでのNuxt 3プロジェクト開始
  2. 02サーバールートでのBun API利用
  3. 03Bunランタイム向けのNitro設定
  4. 04本番サーバーのビルドと実行

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/secondsky/claude-skills --skill bun-nuxt

インストール後、Claude Code で/bun-nuxtを入力して読み込まれたか確認します。

詳細

Bun Nuxt

Bun を使用して Nuxt 3 アプリケーションを高速に開発できます。

クイックスタート

# Create new Nuxt project
bunx nuxi@latest init my-app
cd my-app

# Install dependencies
bun install

# Development
bun run dev

# Build
bun run build

# Preview production
bun run preview

安全なインストール

bunx nuxi init のようなスキャフォールディングツールは、リモートコードをダウンロードして実行します。実行する前に、サプライチェーンセキュリティのベストプラクティスに従ってください。

  • インストール後スクリプトをブロックする — Bun はデフォルトでこれらを無効にします。package.json の trustedDependencies で特定のパッケージを許可できます
  • クールダウン期間 — bunfig.toml の minimumReleaseAge を設定して、新しいバージョンの公開から7日間待機します
  • インストール前に監査する — socket package score npm <pkg> を実行するか、socket npm install <pkg> を使用してパッケージを確認します

Socket CLI との統合、クールダウンの設定、ロックファイルの検証、CI による適用を含むセキュリティ設定全般については、dependency-upgrade スキルを読み込んでください。

プロジェクトのセットアップ

package.json
{
  "scripts": {
    "dev": "nuxt dev",
    "build": "nuxt build",
    "generate": "nuxt generate",
    "preview": "nuxt preview",
    "postinstall": "nuxt prepare"
  },
  "dependencies": {
    "nuxt": "^4.0.0",
    "vue": "^3.5.0"
  }
}
Bun ランタイムを使用する
{
  "scripts": {
    "dev": "bun --bun nuxt dev",
    "build": "bun --bun nuxt build",
    "preview": "bun --bun .output/server/index.mjs"
  }
}

設定

nuxt.config.ts
export default defineNuxtConfig({
  // Enable SSR
  ssr: true,

  // Nitro configuration
  nitro: {
    // Use Bun preset
    preset: "bun",

    // External packages
    externals: {
      external: ["bun:sqlite"],
    },
  },

  // Development
  devServer: {
    port: 3000,
  },

  // Modules
  modules: ["@nuxt/ui", "@pinia/nuxt"],
});

Bun API の使用

サーバールート
// server/api/users.ts
import { Database } from "bun:sqlite";

export default defineEventHandler(async (event) => {
  const db = new Database("data.sqlite");
  const users = db.query("SELECT * FROM users").all();
  db.close();

  return users;
});
サーバーミドルウェア
// server/middleware/auth.ts
export default defineEventHandler(async (event) => {
  const token = getHeader(event, "Authorization");

  if (!token && event.path.startsWith("/api/protected")) {
    throw createError({
      statusCode: 401,
      message: "Unauthorized",
    });
  }
});
ファイル操作
// server/api/files/[name].ts
export default defineEventHandler(async (event) => {
  const name = getRouterParam(event, "name");
  const file = Bun.file(`./data/${name}`);

  if (!(await file.exists())) {
    throw createError({
      statusCode: 404,
      message: "File not found",
    });
  }

  return file.text();
});

コンポーザブル

サーバーデータを使用した useFetch
<script setup lang="ts">
// Fetches from server/api/users.ts
const { data: users, pending, error } = await useFetch("/api/users");
</script>

<template>
  <div v-if="pending">Loading...</div>
  <div v-else-if="error">Error: {{ error.message }}</div>
  <ul v-else>
    <li v-for="user in users" :key="user.id">{{ user.name }}</li>
  </ul>
</template>
サーバー専用コンポーザブル
// composables/useDatabase.ts
export const useDatabase = () => {
  // Only runs on server
  if (process.server) {
    const { Database } = require("bun:sqlite");
    return new Database("data.sqlite");
  }
  return null;
};

サーバーユーティリティ

H3 イベント処理
// server/api/users.post.ts
export default defineEventHandler(async (event) => {
  // Read body
  const body = await readBody(event);

  // Get query params
  const query = getQuery(event);

  // Get headers
  const auth = getHeader(event, "Authorization");

  // Get cookies
  const session = getCookie(event, "session");

  // Set cookie
  setCookie(event, "visited", "true", {
    httpOnly: true,
    maxAge: 60 * 60 * 24,
  });

  return { success: true };
});
データベースユーティリティ
// server/utils/db.ts
import { Database } from "bun:sqlite";

let db: Database | null = null;

export function getDb() {
  if (!db) {
    db = new Database("data.sqlite");
    db.run(`
      CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY,
        name TEXT NOT NULL
      )
    `);
  }
  return db;
}
// server/api/users.ts
export default defineEventHandler(() => {
  const db = getDb();
  return db.query("SELECT * FROM users").all();
});

Nitro の機能

サーバープラグイン
// server/plugins/database.ts
export default defineNitroPlugin((nitroApp) => {
  // Initialize on startup
  console.log("Database initialized");

  // Cleanup on shutdown
  nitroApp.hooks.hook("close", () => {
    console.log("Closing database");
  });
});
スケジュールタスク
// server/tasks/cleanup.ts
export default defineTask({
  meta: {
    name: "cleanup",
    description: "Clean old data",
  },
  run() {
    const db = getDb();
    db.run("DELETE FROM logs WHERE created_at < ?", [
      Date.now() - 7 * 24 * 60 * 60 * 1000,
    ]);
    return { result: "Cleaned" };
  },
});

デプロイ

Bun 向けにビルドする
# Build with Bun preset
NITRO_PRESET=bun bun run build

# Run production server
bun .output/server/index.mjs
Docker
FROM oven/bun:1 AS builder

WORKDIR /app
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile

COPY . .
RUN bun run build

FROM oven/bun:1

WORKDIR /app
COPY --from=builder /app/.output /app/.output

EXPOSE 3000

CMD ["bun", ".output/server/index.mjs"]
環境変数
# .env
NUXT_PUBLIC_API_URL=https://api.example.com
DATABASE_URL=./data.sqlite
// Access in code
const config = useRuntimeConfig();
console.log(config.public.apiUrl);
console.log(config.databaseUrl); // Server only
// nuxt.config.ts
export default defineNuxtConfig({
  runtimeConfig: {
    databaseUrl: "",
    public: {
      apiUrl: "",
    },
  },
});

よくあるエラー

エラー原因修正方法
Cannot find bun:sqliteプリセットが正しくありませんnitro.preset: "bun" を設定します
Module parse failedビルドの問題.nuxt を削除して再ビルドします
Hydration mismatchサーバーとクライアントの差異非同期データを確認します
EADDRINUSEポートが使用中ですポートを変更するか、プロセスを終了します

リファレンスを読み込むタイミング

次の場合は references/nitro.md を読み込んでください。

  • 高度な Nitro 設定
  • ストレージドライバー
  • キャッシュハンドラー

次の場合は references/deployment.md を読み込んでください。

  • エッジへのデプロイ
  • Cloudflare Workers
  • Vercel/Netlify

コメント