Angularで新サービス作って学んだこととか (作ってというか絶賛開発中) Katsumi Honda @kponda
自己紹介 本田 克己 @kponda おんせん♨ と からあげ の国から来ました 電子工作から年末調整まで事務員の心に寄り添うプログラマ 今月は標準報酬月額の算定基礎届や労働保険の年度更新、会社の決算処理などあって事務作業が山積みです 2,3年前まではAndroidアプリ、iPhoneアプリを主に作ってました Webの開発を主にしていたのはサーバサイドJava (EJB3あたり)
Angularを使うまで Androidアプリ開発 iOSアプリ開発 同じ機能作るの 面倒い・・・ Meteor Google 信者風味 Ionic リアクティブすごい! Webもっとやらなきゃ Angular Android教 Angular 大好き
今日の話 Angularで新しいサービスを作ってみて 困った点 その解決策 まだ解決できていない点 などを話したいと思います。 もっと良い解決方法あれば教えてください ☺
作っているサービス
https://spotsale.jp/
6/15 新しいフェーズに
SPOTSALEの大まかな構成 Web App (angular) Webサーバ APIサーバ (apollo) バックエンド GraphQL Client express SSR
Angular使って良かったところ・いまいちなところ pros cons HTMLベースのテンプレート デザイナさんが直接編集している 分業しやすい TypeScript サーバ側もTypeScriptで開発言語を1つに エディタのコード補完が便利 老害に優しい 動き出したら早い いわゆるSPAでページ切替とか早い ビルドに時間がかかる 特にSSR用のビルドが分単位でかかっている SSRで謎のエラー エラーログも出力されず発生箇所の特定も困難 (実装がおかしいだけかも)
困ったことなど 1. ページ切替時にページの先頭が表示されない 2. 複数アプリケーションを効率よく管理したい 3. 新しいバージョンをデプロイしたその後に 4. やっぱり必要だったサーバサイドレンダリング 5. 本当は怖かったサーバサイドレンダリング
1)ページ切替時にページの先頭が表示されない
ページ1 ページ2 画面遷移 スクロールして表示 元のスクロール位置のまま
画面遷移時にスクロール位置をリセットする
ページ1 ページ2 画面遷移 スクロールして表示 元のスクロール位置のまま window.scrollTo(0, 0)
2)複数アプリケーションを効率よく管理したい
複数アプリ構成 ユーザ向けアプリ 店舗向けアプリ 管理者向けアプリ 共有ライブラリ
Angular CLIで複数アプリ Angular CLIのmultiple appsの設定で1つのプロジェクト内で複数アプリを操作できる Angular CLI 1.xまでは Angular CLI 6では multiple projectsとなります。
Multiple project ng g application [プロジェクト名] ng g component [コンポネント名] –project [プロジェクト名] ng g library [ライブラリ名] ng serve –project [プロジェクト名] ng new [プロジェクト名] 普通にプロジェクトを作る プロジェクトを追加する ライブラリプロジェクトを追加する プロジェクトを指定して実行する プロジェクトを指定してコンポーネントを追加する
複数アプリのデプロイ https://example.com/app1 https://example.com/app2 https://example.com/app3 パスを分ける --base-href オプション ng serve –base-href /app1/ ng build –base-href /app1/ 開発・実行 ビルド時
複数プロジェクトを同時に動かしたい ポート(4200)をプロジェクト毎に変えて動かす ng serve –base-href app1 ng serve –project app2 –base-href app2 –port 4201 ng serve –project app3 –base-href app3 –port 4202 package.json に同時に動かすスクリプト追加
3)新しいバージョンをデプロイしたその後に
新バージョンデプロイ後リロードしないと反映されない ブラウザ Webサーバ デプロイAPIサーバ ページ読み込み v1 ページ切替 APIリクエスト デプロイ v2 APIリクエスト APIリクエスト APIリクエスト アプリ内でページ切り替えても新バージョンに更新されない ページ切替 ページ切替
定期的にアプリバージョンをチェック https://blog.nodeswat.com/automagic-reload-for-clients-after-deploy-with-angular-4-8440c9fdd96c
WatchQuery で 楽する
4)やっぱり必要だったサーバサイドレンダリング
SNSでシェアしたいのよ!
OGPなんかを設定 ngOnInitの中で、titleやmetaの値を変更する SSRしないとFacebookや Twitterは反映してくれません 今のとろこ Google先生はSSRなくても無問題
意外と簡単サーバサイドレンダリング https://github.com/angular/angular-cli/wiki/stories-universal-rendering このページの手順どおりに進めればできる
Angular Universal Starter Angular Universal Starterをベースにすると圧倒的に楽 https://github.com/angular/universal-starter npm run build:ssr && npm run serve:ssr
コードの対応 https://angular.jp/guide/universal localStorageなどもサーバ上のAPIにない Facebook SDKなど外部のライブラリが参照している場合もあるので注意
ブラウザで動作しているかで処理を切り替える ブラウザで動作しているか確認
5)本当は恐ろしかったSSR
本当は恐ろしかったSSR URLを直接指定したら 404 Not Found 他のページから遷移した時は表示される ブラウザでリロードかけても 404 Not Found
SSRでエラーが起きてるっぽい ブラウザでレンダリングする時は特にエラーはでていない エラーログでてたらいいけど、ログに何も出力なくて エラー起きてるときもあります(T-T)
これイマイチ原因よくわかっていない・・・
とりあえず逃げる
逃げる <div *ngIf=”isPlatformBrowser()”> 怪しいところにSSRしないようにngIfつけてまわる・・・ SSRはOGPの反映ができればとりあえずOKと自分に言い聞かせる
もう少し開発が落ち着いたら ちゃんと原因突き止めたいです(汗)
番外編 Angular関係ないけど TypeORMをPM2で動かすと挙動がおかしい
TypeORM PM2で実行時にリレーションエンティティが取れない import "reflect-metadata" が効いていない感じ
誰か助けて! とりあえず該当箇所はfind*に書き換えてる
ご清聴ありがとうございました SPOTSALEの開発 手伝ってやってもいいよって人いたら声掛けてください 渋谷オフィスもあるよ お叱り、励まし、アドバイスお待ちしております https://twitter.com/kponda

Angularで新サービス作って学んだこととか