コンテンツにスキップ
ブログに戻る

2020年11月18日(水)

Next.js の段階的採用

投稿者

Next.js は段階的な導入のために設計されています。Next.js を使用すると、既存のコードを引き続き利用し、必要に応じて React を追加(または削除)することができます。小さく始めて、徐々にページを増やしていくことで、全面的な書き換えを回避し、機能開発の遅延を防ぐことができます。

多くの企業は、コスト削減、開発者の生産性向上、顧客への最高の体験提供のために、技術スタックを最新化する必要があります。コンポーネント駆動開発は、最新のコードベースのデプロイ速度と再利用性を大幅に向上させました。

そして、月間800万ダウンロード以上 の React は、開発者にとって主要なコンポーネント駆動の選択肢です。本番環境向けの React フレームワークである Next.js は、React を段階的に導入することを可能にします。

動機

ますますモバイル化が進む世界では、Core Web Vitals の改善と追跡が成功の鍵となります。顧客は世界中に分散し、インターネット速度も様々である可能性が高いです。ページの読み込みやアクションの完了を待つ時間(ミリ秒単位)が、セール、インプレッション、コンバージョンを分ける差となる可能性があります。

技術スタックを近代化している場合、次のような課題に直面するかもしれません。

  • アプリケーションには、長年のレガシーコードがあり、理解が難しく、書き換えには数年(数百万ドル)かかるでしょう。
  • アプリケーションのサイズと複雑さが増すにつれて、ページ読み込み時間が長くなり続けています。シンプルなマーケティングページも、最も複雑なページと同じくらい遅いです。
  • 開発チームをスケールアップしようとしていますが、既存のコードベースにさらに多くの開発者を追加するのに苦労しています。
  • 古い CI/CD および DevOps プロセスがあり、開発者の生産性を低下させ、新しい変更を安全かつ確実にロールアウトすることを困難にしています。
  • アプリケーションがモバイルデバイスに対応しておらず、アプリケーションの他の部分を壊さずにグローバルなページスタイリングを更新することが不可能です。

何らかの対応が必要だとわかっていても、どこから始めるべきか を理解するのは圧倒されることがあります。Next.js を段階的に導入することで、上記の問題を解決し、アプリケーションを変換し始めることができます。既存の技術スタックに Next.js を導入するための、いくつかの異なる戦略について説明します。

戦略

サブパス

最初のアプローチは、特定のサブパス以下のすべてのものが Next.js アプリケーションを指すように、サーバーまたはプロキシを設定することです。たとえば、既存のウェブサイトが example.com にある場合、プロキシを設定して example.com/store が Next.js の e コマースストアを提供するようにすることができます。

basePath を使用すると、Next.js アプリケーションのアセットとリンクが新しいサブパス /store で自動的に機能するように構成できます。Next.js の各ページは独自のスタンドアロンルートであるため、pages/products.js のようなページは、アプリケーション内の example.com/store/products にルーティングされます。

next.config.js
module.exports = {
  basePath: '/store',
};

basePath についての詳細は、ドキュメントをご覧ください。

(注意: この機能は Next.js 9.5 以降で導入されました。古いバージョンの Next.js を使用している場合は、試す前にアップグレードしてください。

リライト

2番目のアプローチは、ドメインのルート URL を指す新しい Next.js アプリケーションを作成することです。その後、next.config.js 内のrewrites を使用して、一部のサブパスを既存のアプリケーションにプロキシすることができます。

たとえば、example.com から提供される Next.js アプリケーションを、以下の next.config.js で作成したとします。この Next.js アプリケーションに追加したページ(例: pages/about.js/about を追加した場合)へのリクエストは Next.js によって処理され、他のルート(例: /dashboard)へのリクエストは proxy.example.com にプロキシされます。

next.config.js
module.exports = {
  async rewrites() {
    return [
      // we need to define a no-op rewrite to trigger checking
      // all pages/static files before we attempt proxying
      {
        source: '/:path*',
        destination: '/:path*',
      },
      {
        source: '/:path*',
        destination: `https://proxy.example.com/:path*`,
      },
    ];
  },
};

リライトについての詳細は、ドキュメントをご覧ください。

モノレポとサブドメインでのマイクロフロントエンド

Next.js と Vercel は、マイクロフロントエンド の導入と モノレポ としてのデプロイを容易にします。これにより、サブドメイン を使用して新しいアプリケーションを段階的に導入できます。マイクロフロントエンドの利点の一部は次のとおりです。

  • より小さく、よりまとまりがあり、保守しやすいコードベース。
  • 分離された自律的なチームによる、よりスケーラブルな組織。
  • フロントエンドの一部を、より段階的にアップグレード、更新、または書き換える能力。

Vercel にデプロイされたモノレポのアーキテクチャ。

モノレポのセットアップが完了したら、通常どおり Git リポジトリに変更をプッシュするだけで、接続した Vercel プロジェクトにコミットがデプロイされます。古い CI/CD プロセスにさよならを。

Git Integration によって提供されるデプロイメント URL の例。

結論

Next.js は、既存の技術スタックへの段階的な導入のために設計されました。Vercel プラットフォームは、GitHub、GitLab、Bitbucket とのシームレスな統合により、すべてのコード変更に対するデプロイプレビューを提供し、共同作業の体験を向上させます。

  • Fast Refresh でローカルでの変更を即座にプレビューし、開発者の生産性を向上させます。
  • PR をマージして、ブランチプレビュー にデプロイし、関係者との共同作業に最適化します。
  • PR をマージして、Vercel に本番環境へデプロイします。複雑な DevOps は不要です。

詳細については、サブパスリライトについて読むか、マイクロフロントエンドの例をデプロイ してください。