9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Nuxt.jsを支えるサーバーエンジンNitroを探ってみる

Last updated at Posted at 2025-12-18

はじめに

個人的に、今携わっているサービスのSEOを強化したいなと思っており、SSRなどを採用し、強化できないかなと、色々調べていくとNitroに行きつきました。

なので、今回は、Nuxt.jsのバックエンドを支える強力なエンジン「Nitro」について、その特徴や仕組み、具体的な活用事例をまとめました。

もともとはNuxtの一部でしたが、現在は独立したOSSとして切り出されており、Node.js、ブラウザ、Denoなど多様な環境で動作するように設計されています。

1. Nitroとは?:技術的基盤

Nitroは、Nuxt 3のバックエンドを支えるサーバーエンジンです。以下の強力なOSS技術の上に構築されています。

  • H3 (Minimal H(TTP) Framework)

    • unjsエコシステムの一部で、超軽量かつモダンなHTTPフレームワークです。

    • レガシーなフレームワークと比較してオーバーヘッドが極めて少なく、サーバーレス環境やエッジワーカーでの動作に最適化されています。

  • Rollup

    • 次世代のJavaScriptモジュールバンドラーです。

    • ビルドシステムとして採用されており、Tree-shaking(不要なコードの削除)によって生成されるバンドルサイズを最小限に抑えます。これにより、高速なコールドスタートを実現しています。

主な特徴

  • 高速なコールドスタート: 最小限の依存関係で瞬時に起動します。

  • ポータビリティ: Node.jsだけでなく、Deno、Bun、Service Workersなど、あらゆるJSランタイムで動作します。

2. なぜNitroが良いのか?

ユニバーサルデプロイ

従来の課題として、デプロイ先ごとに設定の修正が必要という点がありました。NitroはWrite Once, Run Anywhere (一度書けば、どこでも動く)を実現します。

ビルド時にターゲット環境を指定するだけで、最適な形式に変換されます。

  • Zero config: Vercel, Netlify, Cloudflareなどは設定なしで自動検出されます。

  • Node.js: 従来のサーバープロセスとして出力可能。

  • Edge Functions / Serverless: AWS Lambda, Azure, Vercel Edgeなどに対応。

開発者はインフラの違いを気にせず、機能開発に集中できます。

3. 優れた開発体験

Server API

server/api/ ディレクトリにファイルを作成するだけで、APIエンドポイントが自動生成されます。ボイラープレートは不要です。

基本的なGETリクエスト

JSONシリアライズは自動で行われるため、オブジェクトを返すだけでOKです。

server/api/hello.ts
export default defineEventHandler((event) => {
  return {
    message: 'Hello, Nitro!',
    timestamp: new Date()
  }
})

→ アクセス先: /api/hello

クエリパラメータとボディの取得

readBodygetQuery などのユーティリティが自動インポートされ、シンプルかつ型安全に記述できます。

server/api/submit.post.ts
// ファイル名に .postを付けるとPOSTリクエスト限定になります

export default defineEventHandler(async (event) => {
  // クエリパラメータの取得 (/api/submit?id=123)
  const query = getQuery(event)
  
  // POSTボディの取得と型定義
  const body = await readBody<{ name: string, email: string }>(event)

  // ログ出力などサーバー側の処理
  console.log(`User ID: ${query.id}, Name: ${body.name}`)

  return { success: true }
})

4. Nitroの真骨頂:ハイブリッドレンダリング

Nitroでは、アプリケーション全体をSSRかCSRかで選ぶ必要はありません。ページ(ルート)ごとにレンダリング戦略を変更可能です。

レンダリングモードの比較

モード 仕組み メリット デメリット
SSR リクエスト毎にサーバーでHTML生成 初期表示が高速、SEO対応 サーバー負荷が高い
CSR ブラウザでJSを実行して描画 サーバー負荷が低い、遷移がサクサク 初期表示が遅い、SEOに不利な場合あり
SWR キャッシュを活用し裏でHTML生成 常に高速、動的更新と負荷軽減の両立 一瞬古い情報が出る場合がある
SSG ビルド時に事前にHTMLを生成 爆速配信 ビルド時間が長い、リアルタイム更新不可

