😺
Create React Appで作成したReactアプリをGoogle App Engineにデプロイする際の設定
Create React Appで作成したReactアプリをGAEにデプロイする際に、少し設定ファイルの工夫が必要だったので共有します。
ざっくりした手順
-
yarn run build
やnpm run build
でリリースビルドを作成 -
app.yaml
でデプロイ時の設定を指定 -
gcloud app deploy
でGAEにデプロイ
通常これらはCI上で行われるべきものですが、手元の開発環境でも実行できます。
(今回、手順3.の詳細は説明しません)
yarn build
でリリースビルドを作成
Create React Appで作成したReactアプリでは、build
コマンドを実行することで、簡単にリリースビルドを作成することができます。
リリースビルドの成果物はだいたい以下のような構造になっています。
build
├ static
└ js
├ ~~~~.js
├ ...
└ ~~~~.js
├ asset-manifest.json
├ favicon.ico
├ manifest.json
├ ...
└ service-worker.js
css
がある場合はstatic
の下にcss
ディレクトリができるかもしれません(未確認)
app.yaml
でデプロイ時の設定を指定
URLとリリースビルドの成果物のマッピングを行うため、handlers
の設定が必要です。
設定ファイルを以下のようになります。
runtime: nodejs10
instance_class: F1
automatic_scaling:
max_instances: 1
min_instances: 1
default_expiration: '30d'
handlers:
- url: /static
static_dir: build/static
- url: /(.*\.(json|ico|js))$
static_files: build/\1
upload: build/.*\.(json|ico|js)$
- url: .*
static_files: build/index.html
upload: build/index.html
expiration: '0s'
handlers
の設定では、
-
/static
にはリリースビルド成果物のbuild/static
マッピング -
/(.*\.(json|ico|js))$
にはリリースビルド成果物のbuild/.*\.(json|ico|js)$
をマッピング- 正規表現を使っています(ここでは拡張子がjson, ico, jsのいずれかのファイルのみアップロードしてマッピングしています)
- 上記以外のURLには、
build/index.html
をマッピングします- この設定がないと、アドレスバーから直接特定の子ページに移動する際、404エラーが発生する場合があります
なお、お試し用なので、マシンタイプをF1
に、インスタンスをオートスケールしないように設定しています。
それがこの部分です。
instance_class: F1
automatic_scaling:
max_instances: 1
min_instances: 1
:warning: 追記: キャッシュについて :warning:
default_expiration
オプションですべてのファイルのブラウザキャッシュを有効に設定してしまうと、404エラーが発生し、真っ白の画面が表示されることがあります。(なお、default_expiration
が指定されていない場合でも、デフォルトでキャッシュ期間が10分に設定されます)
Create React Appのドキュメントによると、build/index.html
はキャッシュしないようにする必要があるので、明示的にexpiration
オプションに'0s'
を指定して、キャッシュを無効にします。
gcloud app deploy
でGAEにデプロイ
後は、以下のコマンドを叩けば手元のbuildディレクトリ以下のファイルがGAEにデプロイされます。
gcloud app deploy
Discussion