静的ファイルを生成してWebサーバーで公開する
Nuxt.jsでは、WebサーバーにNode.jsを必要としない静的ファイルを生成できます。まず、Nuxt.jsの設定ファイルnuxt.config.jsで、生成ターゲットをstaticに設定します。
export default { (略) // 静的ファイルを生成する設定 target: 'static' }
次にコマンドラインで「npm run generate」コマンドを実行すると、静的ファイルが生成されて、プロジェクトのdistフォルダーに配置されます。サンプルのページコンポーネントはトップページと(全メーカー共通の)詳細ページの2個しかありませんでしたが、静的ファイルの生成処理では図4の通り、トップページとApple、Google、Sumsungの各メーカーに対応する詳細ページのHTMLが生成されます。
サンプルコードには、生成されたdistフォルダーをWebサーバーで表示する、p002-static-generatedプロジェクトを含んでいます。プロジェクトのフォルダーで「npm install」を実行してライブラリーをダウンロード後、「npm run start」コマンドで実行して、Webブラウザーで「http://localhost:8080/」を開くと、図1と同じ内容のWebページが表示されます。静的ファイルではサーバーサイドレンダリングが機能しないため、JavaScriptを無効にするとページ表示日時が更新されない(静的ファイルを生成した日時になる)ことが確認できます。
サーバーサイドでNode.jsが利用できるHerokuにWebページを公開
Herokuは、Webサーバーを意識せずにWebページをインターネット上に公開できるPaaS(Platform as a Service)です。HerokuはサーバーサイドでNode.jsを動作できるため、Nuxt.jsで作成したWebページをそのまま公開できます。
以下では、Herokuのアカウントは取得済みで、Herokuのコマンドラインツール「Heroku CLI」をインストールし、CLIでアカウントにログイン済みの状態を想定します。HerokuおよびHeroku CLIの基本的な利用方法は、公式ドキュメントを参照してください。
まず、HerokuのWebページで新規アプリを作成します。任意のアプリ名(例えば「p003-heroku」)を入力し、リージョンは「United States」と「Europe」から選択します。
HerokuにアップロードするNuxt.jsのプロジェクトは、Gitリポジトリで管理されている状態にします。Gitリポジトリを設定していない場合、プロジェクトのフォルダーでリスト3のコマンドを実行して設定します。(1)でリポジトリを初期化、(2)でソースコードをリポジトリに追加して、(3)でコミットします。「Initial commit」はコミットメッセージです。
git init #...(1) git add --all #...(2) git commit -m 'Initial commit' #...(3)
Nuxt.jsのプロジェクトに、Procfileというファイルを追加して、リスト4の通りHerokuの動作を記述します。「web」はWebページを公開する際に実行するコマンドを表し、ここでは「nuxt start」コマンドでNuxt.jsのWebページを表示するよう設定します。
web: nuxt start
Nuxt.jsのプロジェクトフォルダーでリスト5のコマンドを入力して、Nuxt.jsのGitリポジトリに、Herokuのアプリをリモートリポジトリとして関連付けます。
heroku git:remote --app <アプリ名>
リスト6のコマンドで、Herokuのアプリに対して設定を適用します。(1)はインターネットから通信を受け付けるための設定で、(2)は、開発環境ではなく、本番環境で実行する設定です。
heroku config:set HOST=0.0.0.0 #...(1) heroku config:set NODE_ENV=production #...(2)
リスト7のコマンドでHerokuにNuxt.jsプロジェクトを反映させます。この操作は、Gitのリポジトリ(masterブランチ)を、リモートブランチherokuにプッシュする操作です。
git push heroku master
HerokuアプリのURL(「https://<アプリ名>.herokuapp.com/」)にアクセスすると、図1と同じ内容のWebページが表示されます。サーバーサイドレンダリングも機能するので、ブラウザーのJavaScriptを無効にしても、図7の通りページ表示日時が都度更新されます(日時がGMTで表示されていることに注意してください)。