Upgrade to Pro — share decks privately, control downloads, hide ads and more …

@vite-pwa/nuxt を用いた、PWA実装のリアル

Avatar for keigo keigo
August 26, 2025

@vite-pwa/nuxt を用いた、PWA実装のリアル

Avatar for keigo

keigo

August 26, 2025
Tweet

More Decks by keigo

Other Decks in Technology

Transcript

  1. PWA @kspace_trk @vite-pwa/nuxt における キャッシュ・ネットワーク戦略 nuxt.config.ts から sw.js になるまで nuxt.config.ts

    @vite-pwa/nuxt これによって、シンプルな設定でオフライン対応が実現 sw.js workbox
  2. PWA @kspace_trk @vite-pwa/nuxt における キャッシュ・ネットワーク戦略 Service Worker には、いくつかのネットワーク戦略が存在 and more...

    Cache First: キャッシュ優先。なければネットワークから取得。 Network First: ネットワーク優先。なければキャッシュから取得。 Stale While Revalidate: まずはキャッシュを返すが、同時にネットワークからも取得して更新。
  3. PWA @kspace_trk @vite-pwa/nuxt における キャッシュ・ネットワーク戦略 Service Worker には、いくつかのネットワーク戦略が存在 Cache First:

    キャッシュ優先。なければネットワークから取得。 Network First: ネットワーク優先。なければキャッシュから取得。 Stale While Revalidate: まずはキャッシュを返すが、同時にネットワークからも取得して更新。
  4. PWA @kspace_trk @vite-pwa/nuxt における キャッシュ・ネットワーク戦略 workbox.runtimeCaching を用いたネットワーク戦略 + // nuxt.config.ts

    ~~ ~~ ~~ pwa workbox globPatterns runtimeCaching : { : { : [ ], : [] } } '**/*.{js,css,html,png,svg,ico,webp,json}'
  5. PWA @kspace_trk @vite-pwa/nuxt における キャッシュ・ネットワーク戦略 workbox.runtimeCaching を用いたネットワーク戦略 + // nuxt.config.ts

    ~~ ~~ ~~ pwa workbox globPatterns runtimeCaching urlPattern startsWith handler : { : { : [ ], : [{ : ({ }) => ( ), : }] } } '**/*.{js,css,html,png,svg,ico,webp,json}' .pathname. '/api/' 'NetworkFirst' url url
  6. PWA @kspace_trk @vite-pwa/nuxt における キャッシュ・ネットワーク戦略 workbox.runtimeCaching を用いたネットワーク戦略 プリキャッシュも、ネットワーク戦略も完了!PWA余裕じゃん! + //

    nuxt.config.ts ~~ ~~ ~~ pwa workbox globPatterns runtimeCaching urlPattern startsWith handler : { : { : [ ], : [{ : ({ }) => ( ), : }] } } '**/*.{js,css,html,png,svg,ico,webp,json}' .pathname. '/api/' 'NetworkFirst' url url
  7. PWA @kspace_trk @vite-pwa/nuxt における キャッシュ・ネットワーク戦略 workbox.runtimeCaching を用いたネットワーク戦略 そう思っていた時期が私にもありました。 + //

    nuxt.config.ts ~~ ~~ ~~ pwa workbox globPatterns runtimeCaching urlPattern startsWith handler : { : { : [ ], : [{ : ({ }) => ( ), : }] } } '**/*.{js,css,html,png,svg,ico,webp,json}' .pathname. '/api/' 'NetworkFirst' url url
  8. PWA @kspace_trk Push通知に関する設定は sw.js に実装すべきだが、 sw.js は Workbox が生成してしまう。 →

    デフォルトで generateSW が有効になっているから @vite-pwa/nuxt における Push 通知対応
  9. PWA @kspace_trk Push通知に関する設定は sw.js に実装すべきだが、 sw.js は Workbox が生成してしまう。 →

    injectManifest にすることで、Service Worker を独自実装可能。 @vite-pwa/nuxt における Push 通知対応
  10. PWA @kspace_trk → injectManifest にすることで、Service Worker を独自実装可能。 しかも、sw.js ではなく sw.ts

    で実装できる Push通知に関する設定は sw.js に実装すべきだが、 sw.js は Workbox が生成してしまう。 @vite-pwa/nuxt における Push 通知対応
  11. PWA @kspace_trk injectManifest を用いた、カスタムsw実装 先ほどの設定コード @vite-pwa/nuxt における Push 通知対応 //

    nuxt.config.ts ~~ ~~ ~~ pwa workbox globPatterns runtimeCaching urlPattern startsWith handler : { : { : [ ], : [{ : ({ }) => ( ), : }] } } '**/*.{js,css,html,png,svg,ico,webp,json}' .pathname. '/api/' 'NetworkFirst' url url
  12. PWA @kspace_trk injectManifest を用いた、カスタムsw実装 先ほどの設定コード - // nuxt.config.ts ~~ ~~

    ~~ pwa workbox globPatterns runtimeCaching urlPattern startsWith handler : { : { : [ ], : [{ : ({ }) => ( ), : }] } } '**/*.{js,css,html,png,svg,ico,webp,json}' .pathname. '/api/' 'NetworkFirst' url url @vite-pwa/nuxt における Push 通知対応
  13. PWA @kspace_trk injectManifest を用いた、カスタムsw実装 // nuxt.config.ts ~~ ~~ ~~ pwa:

    { } 先ほどの設定コード @vite-pwa/nuxt における Push 通知対応
  14. PWA @kspace_trk injectManifest を用いた、カスタムsw実装 // nuxt.config.ts ~~ ~~ ~~ pwa

    strategies : { : , } 'injectManifest' injectManifest を有効 @vite-pwa/nuxt における Push 通知対応
  15. PWA @kspace_trk injectManifest を用いた、カスタムsw実装 // nuxt.config.ts ~~ ~~ ~~ pwa

    strategies globPatterns : { : , : [ ], } 'injectManifest' '**/*.{js,css,html,png,svg,ico,webp,json}' キャッシュファイルは nuxt.config.ts で指定可能 @vite-pwa/nuxt における Push 通知対応
  16. PWA @kspace_trk injectManifest を用いた、カスタムsw実装 // nuxt.config.ts ~~ ~~ ~~ pwa

    strategies globPatterns srcDir filename : { : , : [ ], : , : , } 'injectManifest' '**/*.{js,css,html,png,svg,ico,webp,json}' './sw' 'sw.ts' カスタム sw.ts の path や ファイル名を指定 @vite-pwa/nuxt における Push 通知対応
  17. PWA @kspace_trk injectManifest を用いた、カスタムsw実装 // sw/sw.ts { } { }

    { } import from import from import from precacheAndRoute, cleanupOutdatedCaches ; registerRoute ; NetworkFirst ; 'workbox-precaching' 'workbox-routing' 'workbox-strategies' workbox ライブラリ群から import ※ 説明を簡単にするために、省略している箇所があります @vite-pwa/nuxt における Push 通知対応
  18. PWA @kspace_trk injectManifest を用いた、カスタムsw実装 // sw/sw.ts { } { }

    { } ~~ // nuxt.config.ts に記載されている Precache 設定を反映させる import from import from import from precacheAndRoute, cleanupOutdatedCaches ; registerRoute ; NetworkFirst ; ( . ); 'workbox-precaching' 'workbox-routing' 'workbox-strategies' __WB_MANIFEST precacheAndRoute self precacheAndRoute で、nuxt.config.ts に記述したキャッシュ設定を反映 @vite-pwa/nuxt における Push 通知対応 ※ 説明を簡単にするために、省略している箇所があります
  19. PWA @kspace_trk injectManifest を用いた、カスタムsw実装 // sw/sw.ts { } { }

    { } ~~ // nuxt.config.ts に記載されている Precache 設定を反映させる // NetworkFirst戦略を適用 import from import from import from precacheAndRoute, cleanupOutdatedCaches ; registerRoute ; NetworkFirst ; ( . ); ( ({ }) => . . ( ), (), ); 'workbox-precaching' 'workbox-routing' 'workbox-strategies' __WB_MANIFEST pathname '/api/' NetworkFirst precacheAndRoute self registerRoute url url startsWith new @vite-pwa/nuxt における Push 通知対応 registerRoute で、ネットワーク戦略を適用 ※ 説明を簡単にするために、省略している箇所があります
  20. PWA @kspace_trk injectManifest を用いた、カスタムsw実装 // sw/sw.ts ~~ @vite-pwa/nuxt における Push

    通知対応 ※ 説明を簡単にするために、省略している箇所があります Push通知設定について
  21. PWA @kspace_trk injectManifest を用いた、カスタムsw実装 // sw/sw.ts ~~ { } {

    } import from import from initializeApp ; getMessaging, onBackgroundMessage ; 'firebase/app' 'firebase/messaging/sw' @vite-pwa/nuxt における Push 通知対応 ※ 説明を簡単にするために、省略している箇所があります Firebase Cloud Messaging を利用する場合
  22. PWA @kspace_trk injectManifest を用いた、カスタムsw実装 // sw/sw.ts ~~ { } {

    } import from import from initializeApp ; getMessaging, onBackgroundMessage ; const = ( ); const = ( ); 'firebase/app' 'firebase/messaging/sw' firebaseConfig app app initializeApp messaging getMessaging @vite-pwa/nuxt における Push 通知対応 ※ 説明を簡単にするために、省略している箇所があります Firebase Cloud Messaging を利用する場合
  23. PWA @kspace_trk injectManifest を用いた、カスタムsw実装 // sw/sw.ts ~~ { } {

    } ~~ import from import from initializeApp ; getMessaging, onBackgroundMessage ; const = ( ); const = ( ); ( , ({ }) => { . . ( . , { , }); }); 'firebase/app' 'firebase/messaging/sw' firebaseConfig app registration title app initializeApp messaging getMessaging onBackgroundMessage messaging data self showNotification data body data @vite-pwa/nuxt における Push 通知対応 ※ 説明を簡単にするために、省略している箇所があります onBackgroundMessage と showNotification を使用して、Push通知を実現