From 7e7e62c7e1345ffda0ef84dd7cd414563b29454e Mon Sep 17 00:00:00 2001 From: ma91n Date: Fri, 29 Nov 2024 19:00:29 +0900 Subject: [PATCH] update --- ...6\263\225_2024\345\271\264\347\211\210.md" | 34 +++++++++--------- .../Pasted_image_20241125132625.png | Bin .../Pasted_image_20241125133903.png | Bin .../Pasted_image_20241125170033.png | Bin .../Pasted_image_20241125170224.png | Bin .../Pasted_image_20241125173130.png | Bin .../Pasted_image_20241125173237.png | Bin .../Pasted_image_20241125200146.png | Bin .../Pasted_image_20241125203153.png | Bin .../Pasted_image_20241125203351.png | Bin .../Pasted_image_20241125204440.png | Bin .../Pasted_image_20241128142353.png | Bin .../images/{20241129a => 20241127a}/ogp-2.png | Bin source/images/20241127a/thumbnail.png | Bin 0 -> 17260 bytes .../20241127a/thumbnail.png:Zone.Identifier | 2 ++ ...\343\202\244\343\203\210\343\202\2313.png" | Bin ...\343\202\244\343\203\210\343\202\2314.png" | Bin ...\343\202\244\343\203\210\343\202\2315.png" | Bin ...\343\202\244\343\203\210\343\202\2316.png" | Bin 19 files changed, 19 insertions(+), 17 deletions(-) rename "source/_posts/20241129a_Vue3\343\201\247\344\275\234\343\201\243\343\201\237Web\343\202\265\343\202\244\343\203\210\343\202\222_Vite_PWA_\343\201\247PWA\345\214\226\343\201\231\343\202\213\346\226\271\346\263\225_2024\345\271\264\347\211\210.md" => "source/_posts/20241127a_Vue3\343\201\247\344\275\234\343\201\243\343\201\237Web\343\202\265\343\202\244\343\203\210\343\202\222_Vite_PWA_\343\201\247PWA\345\214\226\343\201\231\343\202\213\346\226\271\346\263\225_2024\345\271\264\347\211\210.md" (95%) rename source/images/{20241129a => 20241127a}/Pasted_image_20241125132625.png (100%) rename source/images/{20241129a => 20241127a}/Pasted_image_20241125133903.png (100%) rename source/images/{20241129a => 20241127a}/Pasted_image_20241125170033.png (100%) rename source/images/{20241129a => 20241127a}/Pasted_image_20241125170224.png (100%) rename source/images/{20241129a => 20241127a}/Pasted_image_20241125173130.png (100%) rename source/images/{20241129a => 20241127a}/Pasted_image_20241125173237.png (100%) rename source/images/{20241129a => 20241127a}/Pasted_image_20241125200146.png (100%) rename source/images/{20241129a => 20241127a}/Pasted_image_20241125203153.png (100%) rename source/images/{20241129a => 20241127a}/Pasted_image_20241125203351.png (100%) rename source/images/{20241129a => 20241127a}/Pasted_image_20241125204440.png (100%) rename source/images/{20241129a => 20241127a}/Pasted_image_20241128142353.png (100%) rename source/images/{20241129a => 20241127a}/ogp-2.png (100%) create mode 100644 source/images/20241127a/thumbnail.png create mode 100644 source/images/20241127a/thumbnail.png:Zone.Identifier rename "source/images/20241129a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2313.png" => "source/images/20241127a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2313.png" (100%) rename "source/images/20241129a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2314.png" => "source/images/20241127a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2314.png" (100%) rename "source/images/20241129a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2315.png" => "source/images/20241127a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2315.png" (100%) rename "source/images/20241129a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2316.png" => "source/images/20241127a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2316.png" (100%) diff --git "a/source/_posts/20241129a_Vue3\343\201\247\344\275\234\343\201\243\343\201\237Web\343\202\265\343\202\244\343\203\210\343\202\222_Vite_PWA_\343\201\247PWA\345\214\226\343\201\231\343\202\213\346\226\271\346\263\225_2024\345\271\264\347\211\210.md" "b/source/_posts/20241127a_Vue3\343\201\247\344\275\234\343\201\243\343\201\237Web\343\202\265\343\202\244\343\203\210\343\202\222_Vite_PWA_\343\201\247PWA\345\214\226\343\201\231\343\202\213\346\226\271\346\263\225_2024\345\271\264\347\211\210.md" similarity index 95% rename from "source/_posts/20241129a_Vue3\343\201\247\344\275\234\343\201\243\343\201\237Web\343\202\265\343\202\244\343\203\210\343\202\222_Vite_PWA_\343\201\247PWA\345\214\226\343\201\231\343\202\213\346\226\271\346\263\225_2024\345\271\264\347\211\210.md" rename to "source/_posts/20241127a_Vue3\343\201\247\344\275\234\343\201\243\343\201\237Web\343\202\265\343\202\244\343\203\210\343\202\222_Vite_PWA_\343\201\247PWA\345\214\226\343\201\231\343\202\213\346\226\271\346\263\225_2024\345\271\264\347\211\210.md" index 48df7cd57e5..20b30e9d334 100644 --- "a/source/_posts/20241129a_Vue3\343\201\247\344\275\234\343\201\243\343\201\237Web\343\202\265\343\202\244\343\203\210\343\202\222_Vite_PWA_\343\201\247PWA\345\214\226\343\201\231\343\202\213\346\226\271\346\263\225_2024\345\271\264\347\211\210.md" +++ "b/source/_posts/20241127a_Vue3\343\201\247\344\275\234\343\201\243\343\201\237Web\343\202\265\343\202\244\343\203\210\343\202\222_Vite_PWA_\343\201\247PWA\345\214\226\343\201\231\343\202\213\346\226\271\346\263\225_2024\345\271\264\347\211\210.md" @@ -8,13 +8,13 @@ tag: - Vite category: - Programming -thumbnail: /images/20241129a/thumbnail.png +thumbnail: /images/20241127a/thumbnail.png author: 大岩潤矢 lede: "Vue3で作ったWebサイトをPWA(Progressive Web Apps)化する方法を紹介します。" --- ## はじめに -ogp-2.png +ogp-2.png 本記事は [Vue連載2024](/articles/20241125a/) 3日目の記事です。 @@ -32,7 +32,7 @@ Progressive Web Apps、直訳すると「革新的なWebアプリ」です。か Google Trendsによると、PWAは2017年頃から盛り上がりを見せ、2020年頃に一度ピークが落ち着いたものの、最近じわじわと話題が盛り返しているようです。2017年〜2020年頃にPWAに触れたものの、それっきり追っていないという方も多いのではないでしょうか? -Pasted_image_20241125132625.png +Pasted_image_20241125132625.png 個人的な主観とはなりますが、一時期PWAが次世代のアプリの姿として持て囃されていたものの、日本の約半数のシェアを占めるiOSがPWAサポートに消極的であったことが採用の障壁となり話題も落ち着いたものと推測します。 @@ -42,7 +42,7 @@ AndroidのGoogle ChromeにおいてPWAサポートが始まったのが2015年 しかし、iOSのバージョンが上がるにつれてそれらの問題も徐々に改善していきます。特に昨今一番のアップデートとして、バックグラウンドでのPush通知に対応したことが挙げられます。2023年3月27日リリースのiOS16.4から、Service WorkerでバックグラウンドのPush通知を受信する `ServiceWorkerRegistration.showNotification()` に対応しました。これにより、iOSでのPWA実現の一番の障壁だったPush通知がそれなりに動くようになり、一層PWAが完成に近づいたと言えるでしょう。 -Pasted_image_20241125133903.png +Pasted_image_20241125133903.png https://developer.mozilla.org/ja/docs/Web/API/ServiceWorkerRegistration/showNotification @@ -54,7 +54,7 @@ https://developer.mozilla.org/ja/docs/Web/API/ServiceWorkerRegistration/showNoti その前に、今回利用する Vite PWA について紹介します。 -Pasted_image_20241125170224.png +Pasted_image_20241125170224.png https://vite-pwa-org.netlify.app/ @@ -69,7 +69,7 @@ https://vite-pwa-org.netlify.app/ 本来であれば自分で用意しないといけない複雑な設定ファイルを、Viteのコンフィグファイルにオプションを記載するだけで自動で出力してくれるというすぐれものです。 -Pasted_image_20241125200146.png +Pasted_image_20241125200146.png PWAはウェブマニフェストファイルとServiceWorkerのファイルから成り立ちます。前者はPWAをインストールする際に使われるメタ情報的な役割で、後者はキャッシュ対応やバックグラウンド処理等のJSコードです。Vite PWAはこの2つのファイルを自動生成してくれます。 @@ -77,7 +77,7 @@ PWAはウェブマニフェストファイルとServiceWorkerのファイルか まずはVue3で作成したアプリをPWA化してみましょう。ここでは、簡易的に天気予報APIを叩いて各地の天気予報を取得する簡単なアプリを用意しました。 -Pasted_image_20241125170033.png +Pasted_image_20241125170033.png ソースコードとデモサイトは以下に配置しています。 @@ -122,11 +122,11 @@ export default defineConfig({ このように `dev-sw.js` がService Workerとして読み込まれている事がわかります。 -Pasted_image_20241125173130.png +Pasted_image_20241125173130.png ターミナルのほうを見てみると、 `sw.js` と `workbox-xxxxxxxx.js` が自動生成されていることがわかります。 -Pasted_image_20241125173237.png +Pasted_image_20241125173237.png ### PWAをインストールできるようにする(Webマニフェスト設定) @@ -152,11 +152,11 @@ export default defineConfig({ 記載できたら、 `npx pwa-assets-generator --preset minimal-2023` で実行しましょう。 -Pasted_image_20241125203153.png +Pasted_image_20241125203153.png 正しく書き出せていそうです。 -Pasted_image_20241125203351.png +Pasted_image_20241125203351.png 後は `vite.config.ts` に設定を記載するだけです。 @@ -205,15 +205,15 @@ https://developer.mozilla.org/en-US/docs/Web/Manifest 保存したら、再度開発サーバを立ち上げてみましょう。アドレスバー横にアイコンが表示され、クリックするとPWAのインストールダイアログが表示されます。 -Pasted_image_20241125204440.png +Pasted_image_20241125204440.png iPhoneでも試してみましょう。cloudflaredを使って外からアクセスできるようにして、ページを開いて「ホーム画面に追加」をタップします。 -スライド3.png +スライド3.png 問題なく表示できていますね。 -スライド4.png +スライド4.png ### プリキャッシュを導入する @@ -279,11 +279,11 @@ files generated 書き出された `dist/sw.js` を見てみると、 `e.precacheAndRoute()` の引数に、書き出されたファイルが一覧されているようです。 -Pasted_image_20241128142353.png +Pasted_image_20241128142353.png では実際に試してみましょう。ビルドした後、先ほどと同様 cloudflared を使ってhttps通信でスマホからアクセスし、ホーム画面に追加。PWAアプリを一度開き、その後オフライン状態にして再度開くと…… -スライド5.png +スライド5.png オフライン状態でも表示できました!しかし、外部リソース(ここでは天気予報APIやそこから取得した画像ファイル)からの取得は失敗してしまっていますね。 @@ -322,7 +322,7 @@ workbox: { では実際に試してみましょう。build後、PWAをインストールし直してみます。 -スライド6.png +スライド6.png 今回はオフライン状態でもAPIリクエストをキャッシュできました! diff --git a/source/images/20241129a/Pasted_image_20241125132625.png b/source/images/20241127a/Pasted_image_20241125132625.png similarity index 100% rename from source/images/20241129a/Pasted_image_20241125132625.png rename to source/images/20241127a/Pasted_image_20241125132625.png diff --git a/source/images/20241129a/Pasted_image_20241125133903.png b/source/images/20241127a/Pasted_image_20241125133903.png similarity index 100% rename from source/images/20241129a/Pasted_image_20241125133903.png rename to source/images/20241127a/Pasted_image_20241125133903.png diff --git a/source/images/20241129a/Pasted_image_20241125170033.png b/source/images/20241127a/Pasted_image_20241125170033.png similarity index 100% rename from source/images/20241129a/Pasted_image_20241125170033.png rename to source/images/20241127a/Pasted_image_20241125170033.png diff --git a/source/images/20241129a/Pasted_image_20241125170224.png b/source/images/20241127a/Pasted_image_20241125170224.png similarity index 100% rename from source/images/20241129a/Pasted_image_20241125170224.png rename to source/images/20241127a/Pasted_image_20241125170224.png diff --git a/source/images/20241129a/Pasted_image_20241125173130.png b/source/images/20241127a/Pasted_image_20241125173130.png similarity index 100% rename from source/images/20241129a/Pasted_image_20241125173130.png rename to source/images/20241127a/Pasted_image_20241125173130.png diff --git a/source/images/20241129a/Pasted_image_20241125173237.png b/source/images/20241127a/Pasted_image_20241125173237.png similarity index 100% rename from source/images/20241129a/Pasted_image_20241125173237.png rename to source/images/20241127a/Pasted_image_20241125173237.png diff --git a/source/images/20241129a/Pasted_image_20241125200146.png b/source/images/20241127a/Pasted_image_20241125200146.png similarity index 100% rename from source/images/20241129a/Pasted_image_20241125200146.png rename to source/images/20241127a/Pasted_image_20241125200146.png diff --git a/source/images/20241129a/Pasted_image_20241125203153.png b/source/images/20241127a/Pasted_image_20241125203153.png similarity index 100% rename from source/images/20241129a/Pasted_image_20241125203153.png rename to source/images/20241127a/Pasted_image_20241125203153.png diff --git a/source/images/20241129a/Pasted_image_20241125203351.png b/source/images/20241127a/Pasted_image_20241125203351.png similarity index 100% rename from source/images/20241129a/Pasted_image_20241125203351.png rename to source/images/20241127a/Pasted_image_20241125203351.png diff --git a/source/images/20241129a/Pasted_image_20241125204440.png b/source/images/20241127a/Pasted_image_20241125204440.png similarity index 100% rename from source/images/20241129a/Pasted_image_20241125204440.png rename to source/images/20241127a/Pasted_image_20241125204440.png diff --git a/source/images/20241129a/Pasted_image_20241128142353.png b/source/images/20241127a/Pasted_image_20241128142353.png similarity index 100% rename from source/images/20241129a/Pasted_image_20241128142353.png rename to source/images/20241127a/Pasted_image_20241128142353.png diff --git a/source/images/20241129a/ogp-2.png b/source/images/20241127a/ogp-2.png similarity index 100% rename from source/images/20241129a/ogp-2.png rename to source/images/20241127a/ogp-2.png diff --git a/source/images/20241127a/thumbnail.png b/source/images/20241127a/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..7774021979562397f273bbcc4d75fe3c5a80c46f GIT binary patch literal 17260 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 literal 0 HcmV?d00001 diff --git a/source/images/20241127a/thumbnail.png:Zone.Identifier b/source/images/20241127a/thumbnail.png:Zone.Identifier new file mode 100644 index 00000000000..a45e1ac4c0c --- /dev/null +++ b/source/images/20241127a/thumbnail.png:Zone.Identifier @@ -0,0 +1,2 @@ +[ZoneTransfer] +ZoneId=3 diff --git "a/source/images/20241129a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2313.png" "b/source/images/20241127a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2313.png" similarity index 100% rename from "source/images/20241129a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2313.png" rename to "source/images/20241127a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2313.png" diff --git "a/source/images/20241129a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2314.png" "b/source/images/20241127a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2314.png" similarity index 100% rename from "source/images/20241129a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2314.png" rename to "source/images/20241127a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2314.png" diff --git "a/source/images/20241129a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2315.png" "b/source/images/20241127a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2315.png" similarity index 100% rename from "source/images/20241129a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2315.png" rename to "source/images/20241127a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2315.png" diff --git "a/source/images/20241129a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2316.png" "b/source/images/20241127a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2316.png" similarity index 100% rename from "source/images/20241129a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2316.png" rename to "source/images/20241127a/\343\202\271\343\203\251\343\202\244\343\203\210\343\202\2316.png"