とりあえず プログレッシブウェブアプリを 体験したい方へ(Nuxt.js)

# 概要

プログレッシブウェブアプリ（PWA） とは

```
プログレッシブウェブアプリは、デスクトップとモバイルの両方でインストール可能なアプリと
同等の体験を提供し、ウェブ上で直接構築・配信される高速で信頼性の高いウェブアプリです。
```
[はじめてのプログレッシブウェブアプリ](https://developers.google.com/web/fundamentals/codelabs/your-first-pwapp) より引用

PWA はまるでスマートフォンアプリのようにオフラインで動作できたり(ブラウザのようにネットワークエラーにならない)、インストールなどをすることができます。

- オフラインでの動作
  オンライン時に資源をキャッシュし、それをオフライン時に使用することでオフラインでも動作することができます。

- インストール
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/401f164f-fe53-6793-516a-c2cd3c458dbf.png)


「...」をインストール  などを PC やスマホみたことはないでしょうか。
　 PWA はまるでスマホのアプリケーションのように、端末にインストールが可能です。

PWA を今回は Nuxt.js で体験してみましょう。

# npm インストール

以下を参考に npm をインストールしてください。

https://qiita.com/taiponrock/items/9001ae194571feb63a5e
https://qiita.com/PolarBear/items/62c0416492810b7ecf7c

# npx インストール
```console
npm install -g npx
```
# pwa プラグインインストール
```console
npm install -g @nuxtjs/pwa
```
# プロジェクト作成

create-nuxt-app ツールでnuxt.jsプロジェクトを簡単に作成することができます。

```console
npx create-nuxt-app <project-name>
```
入力を促されますので以下の通り入力してください。

```
Project name 　             　　　:任意
Project description 　      　　　:任意
Author name                 　　　:任意
Choose the package manager  　　　:npm
Choose UI framework         　　　:任意
Choose custom server framework 　:任意
Choose Nuxt.js modules 　　  　　 :Progressive Web App (PWA) Supportは必須、それ以外任意
Choose linting tools 　          :任意
Choose test framework 　         :任意
Choose rendering mode 　         :任意
Choose development tools 　      :任意
```

# サーバ起動
```
cd 　<project-name>
npm run dev
```
# アプリを確認
Chromeで以下にアクセスしてください。

```
http://localhost:3000
```
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/34a25e71-5385-63e1-99a8-e81fe02037db.png)


無事表示されました。しかし、この時点では PWA とは言えません。
試しにオフラインにして画面をリロードしてみましょう。

Chrome の開発者ツールからオフラインにすることができます。
Application タブ、左の Service Workers メニューを選択し、右に表示されている Offline をチェックします。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/3cad7a39-96f1-8c77-0f21-49c4f995f7f2.png)

その状態でリロードしてみましょう。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/1e7a9cfe-4587-8ca4-eab8-4dcf439dfec7.png)

よくみる恐竜が出てきました。
現在のアプリではオフライン体験ができないことがわかります。

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/96b9d671-28cf-60a0-5fda-260946a718ff.png)

また、インストールが可能ではないこともわかります。

static/sw.js をみてみましょう。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/fd131de9-0f56-5416-a9c6-dd1d303c5ee4.png)


PWA でのキャッシュ登録やオフライン体験は、このサービスワーカー(static/sw.js)から提供されます。
このように何も記述されていないのであれば、恐竜がでるのも当然です。

# PWA を体験する

手取り早くlocal環境でPWAを体験するために、nuxt.config.jsに以下を追記します。

```javascript

  workbox: {
    dev: true
  }
```
保存をすると再ビルドされると思います。ビルド後、static/sw.js をみてみます。

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/0efde7f4-5e8c-57da-714d-b406b426dcbb.png)

サービスワーカーの処理が生成されたようです。

ページをリロードし、エラーがないこと、sw.js がサービスワーカーとして登録されたことを確認します。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/9cec46d3-2b2f-7f0b-a415-ab29e649d695.png)

# オフラインでの動作確認
先ほどのようにオフライン、リロードしてみます。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/5f71abef-a8fe-6cc7-2a2d-db950cbae6f6.png)


恐竜は出てこなくなり、オンライン時の画面が表示されました。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/930b4790-d033-35d2-e40e-963a621527f8.png)


ネットワークをみてみるとjs ファイルなどがサービスワーカーから返却されていることがわかります。

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/91dcbe44-105e-4d52-2a93-b1b1373a5006.png)

また、開発者ツールのApplicationタブから左メニューCache/Cache Storageにキャッシュが追加されています。
サービスワーカーはオンライン時に必要な js,html などの資源をキャッシュし、オフライン時にキャッシュを利用して、オンラインと同様の体験を提供します。

# インストールの確認
Chromeのメニューに「＜project-name＞をインストール」が追加されました。

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/401f164f-fe53-6793-516a-c2cd3c458dbf.png)

押下するとインストールするかと聞かれます。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/806b74a0-81d6-ea42-fdd1-cc4934d819cb.png)

インストールを押下すると、アプリとしてインストールされたことがわかります。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/82ac7cd6-be72-60ca-696f-f02358dca397.png)

アプリを起動するとこんな風に表示されました。
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/68612961-0936-c698-5e11-fb49c6a4dd30.png)



#参考
https://ja.nuxtjs.org/guide/installation/
https://developers.google.com/web/fundamentals/codelabs/your-first-pwapp
https://kotamat.com/post/nuxt-pwa/