0Pricing
Vue Academy · レッスン

Vue SPA向けFastifyバックエンド

Fastifyのルート、CORS、Vueビルドの静的配信、レート制限、リクエストのバリデーション

「Vue SPA向けFastifyバックエンド」はCoddyKit上の無料Vue Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはVue Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Vue Academyコースには全4レッスンが含まれています。

Vue SPAにFastifyを使う理由

Fastifyは、高速でオーバーヘッドが小さく、充実したプラグインエコシステムと組み込みのスキーマ検証機能を備えたNode.js用Webフレームワークです。Vueのシングルページアプリケーションに適したAPIバックエンドとなり、ビルド済みの静的ファイルを配信することもできます。

ロガー付きのサーバーを作成する

logger: trueを指定してFastifyをインスタンス化すると、Pinoによる構造化されたリクエストログを標準で利用できます。VueアプリからのAPI呼び出しをデバッグするうえで非常に役立ちます。

import Fastify from 'fastify'

const app = Fastify({
  logger: true
})

await app.listen({ port: 3000, host: '0.0.0.0' })

Vue開発サーバーのCORS

開発中は、Vueアプリが別のオリジン(例: localhost:5173)で実行されます。@fastify/corsを登録してそのオリジンを許可すると、ブラウザーからのクロスオリジンAPI呼び出しが許可されます。

import cors from '@fastify/cors'

await app.register(cors, {
  origin: 'http://localhost:5173',
  credentials: true // allow cookies
})

ビルド済みVueのdistを配信する

本番環境では、コンパイル済みのVueアプリを配信します。@fastify/staticをdistディレクトリに向けて登録すると、Fastifyがindex.htmlとアセットを配信します。

import fastifyStatic from '@fastify/static'
import { join } from 'node:path'

await app.register(fastifyStatic, {
  root: join(process.cwd(), 'dist'),
  prefix: '/'
})

SPAのフォールバックルート

Vue SPAはクライアント側ルーティングを使用するため、未知のパスには404ではなくindex.htmlを返す必要があります。アプリシェルを配信するワイルドカードのフォールバックを追加すると、リロード時にもディープリンクが機能します。

app.setNotFoundHandler((req, reply) => {
  // let the Vue router handle non-API paths
  if (req.url.startsWith('/api')) {
    return reply.code(404).send({ error: 'Not found' })
  }
  return reply.sendFile('index.html')
})

レート制限

@fastify/rate-limitを使用して、APIを不正利用から保護します。クライアントごとに、一定の時間枠内で許可するリクエスト数の上限を設定します。

import rateLimit from '@fastify/rate-limit'

await app.register(rateLimit, {
  max: 100,            // requests
  timeWindow: '1 minute'
})

ルートでのスキーマ検証

FastifyはJSON Schemaを使用して検証とシリアライズを行います。bodyスキーマを定義すると、Fastifyがハンドラーの実行前に無効なペイロードを400として拒否するため、手動で検証する必要はありません。

app.post('/api/users', {
  schema: {
    body: {
      type: 'object',
      required: ['email', 'name'],
      properties: {
        email: { type: 'string', format: 'email' },
        name: { type: 'string', minLength: 1 }
      }
    }
  }
}, async (req) => {
  return createUser(req.body)
})

高速化のためのレスポンススキーマ

responseスキーマを追加すると、Fastifyはコンパイル済みの高速なシリアライザーで出力をシリアライズし、スキーマにないフィールドを除去します。これにより、パフォーマンスとセキュリティの両方が向上します。

app.get('/api/users/:id', {
  schema: {
    response: {
      200: {
        type: 'object',
        properties: {
          id: { type: 'number' },
          name: { type: 'string' }
          // password is omitted, never serialized
        }
      }
    }
  }
}, getUserHandler)

ルートをプラグインとして整理する

Fastifyはカプセル化を推奨しています。関連するルートをプラグインにまとめ、プレフィックス付きで登録します。これにより、APIの規模が大きくなってもモジュール性を維持できます。

async function userRoutes(app) {
  app.get('/', listUsers)
  app.post('/', createUser)
}

await app.register(userRoutes, { prefix: '/api/users' })

プラグインの登録順序

順序が重要です。corsやrate-limitなどの横断的なプラグインをルートより先に登録し、静的ファイル配信とSPAのフォールバックは最後に登録します。これにより、キャッチオールがindex.htmlを配信する前にAPIルートが照合されます。

await app.register(cors, corsOpts)
await app.register(rateLimit, rlOpts)
await app.register(userRoutes, { prefix: '/api/users' })
await app.register(fastifyStatic, staticOpts) // last

開発環境と本番環境の戦略

開発環境では、Viteの開発サーバーとFastifyを別々に実行し、CORSを利用します。本番環境ではVueアプリをビルドし、Fastifyから同じオリジンのdistを配信します。CORSは不要になり、デプロイ可能なプロセスを1つにできます。

確認テスト

Fastifyバックエンドについての理解度を確認しましょう。

まとめ

Vue SPA向けのFastifyバックエンドの構築について学びました。

  • logger: trueで構造化されたリクエストログを利用できます
  • @fastify/corsでVue開発サーバーのオリジンを許可できます
  • @fastify/staticでビルド済みのdistを配信でき、ワイルドカードのフォールバックでSPAルーティングを有効にできます
  • @fastify/rate-limitで不正利用を防止できます
  • JSON Schemaでボディを検証し、レスポンスを安全かつ高速にシリアライズできます

よくある質問

「Vue SPA向けFastifyバックエンド」レッスンは無料ですか?

はい。「Vue SPA向けFastifyバックエンド」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Vue Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Vue Academyコースには全4レッスンが含まれています。

「Vue SPA向けFastifyバックエンド」で何を学びますか?

Fastifyのルート、CORS、Vueビルドの静的配信、レート制限、リクエストのバリデーション ブラウザで直接実行するハンズオンコードでVue Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Vue Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのVue Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「Vue SPA向けFastifyバックエンド」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このVue Academyレッスンでコードを書いて実行できますか?

はい。すべてのVue Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Vue SPA向けFastifyバックエンド
  2. JWT認証:ログインとリフレッシュ
  3. Axiosインターセプターによる認証API呼び出し
  4. フルスタックVueの本番デプロイ
← Vue Academyに戻る