SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

基礎からはじめるReact入門

Next.jsのシングルページアプリケーションをデプロイして、基本をマスターする

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

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

 前回は、サーバーサイドレンダリングに対応した、プロジェクトのセットアップの方法を解説しました。最終回となる今回は、作成したプロジェクトをデプロイしてから、Next.jsの基本的な使い方について解説していきます。

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

対象読者

  • JavaScriptとWeb開発の基礎に理解がある方
  • Reactに興味/関心があり、これから学び始める方

前提環境

 筆者の検証環境は以下の通りです。

  • macOS High Sierra 10.13.3
  • Node.js v10.4.1/npm 6.1.0
  • React 16.5.1
  • firebase-tools 4.2.1
  • create-next-app 0.5.9
  • Next.js 6.1.2
  • Babel 7.0.0

前回作成したプロジェクトを眺めてみる

 前回はFirebase Hostingに対応した、Next.jsのプロジェクトを、firebase-ssrという名前で作成しました。

 今回はまず、できあがったfirebase-ssrディレクトリの中を見てみましょう。srcディレクトリの中が、少し込み入った構造になっています(図1)。

図1:srcディレクトリの中身
図1:srcディレクトリの中身

 src/app/ディレクトリの中がブラウザ向けのアプリケーションで、src/functions/ディレクトリの中がCloud Functions向けのアプリケーションになっています。それぞれの中を見てみましょう。

 まずはsrc/app/の中です。Next.jsの仕様で、src/app/pages/内に配置したJavaScriptファイルにURLが割り当てられて1画面を構成するので、今回はエントリーポイントとなるindex.jsを見てみます(リスト1)。

[リスト1]src/app/pages/index.js
import * as React from 'react'
import App from '../components/App'

export default () => (
  <App>
    <p>Index Page</p>
  </App>
)

 特に何の変哲もない、普通のReactアプリケーションのように見えます。Appコンポーネント側にヘッダーやリンクが配置されていますが、本記事では触れないことにします。

 さて、次はサーバー側です。src/functions/index.jsを見てみましょう(リスト2)。

[リスト2]src/functions/index.js
const functions = require('firebase-functions')
const next = require('next')

var dev = process.env.NODE_ENV !== 'production'
var app = next({ dev, conf: { distDir: 'next' } }) // (1)
var handle = app.getRequestHandler()

exports.next = functions.https.onRequest((req, res) => {
  return app.prepare().then(() => handle(req, res))
})

 少々込み入ってはいるものの、基本的な流れとしてはnext関数が呼び出された場合に、すべての処理をNext.jsに委譲する形になっています。(1)のdistDir: 'next'は、src/app/のブラウザアプリケーションをビルドしたものがfunctions/nextに出力されるので、それをサーバー側で読み込むための指定です。

デプロイしたアプリケーションでサーバーサイドレンダリングが動いていることを確認する

 それでは、実際にデプロイしてみましょう。すでにdevDependenciesにfirebase-toolsがインストールされていますし、それを扱うためのnpm scriptsも整備されています。また、前回すでにFirebaseのプロジェクトをセットアップしてありますので、次のコマンドを実行するだけで、デプロイができます。

$ npm run deploy

 すると、ブラウザ向けのビルドが行われてFirebase Hostingにデプロイされる処理と、サーバー向けのビルドが行われてFirebase Cloud Functionsにデプロイされる処理が、それぞれ実行されます(図2)。

図2:デプロイが完了する
図2:デプロイが完了する

 前回のFirebase Hostingと同様に、最後に表示されたURLにアクセスしてみます。筆者の環境で実施したものは次のURLにあります。

 開いてみると、図3のようになりました。

図3:デプロイされたアプリケーション
図3:デプロイされたアプリケーション

 これだけだと何の変哲もないReactアプリケーションですね。

 サーバーサイドレンダリングが行われていることを確認するために、Google ChromeのDev Toolsを開いてみます(図4)。

図4:Chrome Dev Toolsを開く
図4:Chrome Dev Toolsを開く

 Dev Toolsを開いたら、図5のようにNetworkタブを開いた状態で、ブラウザを再読み込みします。

図5:NetworkタブでHTMLのリクエストを見つける
図5:NetworkタブでHTMLのリクエストを見つける

 図5の「HTMLのリクエスト」の部分をクリックすると、リクエストとレスポンスの詳細が見られます。Responseタブが実際のレスポンスの内容です(図6)。

図6:レスポンスの内容を確認する
図6:レスポンスの内容を確認する

 すると、HTMLデータの中にReactアプリケーションのコンテンツが埋め込まれていることがわかります。サーバーサイドレンダリングが成功しています。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
Next.jsでの開発の進め方

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
基礎からはじめるReact入門連載記事一覧

もっと読む

この記事の著者

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

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/11232 2018/11/29 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング