初めてのRailsApiアプリの公開。Herokuにデプロイする準備と実際のデプロイまで
  • 2019.08.24に公開
  • 2019.10.03に更新
  • SPA開発
  • 4. RailsとNuxt.jsを共存させる
  • No.4 / 4
「SPA開発」では、Nuxt.js v2.14未満が使用されています。 Nuxt.jsはv2.13~14で大きなバージョンアップがありました。それに伴い、書き方も大きく変化しています。 v2.14以上で書かれた「SPA開発」の続編は、カテゴリー「 Udemy 」 で公開しています。

今回達成すること

アプリの公開のために、Herokuへデプロイのセッティングを行っていき、実際にデプロイを行います。

今まではNuxtプロジェクトを編集してきましたが、あくまでRailsプロジェクトとしてHerokuにデプロイします。

これでRailsApiアプリがインターネット上に公開されます。

この記事の読み方

ターミナル上のコマンドは、RailsとNuxtで以下のように分けます。

  • Railsプロジェクトに対するコマンド
myapp$ コマンド
  • Nuxtプロジェクトに対するコマンド
frontend$ コマンド

【Nuxt】本番環境のaxiosのセッティング

本番環境でaxiosが使えるように、http通信に使うURLを設定します。

nuxt.config.jsを開きましょう。

frontend/nuxt.config.js
{
  ...
  axios: {
    baseURL: process.env.BASE_URL	|| '/'	// 追記
  },
  ...
}
  • process.env.BASE_URL

    本番環境では、axiosのベースURLをHerokuの環境変数から読み込みます。

  • || '/'

    開発環境では@nuxtjs/proxyモジュールで正常に動くので、わざわざbaseURLを設定しなくても良いのですが、空白になってしまうと気持ち悪いのでルートパスを代入しています。

【Nuxt】ESLintを開発環境のみで利用する設定を行う

Nuxtプロジェクト作成時にESLintを導入すると、nuxt.config.jsdevModules'@nuxtjs/eslint-module'が記載されています。

今のままHerokuにデプロイすると、ビルド時にESLintなんでモジュールはないよ:rage:と激おこされます。

これはESLintモジュールが開発環境のみにインストールされているからです。

そこで、'@nuxtjs/eslint-module'を下記のように移動しましょう。

frontend/nuxt.config.js
{
	...
  devModules: [
   //  '@nuxtjs/eslint-module',  削除
    '@nuxtjs/vuetify'
  ],
  ...
}
  
if (process.env.NODE_ENV === 'development') {
  config.devModules.push('@nuxtjs/eslint-module')		// 追記
  // @nuxtjs/proxy module settings
  config.proxy = { '/api': 'http://localhost:3000' }
}

export default config

Herokuに環境変数をセットする

さて、Nuxtから離れましょう。

ターミナル上でRailsプロジェクトに移動してください。

HerokuにBASE_URLの環境変数をセットします。

URLはご自身のHerokuアプリのURLに書き換えてコマンドを実行してください。

myapp$ heroku config:set BASE_URL="https://spa-myapp8.herokuapp.com"

確認してみましょう。BASE_URLが出てこれば環境変数はセットされています。

myapp$ heroku config

BASE_URL: https://spa-myapp8.herokuapp.com
...

もし間違えても、環境変数名が同じ場合は上書きされますので安心して実行してください。

【Rails】デプロイ前のNuxtビルド設定を行う

ビルドとは、JSファイルとCSSファイルをプロダクション向けに縮小することです。

今のままHerokuにデプロイしても、Nuxtアプリのビルドは行われず、Railsのpublicディレクトリに入っている静的ファイルのみしか表示されません。

これを解決するために、Rails側package.jsonファイルを作成し、Herokuデプロイ時にNuxtアプリをビルドする設定を行っていきます。

Railsのルートディレクトリ直下(Gemfileと同じ階層)にpackage.jsonファイルを作成してください。

package.json
{
  "license": "UNLICENSED",
  "engines": {
    "node": "12.7.0",
    "yarn": "1.17.3"
  },
  "scripts": {
    "postinstall": "cd frontend && yarn install && yarn build"
  }
}

