88 - Vite
99category :
1010 - Programming
11- thumbnail : /images/20241129a /thumbnail.png
11+ thumbnail : /images/20241127a /thumbnail.png
1212author : 大岩潤矢
1313lede : " Vue3で作ったWebサイトをPWA(Progressive Web Apps)化する方法を紹介します。"
1414---
1515## はじめに
1616
17- <img src =" /images/20241129a /ogp-2.png " alt =" ogp-2.png " width =" 1200 " height =" 730 " loading =" lazy " >
17+ <img src =" /images/20241127a /ogp-2.png " alt =" ogp-2.png " width =" 1200 " height =" 730 " loading =" lazy " >
1818
1919本記事は [ Vue連載2024] ( /articles/20241125a/ ) 3日目の記事です。
2020
@@ -32,7 +32,7 @@ Progressive Web Apps、直訳すると「革新的なWebアプリ」です。か
3232
3333Google Trendsによると、PWAは2017年頃から盛り上がりを見せ、2020年頃に一度ピークが落ち着いたものの、最近じわじわと話題が盛り返しているようです。2017年〜2020年頃にPWAに触れたものの、それっきり追っていないという方も多いのではないでしょうか?
3434
35- <img src =" /images/20241129a /Pasted_image_20241125132625.png " alt =" Pasted_image_20241125132625.png " width =" 1200 " height =" 713 " loading =" lazy " >
35+ <img src =" /images/20241127a /Pasted_image_20241125132625.png " alt =" Pasted_image_20241125132625.png " width =" 1200 " height =" 713 " loading =" lazy " >
3636
3737個人的な主観とはなりますが、一時期PWAが次世代のアプリの姿として持て囃されていたものの、日本の約半数のシェアを占めるiOSがPWAサポートに消極的であったことが採用の障壁となり話題も落ち着いたものと推測します。
3838
@@ -42,7 +42,7 @@ AndroidのGoogle ChromeにおいてPWAサポートが始まったのが2015年
4242
4343しかし、iOSのバージョンが上がるにつれてそれらの問題も徐々に改善していきます。特に昨今一番のアップデートとして、バックグラウンドでのPush通知に対応したことが挙げられます。2023年3月27日リリースのiOS16.4から、Service WorkerでバックグラウンドのPush通知を受信する ` ServiceWorkerRegistration.showNotification() ` に対応しました。これにより、iOSでのPWA実現の一番の障壁だったPush通知がそれなりに動くようになり、一層PWAが完成に近づいたと言えるでしょう。
4444
45- <img src =" /images/20241129a /Pasted_image_20241125133903.png " alt =" Pasted_image_20241125133903.png " width =" 1200 " height =" 615 " loading =" lazy " >
45+ <img src =" /images/20241127a /Pasted_image_20241125133903.png " alt =" Pasted_image_20241125133903.png " width =" 1200 " height =" 615 " loading =" lazy " >
4646
4747https://developer.mozilla.org/ja/docs/Web/API/ServiceWorkerRegistration/showNotification
4848
@@ -54,7 +54,7 @@ https://developer.mozilla.org/ja/docs/Web/API/ServiceWorkerRegistration/showNoti
5454
5555その前に、今回利用する Vite PWA について紹介します。
5656
57- <img src =" /images/20241129a /Pasted_image_20241125170224.png " alt =" Pasted_image_20241125170224.png " width =" 1200 " height =" 401 " loading =" lazy " >
57+ <img src =" /images/20241127a /Pasted_image_20241125170224.png " alt =" Pasted_image_20241125170224.png " width =" 1200 " height =" 401 " loading =" lazy " >
5858
5959https://vite-pwa-org.netlify.app/
6060
@@ -69,15 +69,15 @@ https://vite-pwa-org.netlify.app/
6969
7070本来であれば自分で用意しないといけない複雑な設定ファイルを、Viteのコンフィグファイルにオプションを記載するだけで自動で出力してくれるというすぐれものです。
7171
72- <img src =" /images/20241129a /Pasted_image_20241125200146.png " alt =" Pasted_image_20241125200146.png " width =" 1200 " height =" 699 " loading =" lazy " >
72+ <img src =" /images/20241127a /Pasted_image_20241125200146.png " alt =" Pasted_image_20241125200146.png " width =" 1200 " height =" 699 " loading =" lazy " >
7373
7474PWAはウェブマニフェストファイルとServiceWorkerのファイルから成り立ちます。前者はPWAをインストールする際に使われるメタ情報的な役割で、後者はキャッシュ対応やバックグラウンド処理等のJSコードです。Vite PWAはこの2つのファイルを自動生成してくれます。
7575
7676### アプリを準備する
7777
7878まずはVue3で作成したアプリをPWA化してみましょう。ここでは、簡易的に天気予報APIを叩いて各地の天気予報を取得する簡単なアプリを用意しました。
7979
80- <img src =" /images/20241129a /Pasted_image_20241125170033.png " alt =" Pasted_image_20241125170033.png " width =" 1200 " height =" 672 " loading =" lazy " >
80+ <img src =" /images/20241127a /Pasted_image_20241125170033.png " alt =" Pasted_image_20241125170033.png " width =" 1200 " height =" 672 " loading =" lazy " >
8181
8282ソースコードとデモサイトは以下に配置しています。
8383
@@ -122,11 +122,11 @@ export default defineConfig({
122122
123123このように ` dev-sw .js ` がService Workerとして読み込まれている事がわかります。
124124
125- <img src="/images/20241129a /Pasted_image_20241125173130.png" alt="Pasted_image_20241125173130.png" width="1200" height="621" loading="lazy">
125+ <img src="/images/20241127a /Pasted_image_20241125173130.png" alt="Pasted_image_20241125173130.png" width="1200" height="621" loading="lazy">
126126
127127ターミナルのほうを見てみると、 ` sw .js ` と ` workbox-xxxxxxxx .js ` が自動生成されていることがわかります。
128128
129- <img src="/images/20241129a /Pasted_image_20241125173237.png" alt="Pasted_image_20241125173237.png" width="889" height="180" loading="lazy">
129+ <img src="/images/20241127a /Pasted_image_20241125173237.png" alt="Pasted_image_20241125173237.png" width="889" height="180" loading="lazy">
130130
131131### PWAをインストールできるようにする(Webマニフェスト設定)
132132
@@ -152,11 +152,11 @@ export default defineConfig({
152152
153153記載できたら、 ` npx pwa-assets-generator --preset minimal-2023 ` で実行しましょう。
154154
155- <img src =" /images/20241129a /Pasted_image_20241125203153.png " alt =" Pasted_image_20241125203153.png " width =" 1072 " height =" 746 " loading =" lazy " >
155+ <img src =" /images/20241127a /Pasted_image_20241125203153.png " alt =" Pasted_image_20241125203153.png " width =" 1072 " height =" 746 " loading =" lazy " >
156156
157157正しく書き出せていそうです。
158158
159- <img src =" /images/20241129a /Pasted_image_20241125203351.png " alt =" Pasted_image_20241125203351.png " width =" 1200 " height =" 710 " loading =" lazy " >
159+ <img src =" /images/20241127a /Pasted_image_20241125203351.png " alt =" Pasted_image_20241125203351.png " width =" 1200 " height =" 710 " loading =" lazy " >
160160
161161後は ` vite.config.ts ` に設定を記載するだけです。
162162
@@ -205,15 +205,15 @@ https://developer.mozilla.org/en-US/docs/Web/Manifest
205205
206206保存したら、再度開発サーバを立ち上げてみましょう。アドレスバー横にアイコンが表示され、クリックするとPWAのインストールダイアログが表示されます。
207207
208- <img src =" /images/20241129a /Pasted_image_20241125204440.png " alt =" Pasted_image_20241125204440.png " width =" 544 " height =" 242 " loading =" lazy " >
208+ <img src =" /images/20241127a /Pasted_image_20241125204440.png " alt =" Pasted_image_20241125204440.png " width =" 544 " height =" 242 " loading =" lazy " >
209209
210210iPhoneでも試してみましょう。cloudflaredを使って外からアクセスできるようにして、ページを開いて「ホーム画面に追加」をタップします。
211211
212- <img src =" /images/20241129a /スライド3.png " alt =" スライド3.png " width =" 1200 " height =" 675 " loading =" lazy " >
212+ <img src =" /images/20241127a /スライド3.png " alt =" スライド3.png " width =" 1200 " height =" 675 " loading =" lazy " >
213213
214214問題なく表示できていますね。
215215
216- <img src =" /images/20241129a /スライド4.png " alt =" スライド4.png " width =" 1200 " height =" 675 " loading =" lazy " >
216+ <img src =" /images/20241127a /スライド4.png " alt =" スライド4.png " width =" 1200 " height =" 675 " loading =" lazy " >
217217
218218### プリキャッシュを導入する
219219
@@ -279,11 +279,11 @@ files generated
279279
280280書き出された ` dist/sw .js ` を見てみると、 ` e.precacheAndRoute()` の引数に、書き出されたファイルが一覧されているようです。
281281
282- <img src="/images/20241129a /Pasted_image_20241128142353.png" alt="Pasted_image_20241128142353.png" width="1200" height="1165" loading="lazy">
282+ <img src="/images/20241127a /Pasted_image_20241128142353.png" alt="Pasted_image_20241128142353.png" width="1200" height="1165" loading="lazy">
283283
284284では実際に試してみましょう。ビルドした後、先ほどと同様 cloudflared を使ってhttps通信でスマホからアクセスし、ホーム画面に追加。PWAアプリを一度開き、その後オフライン状態にして再度開くと……
285285
286- <img src="/images/20241129a /スライド5.png" alt="スライド5.png" width="1200" height="675" loading="lazy">
286+ <img src="/images/20241127a /スライド5.png" alt="スライド5.png" width="1200" height="675" loading="lazy">
287287
288288オフライン状態でも表示できました!しかし、外部リソース(ここでは天気予報APIやそこから取得した画像ファイル)からの取得は失敗してしまっていますね。
289289
@@ -322,7 +322,7 @@ workbox: {
322322
323323では実際に試してみましょう。build後、PWAをインストールし直してみます。
324324
325- <img src="/images/20241129a /スライド6.png" alt="スライド6.png" width="1200" height="675" loading="lazy">
325+ <img src="/images/20241127a /スライド6.png" alt="スライド6.png" width="1200" height="675" loading="lazy">
326326
327327今回はオフライン状態でもAPIリクエストをキャッシュできました!
328328
0 commit comments