CodeZine(コードジン)

特集ページ一覧

Next.jsのサーバーサイドレンダリングで、シングルページアプリケーションの課題を解消

基礎からはじめるReact入門 第14回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2018/11/09 14:00
目次

Next.jsとFirebase Cloud Functionsで体験する

 それでは、サーバーサイドレンダリングの実例を体験してみましょう。これまではcreate-react-appでサンプルを動かしてきましたが、前述の通り、サーバーサイドでも動かそうとした場合に相当の手間がかかるため、今回は別のツールを利用することにします。

 今回利用するのは、サーバーサイドレンダリングとの併用を前提に作られた、React向けWebフレームワークの「Next.js」です。これを、前回利用したFirebaseの機能の1つ、Node.jsサーバー「Firebase Cloud Functions」と組み合わせることで、サーバーサイドレンダリングを実現してみます。

Next.jsとは

 Next.jsはZeit社が開発している、React向けのWebアプリケーション開発フレームワークです。

 create-react-appと同じように、ローカル環境に開発サーバーを立てる機能や、JavaScriptコードをBabelで変換する機能を備えています。また、第5回で解説したReact Routerとはアプローチが異なるものの、History APIや画面遷移を管理する機能も備えています。

 また、サーバーサイドレンダリングを行うための、Node.jsで動くサーバーサイドアプリケーションも組み込まれており、Next.jsで作成されたシングルページアプリケーションを、サーバー側でも扱いやすくなっています。Next.jsを使うことで、環境づくりの面での難しさは、かなり軽減されると言っていいでしょう。

 プロジェクト構築のためのツールとして、create-next-appというコマンドラインツールも用意されているので、今回はこれを使って環境構築を行うことにします

Firebase Cloud Functionsとは

 サーバーサイドレンダリングともNext.jsとも関係ありませんが、今回のサンプルで使用するので、簡単に紹介します。Firebase Cloud FunctionsはFirebaseと統合されたNode.js環境です。Firebase上の多くのサービスと連携した、サーバーサイドアプリケーションを記述することができます。

 リスト5のようなコードを書いた場合は、リクエストに対して処理を行うAPIサーバーのように動作します。

[リスト5]Cloud Functionsの例
const functions = require('firebase-functions')

// appという名前の関数を定義する
exports.app = functions.https.onRequest((req, res) => {
  res.send("Hello from Firebase!");
});

 この場合は「app」という名前の関数を定義したので、 https://us-central1-MY_PROJECT.cloudfunctions.net/app のように「/app」のパスを持つURLにリクエストすることで、Cloud Functionsの関数を呼び出すことができます。設定次第では、Firebase HostingのURLへのアクセスをCloud Functionsに処理させることも可能です(後述します)。

create-next-appでアプリケーションを初期化する

 それでは、Next.jsとCloud Functionsを使って、サーバーサイドレンダリングを体験してみましょう。まずは前回と同様に、Firebaseプロジェクトを作成します。初期設定の内容は次の表の通りです。細かい手順は前回と同様なので省略します。

表:プロジェクトの設定内容
項目
プロジェクト名 my-first-react-ssr
プロジェクトID <自動生成に任せる>
アナリティクスの地域 日本
Cloud Firestoreのロケーション <変更しない>
Googleアナリティクスのデータ チェックを付ける
データ保護条項に同意 チェックを付ける

 これでひとまずFirebase側の設定は完了です。

 次に、開発プロジェクトを作成します。プロジェクトを作成したいディレクトリ内で、次のコマンドを実行してください。

$ npx create-next-app firebase-ssr --example with-firebase-hosting

 「firebase-ssr」がプロジェクト名、「--example with-firebase-hosting」が、Firehase Hosting(とCloud Functions)向けのテンプレートを適用するためのオプションです。

 筆者の環境では、このままではデプロイまでたどり着けませんでした。Babelでビルドを行うために必要な@babel/coreと、多様なブラウザで動くように文法の調整をする@babel/preset-envが足りていないので、次のコマンドでdevDependenciesを追加します。

$ npm install @babel/core @babel/preset-env --save-dev

 最後に、プロジェクトIDを設定します。すでにテンプレートに.firebasercやfirebase.jsonが含まれているため、今回はfirebase initコマンドを使わずに、手動で設定します。プロジェクトIDは、FirebaseのコンソールのURLに含まれています。

図4:FirebaseのプロジェクトID
図4:FirebaseのプロジェクトID

 筆者の例では「my-first-react-ssr」になっていますが、皆さんのお手元では違うIDになっているはずなので注意してください。自分のプロジェクトIDが分かったら、firebase-ssrプロジェクトの直下にある.firebasercを、リスト6のように書き換えます。

[リスト6]/firebase-ssr/.firebasercを書き換える
  {
    "projects": {
-     "default": "<project-name-here>"
+     "default": "my-first-react-ssr"
    }
  }

 ここでも、プロジェクトIDは「my-first-react-ssr」ではなく、自分のプロジェクトIDを入力しなければならないことに気を付けてください。

 これで、環境面の初期設定は完了しました。

まとめ

 サーバーサイドレンダリングの概要と、Next.jsを用いた環境構築について解説しました。

 次回はこのプロジェクトについての解説と、実際のデプロイの手順を解説します。また、Next.js自体について、あまり解説できなかったので、Next.jsについてももう少し見ていきましょう。



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:基礎からはじめるReact入門

もっと読む

著者プロフィール

  • WINGSプロジェクト 中川幸哉(ナカガワユキヤ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5