コードのポイント

  • license

    特段必要ありませんが、念のため使用ライセンスは許可しない。と設定しています。

  • nodeとyarnのバージョン

    開発環境と一致させておいたほうが良いでしょう。

    下記のコマンドで開発環境のバージョンを調べられます。

$ node -v		v12.7.0
$ yarn -v		1.17.3
  • postinstall

    Herokuデプロイ時のパッケージインストール完了後に呼び出されます。

    cdコマンドでfrontendディレクトリに移動し、yarn install && yarn buildを実行してね。と設定しています。

参考

package.json - Yarn

Herokuにビルドパックを追加する

ビルドパックとは、アプリケーションを動かすフレームワークのこと?です。

ちょっと上手く説明できません。Herokuに委託します。ごめんなさい。

Heroku ビルドパック

RailsプロジェクトをHerokuにデプロイ済みなので、今現状はビルドパックとして自動的にRubyがインストールされています。

ここに、Nuxtを動かすNode.jsを追加します。

myapp$ heroku buildpacks:add --index 1 heroku/nodejs

...
1. heroku/nodejs
2. heroku/ruby
  • --index

    buildpacks:addのコマンドオプションです。Nodeを先に実行してNuxtのファイル群をRailsで表示する必要があるため、Rubyより前の「1」としています。

    ↓の説明まま。

    Using Multiple Buildpacks for an App | Heroku Dev Center

コミットしとく

さてここまでの編集をコミットしましょう。

Railsプロジェクト上でコミットしますのでお間違えのないように。

myapp$ git add -A
myapp$ git commit -m "heroku_deploy_settings"

マージしてHerokuにデプロイしよう

ブランチを作っている方は、マスターブランチにこれまでの変更を合算(マージ)しましょう。

myapp$ git checkout master
myapp$ git merge nuxt_new_project (←ブランチ名が違う場合は読み替えてください)
myapp$ git push
myapp$ git push heroku

Herokuデプロイのログに、ちゃんとビルドが表示されていれば上手くいっています。

...
remote:        $ nuxt build
remote:        ℹ Production build
remote:        ✔ Builder initialized
remote:        ✔ Nuxt files generated
remote:        ℹ Compiling Client
remote:        ✔ Client: Compiled successfully in 38.94s
...

Heroku上でちゃんと動いているか、ブラウザで確認してみてください。

myapp$ heroku open

OK!これにて完了です。

参考

「Auth0」で作る!認証付きシングルページアプリケーション

この本はユーザー認証まで作れておすすめです。

本屋はどうしても初心者向けの本が多いため、このような実践的な技術書は貴重です。

僕も挑戦しましたが「Auth0」のカスタマイズに苦戦したため、今回のアプリでは一からユーザーログイン機能を作ります。そのお話はもう少し先で。

ちょっと情報が古いところ

この本では、cross-envモジュールを使って環境変数のNODE_ENVを埋め込んでいました。

Nuxt.2.8ではprocess.env.NODE_ENVの中に、デフォルトで'development'の文字列が入っているため、cross-envはインストールしていません。

また、yarn buildを実行すると'production'の文字列に切り替わります。

試しにnuxt.config.jsconsole.log(process.env.NODE_ENV)と記入してyarn buildを実行してみてください。

ターミナル上に'production'の文字列が表示されるはずです。

終わりに

これで、初めてのRails apiアプリをインターネット上に公開することができました。

以上でチャプター「RailsとNuxtを共存させる」を終わります。

次回からは、データベース設計とRailsモデル開発を行っていきます。

それではまた。

あなたの力になれること
私自身が独学でプログラミングを勉強してきたので、一人で学び続ける苦しみは痛いほど分かります。そこで、当時の私がこんなのあったら良いのにな、と思っていたサービスを立ち上げました。周りに質問できる人がいない、答えの調べ方が分からない、ここを聞きたいだけなのにスクールは高額すぎる。そんな方に向けた単発・短期間メンターサービスを行っています。
独学プログラマのサービス
SPA開発の投稿
1
  • 更新情報
  • /
  • #01
