前回、前々回の引き続きでサンプルの空っぽのフロントエンドを動くように実装してみました。
何を作ったのか
こんな見た目のフロントエンドを作りました。*1
今回の記事のコードとgitのタグです。
- aws-sls-spa-sample-web:タグ
v0.0.1
- aws-sls-spa-sample-api:タグ
v0.0.2
- aws-sls-spa-sample-terraform:タグ
v0.0.2
使い方
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
するとブラウザからアクセスできるようになります。
aws-sls-spa-sample-apiを使う方法
まず、aws-sls-spa-sample-apiをDocker環境で起動します。
前回の「docker環境で動かす」の通りです。ここのgit clone
するタグを今回のタグに変えます。
- aws-sls-spa-sample-api:タグ
v0.0.2
そして、docker-compose.yml
に定義した環境変数API_BASE_URL
をaws-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
これでブラウザからアクセスできます。
AWS環境で動かす
前々回の「使い方」の通りです。ここのgit clone
するタグを今回のタグに変えます。タグを変える箇所は前回の「AWS環境で動かす」の通りです。
- aws-sls-spa-sample-web:タグ
v0.0.1
- aws-sls-spa-sample-api:タグ
v0.0.2
- aws-sls-spa-sample-terraform:タグ
v0.0.2
実装
具体的な実装はこちらです。
マテリアルデザイン
マテリアルデザインはGoogleが提唱しているデザインの考え方です。
今回は@angular/materialを使いました。ライブラリで用意してあるコンポーネントを組み合わせるだけでマテリアルデザインになります。
そして、@angular/flex-layoutを使ってFlexboxでレイアウトしました。
CSS Flexible Box Layout Module Level 1 (日本語訳)
対応したコード差分は下記あたりです。
Reduxアーキテクチャ
対応したコード差分は下記あたりです。
Http Client / モックAPI
今回はフロントエンド単独でも動作できるようにしたかったのでAPIモックのためにin-memory-web-apiを使いました。
そして、通信先のAPIをモックにするかHTTPにするかの切り替えは環境変数のAPI_BASE_URL
に'mock-server'
を指定するか否かをAppModuleで判断して行うようにしました。
ただ、Angularにはng build
やng serve
のタイミングで環境変数から値を取得する標準的な仕組みはありませんでした。そのため、pre_build.shというbashを用意してnpm scriptでng build
やng serve
の直前に環境変数からsrc/app/environments/environment.ts
を動的に生成するようにしました。*3
対応したコード差分は下記あたりです。
まとめ
今回はAngular6でお手軽にマテリアルデザイン/ReduxアーキテクチャなTodoリストのフロントエンドのサンプルを実装してみました。Angularはフルスタックなライブラリですので用意された機能の組み合わせだけでもそれらしいフロントエンドができました。
心残りはたくさんあります。
- バリデーションがない
- エラー処理がない
- テストがない
- etcetc
気が向いたら対応するかもしれません。