notebook

都内でWEB系エンジニアやってます。

AngularでデスクトップPWAをインストールしてみる

chrome67からデスクトップPWAが使えるようになったのでいくつかのPWAをインストールしてみたのですが良さそうな感じがしました

デスクトップPWAを使ってみた – Takeshi Amano – Medium

chromeとは別ウィンドウで起動できるのとelectronでやらなくても良くなったのでそれだけでも需要がありそうな気がします

そこで今回は angular + @anglar/pwa + @angular/materialでサクッとサンプルプロジェクトを作ってデスクトップPWAのインストールまでしてみたいと思います

そもそもPWAはみたいなところは下記

はじめてのプログレッシブ ウェブアプリ

https://codelabs.developers.google.com/codelabs/your-first-pwapp-ja/#0codelabs.developers.google.com

環境

     _                      _                 ____ _     ___
    / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
   / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
  / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
 /_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
                |___/


Angular CLI: 6.0.8
Node: 9.11.1
OS: linux x64
Angular: 6.1.0
... animations, common, compiler, compiler-cli, core, forms
... http, language-service, platform-browser
... platform-browser-dynamic, router, service-worker

Package                           Version
-----------------------------------------------------------
@angular-devkit/architect         0.6.8
@angular-devkit/build-angular     0.6.8
@angular-devkit/build-optimizer   0.6.8
@angular-devkit/core              0.6.8
@angular-devkit/schematics        0.6.8
@angular/cdk                      6.4.2
@angular/cli                      6.0.8
@angular/material                 6.4.2
@angular/pwa                      0.6.8
@ngtools/webpack                  6.0.8
@schematics/angular               0.6.8
@schematics/update                0.6.8
rxjs                              6.2.2
typescript                        2.7.2
webpack                           4.8.3

Angularプロジェクト作成

@angular/pwaを入れるだけでPWAに必要な環境をサクッと作成できるようです

  • 2018-08-01時点だとcliとpwaのバージョン指定しないとangular/pwaをインストールできない

ng add @angular/pwa fails with 'Invalid rule result: Function().' · Issue #11663 · angular/angular-cli

github.com

  • install, project作成
npm install -g @angular/cli@6.0.8
ng new pwa-sample --style=scss --routing
cd pwa-sample
  • pwa,material追加
npx ng add @angular/pwa@0.6.8 --project pwa-sample
npx ng add @angular/material
  • materialの雛形追加
npx ng g @angular/material:material-nav --name side-nav
npx ng g @angular/material:material-dashboard --name dashboard
  • src/app/app.component.html

書き換える

<app-side-nav></app-side-nav>
<router-outlet></router-outlet>

起動

npx ng s --host 192.168.30.17

確認する

f:id:swfz:20180815075657p:plain

とりあえずベースができました

ServiceWorkerの準備

PWAにするにはServiceWorkerの準備をする必要があります

npx ng build --aot --prod
npx ngsw-config dist/pwa-sample ngsw-config.json

ServiceWorkerを動作させるにはビルドした成果物のディレクトリ上にngsw.jsonngsw-worker.jsを置く必要があるので上記コマンドでdist以下に設定ファイルを置くようにします

manifest.json

ng add @angular/pwaで生成されたmanifest.jsonの設定をする

デプロイ

今回はnetlifyを使ってみました

githubと連携してぽちぽちするだけで独自ドメイン+SSLでデプロイすることができたのでとても楽でした

ココらへんの内容はググれば結構出てくると思うので簡単にやったことだけ書いていきます

今回すでにAWS上でドメインswfz.ioを持っていたのでそれを使ってサブドメインpwa-sample.swfz.ioをRoute53で設定した

AWS側作業

  • Route53での設定
    • Aレコード
    • CNAME

netlify側作業

デプロイ設定を入力します

  • Build Command
ng build --prod --aot && ngsw-config dist/pwa-sample ngsw-config.json
  • Publish Directory
dist/pwa-sample
  • Production Branch
master
  • SSLの設定をボタンぽちっとする

これだけで公開できました

さらにProduction Branchに指定したブランチにpushすると自動でビルドが走ってデプロイまでしてくれます

わざわざCIの設定する必要すらない

最初github pagesで頑張ろうと思ったのですがやっているうちにyak shaving感がすごくなってきたので方向転換しました

netlifyすごい

SPAとかとりえあすデプロイするならnetlifyにしとけばおk!という気持ちになりました

確認

デプロイされたので確認してみます

service workerが登録されていることを確認

f:id:swfz:20180815075725p:plain

manifest.jsonが読まれていることを確認

f:id:swfz:20180815075737p:plain

アイコンがデフォルトのangularのアイコンになっているのでちょっと変えてみます

適当にターミナルの一部をキャプチャしてアイコンにしました

もともとAngularのアイコンがあるのでsrc/assets/icons以下の画像を差し替えます

src/favicon.icoも差し替えます

確認すると変わっていますね

alt

alt

デフォルトでは10サイズのアイコン画像が用意してあるのですが横着していくつかしか用意しなかったらインストール時に怒られました

どうやら僕の環境ではデスクトップPWAのインストールには144x144のアイコン画像が必要なようです

参考のところでも言及されていたのですが端末の画面密度によって必要なアイコンのサイズが異なるようなので必要なサイズのアイコンがない場合はホームに追加できません。

なので本来は揃えられるだけサイズ違いを揃えた方が良いですね

ちゃんとアイコンも変わっています

f:id:swfz:20180815075833p:plain

まとめ

記事にまとめてみるとめちゃくちゃ簡単そうになりました

やっぱりアイコンが設定できてそれ用にウィンドウが立ち上がってっていうのはテンションが上がる気がします

Anaularでもpwaを追加するのとservice workerの設定を少しするだけで簡単にできるのでとりあえず対応させてもよいのでは?とか思ったりしました

これをテンプレートとしてなんかしらツールでも作ってみようかなと思ってます

全然関係ないけどnetlifyがいいですね!

3つ4つくらいフォームから設定するだけでpushしたら自動でデプロイまで行ってくれるっていうのはなかなか感動しました

httpsの設定もさくっとできるので独自ドメインを予め取っておけばすぐに公開できます

今回はとりあえず作ってみただけなので今度はServiceWorkerとか使って実用的なWebアプリを作ってみたいと思います