Express 5 vs Fastify 比較

Nodeエコシステムのデファクトスタンダード:柔軟で成熟した、巨大なミドルウェアの宝庫

VS
Fastify

スキーマベースでパフォーマンス重視:すべてのルートが一つの契約

10 分で読了Backend

クイック結論

Fastifyの公式ベンチマーク(「illustrative(参考値)」との注記付き)はスループットで1.6倍、レイテンシで1.7倍優れており、スキーマベースのシリアライズと公式OpenAPIプラグインに支えられている。Express 5の強みは非同期ハンドラーの自動エラーキャッチだ。GitHubではExpressが大きくリードしている(69,478対37,195スター)。新規かつパフォーマンス重視のサービスならFastify、既存のExpressコードベース+慣れたチームがあるならExpress 5を継続 — 公式の移行ツールは存在しない。

Express 5Fastify
結論をすべて読む

スコア比較

グラフを読み込み中...

詳細スコア

詳細スコア: Express 5 と Fastify — カテゴリー別10点満点のスコア
カテゴリーExpress 5Fastify
パフォーマンス
6/10
9/10
学習のしやすさ
9/10
7/10
エコシステム
9/10
7/10
コミュニティ
10/10
7/10
求人市場
8/10
6/10
将来性
7/10
8/10

長所と短所

Express 5

長所

  • 巨大なミドルウェアエコシステム — ほぼあらゆるニーズに対応する既製パッケージが揃っている
  • Express 5では非同期ルートハンドラーのエラーを自動的にキャッチする(Express 4からの大きな改善)
  • GitHubで69,478のスター、豊富な学習リソースがあり、新しい開発者にとって参入障壁が低い
  • 柔軟なアーキテクチャ:フレームワークが特定の構造を強制しないため、好きなように構築できる
  • 公式の4→5移行codemodにより、フレームワーク内のバージョン移行が自動化されている
  • OpenJS Foundationの傘下で、2010年以来の息の長いメンテナンス実績がある

短所

  • スキーマバリデーションとOpenAPI生成はフレームワーク内蔵ではなく、サードパーティ製パッケージが必須
  • ミドルウェアの分離(カプセル化)がない — すべてがグローバルスタックに追加される
  • 公式ベンチマークではFastifyに対してスループットとレイテンシで劣る
  • 公式パッケージにTypeScriptの型定義は含まれておらず、@types/expressはコミュニティメンテナンスの別パッケージ
  • デフォルトのロガーがない — 公式ドキュメントはPinoを推奨しているが、セットアップは自分で行う必要がある

最適な用途

チームがすでにExpressに精通しているプロジェクト幅広い種類のミドルウェアを必要とするアプリケーション迅速なプロトタイピングとMVP開発既存の大規模なExpressコードベースの保守豊富な学習リソースが重要となるチーム

Fastify

長所

  • 公式ベンチマークでスループット1.6倍、レイテンシ1.7倍の優位性(fastify.dev/benchmarks、2026年9月2日)
  • fast-json-stringifyによるスキーマコンパイル済みの高パフォーマンスJSONシリアライズ
  • encapsulation contextにより、プラグイン/ミドルウェアの分離がアーキテクチャレベルで保証されている
  • @fastify/swaggerによりルートスキーマからOpenAPI v2/v3を自動生成
  • pinoベースの構造化ロギングがフレームワークに組み込まれている(logger: true)
  • 公式の型定義(fastify.d.ts)がパッケージに同梱されている
  • Ajv v8による高性能なJSON Schemaベースのリクエストバリデーション

短所

  • GitHubのスター/フォーク数ではExpressに劣る(37,195 対 69,478)、学習リソースの層も薄い
  • 公式ドキュメントによれば、一部のTypeScript APIには誤った型付けがある可能性がある
  • v5はNode.js v20以上を必須としている — 古いプロジェクトではまずNodeのアップグレードが必要
  • v5では完全なJSON Schemaが必須となり(省略記法が廃止された)、移行時の摩擦を生む
  • Expressからの公式な移行ツールはない — 移行はフレームワークの乗り換えを意味する