「Rails apiとNuxt.jsでSPA開発」のデモアプリを開発中...。【2020/05/19追記: このカテゴリーの更新を一旦終了といたします】
1
  • 今回作るアプリケーション
  • /
  • #01
Railsアプリの完成イメージ画像と作ろうと思った経緯
2
  • 今回作るアプリケーション
  • /
  • #02
今回作るRailsアプリの全体像と機能の整理
1
  • 開発環境を整える
  • /
  • #01
macにRailsをゼロからインストールする
2
  • 開発環境を整える
  • /
  • #02
Rails apiモードのプロジェクトを作成し、Gitにコミットする
3
  • 開発環境を整える
  • /
  • #03
Bitbucketに公開鍵を追加し、Railsプロジェクトをpushする
4
  • 開発環境を整える
  • /
  • #04
HerokuCLIのインストールとherokuアプリケーションの作成
1
  • RailsをHerokuにデプロイする
  • /
  • #01
Herokuのデータベース設定と開発に便利なgemを導入する
2
  • RailsをHerokuにデプロイする
  • /
  • #02
HerokuにPumaを導入するためのRailsセットアップ
3
  • RailsをHerokuにデプロイする
  • /
  • #03
Railsに"Hello"を表示してHerokuへデプロイする
1
  • RailsとNuxt.jsを共存させる
  • /
  • #01
【RailsとNuxt.jsの共存】Rails上にNuxt.jsのプロジェクトを構築しよう
2
  • RailsとNuxt.jsを共存させる
  • /
  • #02
Nuxt.jsからRailsへ、初めてのapi通信でHelloを表示しよう
3
  • RailsとNuxt.jsを共存させる
  • /
  • #03
Nuxt.jsにVuetify2.0を導入してFont Awesomeもインストールするぜ
4
  • RailsとNuxt.jsを共存させる
  • /
  • #04
初めてのRailsApiアプリの公開。Herokuにデプロイする準備と実際のデプロイまで
1
  • データベース設計
  • /
  • #01
データベースを正規化する前に、会計システムの勘定科目データを整理する
2
  • データベース設計
  • /
  • #02
会計システムのデータベース設計に挑む
1
  • バージョンアップ情報
  • /
  • #01
【ご報告】Nuxt.jsを2.10.2にバージョンアップしました
2
  • バージョンアップ情報
  • /
  • #02
【ご報告】Railsを6.0.0にバージョンアップしました
1
  • Userモデル開発
  • /
  • #01
本番環境と開発環境でRailsのSeedデータを切り替える
2
  • Userモデル開発
  • /
  • #02
Railsにユーザーテーブルを作成する【テーブル確認コマンド】
3
  • Userモデル開発
  • /
  • #03
【Rails】EachValidatorクラスを使ったEmailカスタムバリデーション【lib以下読み込み】
4
  • Userモデル開発
  • /
  • #04
【Rails】エラーメッセージの日本語化【i18nとja.ymlのセッティング】
5
  • Userモデル開発
  • /
  • #05
【Rails】開発・テスト・本番環境の全てにユーザーSeedデータ投入する
6
  • Userモデル開発
  • /
  • #06
【Rails】ユーザーモデルのバリデーションをテストする
1
  • ログイン周りのレイアウト設計
  • /
  • #01
【Nuxt.js】ログインフラグでレイアウトを切り替えるテクニック【2019/12/07追記あり】
2
  • ログイン周りのレイアウト設計
  • /
  • #02
【Nuxt.js】ウェルカムページのレイアウト構築【sassの導入】
3
  • ログイン周りのレイアウト設計
  • /
  • #03
【Nuxt.js】ログイン周りの入力フォームコンポーネント設計【2019/12/07追記あり】
4
  • ログイン周りのレイアウト設計
  • /
  • #04
【Nuxt.js】会員登録フォームを構築してサインアップページを完成させる
独学プログラマ
独学でも、ここまでできるってよ。
CONTACT
Nuxt.js制作のご依頼は下記メールアドレスまでお送りください。