Angular6でマテリアルデザイン/ReduxアーキテクチャなSPAフロントエンドを作ってみた

前回前々回の引き続きでサンプルの空っぽのフロントエンドを動くように実装してみました。

何を作ったのか

こんな見た目のフロントエンドを作りました。*1

f:id:nihma:20181027171654g:plain

今回の記事のコードとgitのタグです。

使い方

dockerを使ってローカル環境で実行する方法とAWSで動かす方法があります。

docker環境で動かす

まずリポジトリをcloneします。

$ git clone -b v0.0.1 https://github.com/nihemak/aws-sls-spa-sample-web.git sample-spa-web
$ cd sample-spa-web

そしてdocker環境のビルドを行います。

$ npm run docker-build

単体で動かす方法とaws-sls-spa-sample-apiを使う方法があります。

単体で動かす方法

まず、docker環境でng serveを実行します。

$ npm run docker-up
$ npm run docker-serve

するとブラウザからアクセスできるようになります。

http://localhost:4200/

aws-sls-spa-sample-apiを使う方法

まず、aws-sls-spa-sample-apiをDocker環境で起動します。

前回の「docker環境で動かす」の通りです。ここのgit cloneするタグを今回のタグに変えます。

そして、docker-compose.ymlに定義した環境変数API_BASE_URLaws-sls-spa-sample-apiのURL('http://localhost:3000')に変更します。

$ git diff dockers/docker-compose.yml
   angular:
     build: ./angular
     tty: true
     ports:
       - 4200:4200
     environment:
-      API_BASE_URL: 'mock-server'
+      API_BASE_URL: 'http://localhost:3000'
     volumes:
       - ../:/src/

あとは単体で動かす方法と同じです。

$ npm run docker-up
$ npm run docker-serve

これでブラウザからアクセスできます。

http://localhost:4200/

AWS環境で動かす

前々回の「使い方」の通りです。ここのgit cloneするタグを今回のタグに変えます。タグを変える箇所は前回の「AWS環境で動かす」の通りです。

実装

具体的な実装はこちらです。

github.com

マテリアルデザイン

マテリアルデザインGoogleが提唱しているデザインの考え方です。

material.io

saruwakakun.com

今回は@angular/materialを使いました。ライブラリで用意してあるコンポーネントを組み合わせるだけでマテリアルデザインになります。

Angular Material

そして、@angular/flex-layoutを使ってFlexboxでレイアウトしました。

CSS Flexible Box Layout Module Level 1 (日本語訳)

github.com

対応したコード差分は下記あたりです。

Change to Material Design with @angular/material and @angular/flex-layout by nihemak · Pull Request #11 · nihemak/aws-sls-spa-sample-web · GitHub

Reduxアーキテクチャ

今回は@ngrxを使いました。*2

qiita.com

www.slideshare.net

対応したコード差分は下記あたりです。

Change to Redux Architecture with NgRx by nihemak · Pull Request #7 · nihemak/aws-sls-spa-sample-web · GitHub

Http Client / モックAPI

今回はフロントエンド単独でも動作できるようにしたかったのでAPIモックのためにin-memory-web-apiを使いました。

Angularチュートリアル - HTTP

neos21.hatenablog.com

neos21.hatenablog.com

そして、通信先のAPIをモックにするかHTTPにするかの切り替えは環境変数API_BASE_URL'mock-server'を指定するか否かをAppModuleで判断して行うようにしました。

ただ、Angularにはng buildng serveのタイミングで環境変数から値を取得する標準的な仕組みはありませんでした。そのため、pre_build.shというbashを用意してnpm scriptng buildng serveの直前に環境変数からsrc/app/environments/environment.tsを動的に生成するようにしました。*3

対応したコード差分は下記あたりです。

Use HttpClient with angular-in-memory-web-api by nihemak · Pull Request #8 · nihemak/aws-sls-spa-sample-web · GitHub

Move api url to environment variable by nihemak · Pull Request #9 · nihemak/aws-sls-spa-sample-web · GitHub

まとめ

今回はAngular6でお手軽にマテリアルデザイン/ReduxアーキテクチャなTodoリストのフロントエンドのサンプルを実装してみました。Angularはフルスタックなライブラリですので用意された機能の組み合わせだけでもそれらしいフロントエンドができました。

心残りはたくさんあります。

  • バリデーションがない
  • エラー処理がない
  • テストがない
  • etcetc

気が向いたら対応するかもしれません。

*1:レイアウトの調整などはほとんどしてません

*2:現時点で対応してなかったのでAngular7にはできませんでした

*3:あまり良い方法ではないと思いますが