最適な用途

パフォーマンスが重要で、高RPSを目指す新規サービスAPI-firstで、最初からスキーマ/OpenAPI契約が求められるプロジェクト複数チームが関わる、成長中のmonorepo APIでアーキテクチャ的な分離を求める場合pinoベースの構造化ロギング基盤を持つチームNode.js v20以上で動く新規のグリーンフィールドプロジェクト

コード比較

Express 5
// Express 5 - 非同期ルートハンドラー + 自動エラーキャッチ
import express from 'express';

const app = express();
app.use(express.json());

// シンプルなエラークラス — APIの境界で意味のあるメッセージを返すため
class NotFoundError extends Error {
  status = 404;
}

async function getUser(id) {
  const user = await db.users.findById(id);
  if (!user) throw new NotFoundError('User not found');
  return user;
}

// Express 5: 非同期ハンドラーがreject/throwすると、next(err)が自動的に呼ばれる。
// Promiseをreturnし忘れないこと — さもないとrejectionがunhandledのままになる可能性がある。
app.get('/api/users/:id', async (req, res) => {
  const user = await getUser(req.params.id);
  res.json(user);
});

// 中央集権的なエラーミドルウェア — グローバルスタックの最後に追加される
app.use((err, req, res, next) => {
  const status = err.status ?? 500;
  res.status(status).json({ error: err.message });
});

app.listen(3000, () => {
  console.log('Express server listening on port 3000');
});
Fastify
// Fastify 5 - スキーマバリデーション + 自動シリアライズ
import Fastify from 'fastify';

const fastify = Fastify({ logger: true });

// レスポンススキーマ:fast-json-stringifyがこのスキーマから
// コンパイル済みのシリアライズ関数を生成する — 汎用的なJSON.stringifyより高速。
const userSchema = {
  type: 'object',
  properties: {
    id: { type: 'string' },
    name: { type: 'string' },
    email: { type: 'string' },
  },
  required: ['id', 'name', 'email'],
};

const getUserOpts = {
  schema: {
    params: {
      type: 'object',
      properties: { id: { type: 'string' } },
      required: ['id'],
    },
    response: {
      200: userSchema,
    },
  },
};

// Encapsulation:このプラグイン内で登録されたhook/decoratorは
// このcontext内のルートにのみ及ぶ。
fastify.register(async function userRoutes(instance) {
  instance.get('/api/users/:id', getUserOpts, async (request, reply) => {
    const user = await db.users.findById(request.params.id);
    if (!user) {
      return reply.code(404).send({ error: 'User not found' });
    }
    request.log.info({ userId: user.id }, 'user fetched');
    return user;
  });
});

fastify.setErrorHandler((error, request, reply) => {
  reply.status(error.statusCode ?? 500).send({ error: error.message });
});

await fastify.listen({ port: 3000 });

結論

Fastifyの公式ベンチマーク(「illustrative(参考値)」との注記付き)はスループットで1.6倍、レイテンシで1.7倍優れており、スキーマベースのシリアライズと公式OpenAPIプラグインに支えられている。Express 5の強みは非同期ハンドラーの自動エラーキャッチだ。GitHubではExpressが大きくリードしている(69,478対37,195スター)。新規かつパフォーマンス重視のサービスならFastify、既存のExpressコードベース+慣れたチームがあるならExpress 5を継続 — 公式の移行ツールは存在しない。

無料相談を受ける
FAQ

よくある質問

新規で、パフォーマンスとスキーマバリデーションが重要なサービスを構築するならFastify、既存のExpress資産と慣れたチームがあるならExpress 5。どちらも活発にメンテナンスされている — npmレジストリではexpress@latestが5.2.1、fastify@latestが5.12.5(Fastify v6はalpha段階だが安定版は依然5.x系)— つまり「Expressはもう終わった」という理由で判断してはいけない。サードパーティ製ミドルウェアを幅広く必要とする場合は、天秤はさらにExpress側に傾く。

関連ブログ記事

すべての記事を見る
すべての比較