5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

HUITAdvent Calendar 2018

Day 8

[Windows対応]Next.js+Firebase Hostingでサーバーサイドレンダリング

Last updated at Posted at 2018-12-07

はじめに

この記事は、HUITアドベントカレンダー2018 8日目の記事です。

この記事について

Next.jsとFirebaseを用いて、サーバーサイドレンダリング(SSR)を行うWebサイトをデプロイするまでのチュートリアルです。

主にReact+Firebaseでの開発経験のある方をターゲットとしています。
事前にNext.js公式チュートリアルのUsing Shared Componentあたりまで学んでおくと良いと思いますが、この記事で扱う範囲ではやらなくても問題ありません。
なにしろコードは一切書きません

なお、僕自身はReact歴4カ月程度の雑魚です。

なぜNext.js?

Next.jsは、Reactでサーバーサイドレンダリング(SSR)を行うことのできるフレームワークです。Vue.jsでいうところのNuxt.jsに近い立ち位置だと思います。(名前もよく似ています)
SSRはReactのようなjsだけで動くページを、事前にサーバー側でhtmlとして生成しておく手法です。主に以下の恩恵が得られます。

  • 初回読み込みの高速化
  • 動的に生成されるページのOGP対策
  • 動的に生成されるページのSEO対策

どれもReact単体では実現できませんので、NextはReactの書き方でこれらを実現したい方にオススメです。

Next.jsプロジェクトを作成する

さっそくNextプロジェクトを作っていきます。ありがたいことに、Next公式でFirebase Hostingと連携するサンプルが用意されています。
これをクローンして使うのが最も手っ取り早いです。

サンプルのクローン

以下のコマンドでnext.jsリポジトリを丸々クローンしましょう。

$ git clone https://github.com/zeit/next.js.git

その後、examplesフォルダ内のwith-firebase-hostingフォルダのみを抜き出します。残りは不要なので削除してしまいましょう。
with-firebase-authentication、 with-firebase-hosting-and-typescriptといった似たような名前のサンプルがあるので注意してください。

firebaseプロジェクトのセットアップ

クローンが完了したら、README内のSet up firebaseに従い、Firebaseプロジェクトを用意します。
firebase consoleにアクセスし、新しいプロジェクトを作成しましょう。
プロジェクトを作成した後は、クローンしたフォルダ内の.firebasercファイルに、以下のようにfirebaseプロジェクトidを書き込みます。

.firebaserc
{
  "projects": {
    "default": "<firebaseプロジェクトid>"
  }
}

firebaseの設定ファイルが既に存在しているため、firebase initをする必要はありません。

ここまで終わったら、最後にwith-firebase-hostingフォルダ内で

$ npm i

します。

デバッグしてみる

セットアップが終わったので、READMEに従って以下のコマンドでデバッグしてみます。

$ npm run dev

Ready on http://localhost:3000と言われるはずなので、アクセスします。
以下のように表示されれば成功です。

dev.png

HomeページとAboutページを行ったり来たりできるはず。
問題ありませんね。

デプロイしてみる

以下のコマンドを実行してみます。

$ npm run deploy

以下のようなエラーが出てデプロイに失敗するはずです。
デプロイ前のビルド段階でエラーが起きています。

ReferenceError: Unknown option: .caller. Check out http://babeljs.io/docs/usage/options/ for more information about options.

babel/coreがインストールされていないのが問題です。
また、デプロイを成功させるためにはfirebase-toolsを最新にしておく必要もあります。
以下のコマンドを実行して各種モジュールをインストールし直します。

$ npm un @babel/cli firebase-tools
$ npm i --save @babel/core 
$ npm i --save-dev @babel/core @babel/cli firebase-tools

完了したら、再度以下のコマンドを実行します。

$ npm run deploy

Deploy complete!と表示されたらOKです。
さっそくデプロイ先のURLにアクセスしてみましょう。
以下のように、デバッグ時と同じ画面が表示されれば成功です。

deploy.png

なおWindowsでデプロイした場合、Internal Server Errorとだけ表示されるはずです。
この問題は次の項目で解決していきます。

Windowsユーザー以外の方はお疲れさまでした。

(Windows環境)デプロイしたページでInternal Server Errorと表示される

Windows環境でない方は読み飛ばしてOKです。

さて、エラーの原因をたどってみると、firebase cloud functions側のログにCannot find module ...と出力されているのがわかります。
このエラーはwindows環境でビルドした際に、パスの区切り文字が「/」ではなく「\」として出力されることが原因です。
windowsはデフォルトの区切り文字が「\」なので、これがビルド時に使用されるわけです。厄介ですね。
これは、ビルド後にすべてのファイルに含まれる「\」を「/」に置換することで解決できます。
まず、以下のコマンドでreplace-in-fileモジュールをインストールします。

$ npm i -g replace-in-file

その後、nextプロジェクト内のpackage.jsonにおいて、predeployを以下のように書き換えます。

package.json
<省略>
"scripts": {
  <省略>
    "predeploy": "npm run build-public && npm run build-funcs && npm run build-app && npm run copy-deps && replace-in-file /\\\\\\\\/g / dist/functions/next/server/**/**.json --isRegex",
  <省略>
  }
<省略>

再度デプロイすると成功するはずです。
お疲れさまでした。

さいごに

ここから先は自分の好きなようにReactコンポーネントを実装していくだけです。
Nextの書き方に慣れていない方はまず公式チュートリアルに取り掛かるとよいと思います。特にPagesでのルーティング方法、initialPropsの使い方はぜひ覚えておきたいですね。
ルーティングをきれいにしたいときはnext-routesモジュールをインストールするのもオススメです。
Firebase Hostingでのnext-routesの使い方や、OGP対応のSNSでurlプレビューする方法について、気が向いたら記事にするかもしれません。
それでは!

続きあります↓
Next.js+Firebase HostingにMaterial-UIを導入する

参考

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?