Skip to content

Caché de Recursos Externos

Distribución de Contenidos

Si usa algún CDN (Content Delivery Network) para descargar algunos recursos como fuentes y css, debe incluirlos en el precaché del service worker, y así su aplicación funcionará cuando esté fuera de línea.

El siguiente ejemplo utilizará css de https://fonts.googleapis.com. En el archivo index.html debe configurar el enlace css, también DEBE incluir el atributo crossorigin="anonymous" para los recursos externos (consulte Manejar Solicitudes de Terceros):

📃./index.html

html
<link rel="dns-prefetch" href="https://fonts.googleapis.com">
<link rel="preconnect" crossorigin="anonymous" href="https://fonts.googleapis.com">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Audiowide">
<style>body { font-family: "Audiowide", sans-serif;}</style>

Ahora su sitio se lucirá así:

cache-external-resources

Luego, en su archivo vite.config.ts, agregue el siguiente código:

📃./vite.config.ts

ts
VitePWA({
  // omitted for brevity ...
  workbox: {
    // omitted for brevity ...
    runtimeCaching: [
      {
        urlPattern: /^https:\/\/fonts\.googleapis\.com\/.*/i,
        handler: 'CacheFirst' as const,
        options: {
          cacheName: 'google-fonts-cache',
          cacheableResponse: {
            statuses: [0, 200]
          }
        }
      }
    ]
  },
  // omitted for brevity ...
})

Fuera de Línea

Puede desconectarse cambiando la red a Offline. Si actualiza la página, obtendrá algo similar a esto:

cache-external-resources

Tenga en cuenta la información que hasta el momento se ha guardado en el Cache Storage. Si bién es cierto, el estilo sigue funcionando, pero no hay data.

No se preocupe, agregué una configuración más a su archivo de configuración de Vite para indicar que necesitamos almacenar cierta data en cache.

📃./vite.config.ts

ts
VitePWA({
  // omitted for brevity ...
  workbox: {
    // omitted for brevity ...
    runtimeCaching: [
      {
        urlPattern: ({ url }) => {
          return url.pathname.startsWith("/ecanquiz/vue-todo-pwa");
        },
        //urlPattern: /^https:\/.my-json-server\.typicode\.com/,       
        handler: "NetworkFirst" as const,
        method: 'GET',
        options: {
          cacheName: "api-cache",
          expiration: {
            maxEntries: 10,
            maxAgeSeconds: 60 * 60 * 24 * 7, // <== 7 days
          },
          cacheableResponse: {
            statuses: [0, 200],
          },
        },
      },
    ]
  },
  // omitted for brevity ...
})

Después de compilar esta configuración notará que la data también será guardada en caché.

cache-external-resources

Released under the MIT License.