設定方法 (nuxt.config.ts)

routeRules に数行書くだけで、これらの戦略を1つのプロジェクト内で共存させることができます。

nuxt.config.ts
export default defineNuxtConfig({
  routeRules: {
    // 静的コンテンツ (LPや利用規約など) -> SSG
    '/': { prerender: true },
    '/about': { prerender: true },

    // ブログ記事など -> SWR
    // 1時間(3600秒)キャッシュし、期限切れ後は裏で再生成
    '/blog/**': { isr: 3600 },

    // 管理画面など -> CSR
    // SEO不要でインタラクティブなページ
    '/admin/**': { ssr: false },
    
    // 特定のAPIレスポンスにキャッシュヘッダーを付与
    '/api/products': { cache: { maxAge: 60 * 60 } }
  }
})

5. 柔軟なストレージ層:Unstorage

Nitroは Unstorage というKV(キーバリュー)ストアの統一インターフェースを持っています。

  • 統一されたAPI: コード修正なしでドライバ(保存先)を変更可能です。

  • 環境による切り替え: 開発時はファイルシステム、本番はRedisなどを使用するといった運用が可能です。

データの保存と取得 (API内)

server/api/cache-test.ts

export default defineEventHandler(async (event) => {
  // 'redis' という名前空間を使用(設定でドライバを指定可能)
  const storage = useStorage('redis')

  // データの保存
  await storage.setItem('my-key', { value: 'cached data' })

  // データの取得
  const data = await storage.getItem('my-key')

  return data
})

設定ファイル (nuxt.config.ts)

export default defineNuxtConfig({
  nitro: {
    storage: {
      // 開発環境はファイルシステムを使用
      redis: {
        driver: 'fs',
        base: './.data/cache'
      }
      // 本番環境のみRedisに切り替える場合などは環境変数で上書き可能
      // NITRO_STORAGE_REDIS_DRIVER=redis
      // NITRO_STORAGE_REDIS_URL=redis://localhost:6379
    }
  }
})

6. パフォーマンス最適化:内部フェッチ

Nuxtアプリケーション内(SSR中)から自身のサーバーAPIを呼ぶ場合、ネットワークリクエストは発生しません。 Nitroが呼び出しを検知し、HTTPリクエストをスキップして関数を直接実行します。これによりネットワークオーバーヘッドがゼロになります。

<script setup lang="ts">
// フロントエンド (Vueコンポーネント)
// SSR中、この呼び出しはHTTP経由ではなく関数呼び出しとして処理される
const { data } = await useFetch('/api/hello')
</script>

7. 具体的な活用事例

これらの機能を組み合わせることで、以下のような課題解決が可能です。

事例1:大規模メディア

  • 課題: 記事数が多くビルド時間が長すぎる。

  • 解決策: **ISR(オンデマンド再生成)**を採用。

  • 効果: 最新記事のみビルドし、過去記事はアクセス時に生成・キャッシュすることで運用を効率化。

事例2:ECサイト

  • 課題: 商品情報はキャッシュして高速化したいが、在庫はリアルタイムに表示したい。

  • 解決策: ハイブリッドレンダリングとAPIの使い分け。

    • 商品詳細ページ:SWRで高速表示。

    • 在庫・価格部分:クライアントサイドからAPIを叩いて動的に取得。

まとめ

Nitroは、クロスプラットフォーム対応、優れた開発体験(DX)、そして高度なレンダリング戦略を兼ね備えた強力なエンジンです。Nuxt 3を使うことで、開発者はこれらの恩恵を自然に受けながら、高パフォーマンスなアプリケーションを構築できます。

参考

9
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?