Vue Router History Mode with PWA in Offline Mode
Asked Answered
M

2

14

To get history mode working with Vue-Router you need to return the contents of your main page when trying to access a route that doesn't exist. For example when you visit mypwa.com/route1 your server checks if there is a resource at route1 and if there isn't, it returns the contents that is found at mypwa.com/ (but without redirecting you). This is great and works when you're online, but it requires your server to do the actual re-routing.

If you have a PWA that's meant to work offline, you need this re-routing to work without the server being available.
The problem is this: visiting mypwa.com/ when you're offline works. After loading it you can then navigate to mypwa.com/route1 from inside the app. However, if you try to navigate directly to mypwa.com/route1 whilst offline you will get a 404 error because mypwa.com/route1 is not cached, only / is cached. I suppose this means that you need some kind of fallback clause in your service worker? Does anyone know of a way to achieve this? Is there a common way to do it with sw-precache-webpack-plugin?

Moonlighting answered 22/4, 2018 at 8:27 Comment(0)
S
10

You need to set the navigateFallback option in your vue.config.js file:

pwa: {
  workboxOptions: {
    navigateFallback: 'index.html'
  }
}

It will automatically add the necessary code to your service worker:

workbox.routing.registerNavigationRoute(workbox.precaching.getCacheKeyForURL("index.html"));

I had the same problem and I found the solution here: https://github.com/vuejs/vue-cli/issues/717#issuecomment-382079361

Shrewd answered 18/12, 2019 at 10:18 Comment(2)
"ValidationError: "navigateFallback" is not a supported parameter." in vue/cli-plugin-pwa version 4.2.3 :'(... Vue PWA currently uses Workbox v4.3.1, not sure though, if that's why it's not supported (anymore?)..Woken
Thank you, searched hours for this!Friedlander
A
7

If your site is a single page app, you can use a NavigationRoute to return a specific response for all navigation requests.

workbox.routing.registerNavigationRoute('/single-page-app.html')

In my case in vue :

workbox.routing.registerNavigationRoute('/index.html')

Whenever a user goes to your site in the browser, the request for the page will be a navigation request and will be served the cached page /single-page-app.html.

Note: You should have the page cached via workbox-precaching or through your own installation step).

By default, this will respond to all navigation requests, if you want to restrict it to respond to a subset of URL’s you can use the whitelist and blacklist options to restrict which pages will match this route.

Update: Workbox V5

const handler = workbox.precaching.createHandlerBoundToURL("/index.html");

const navigationRoute = new workbox.routing.NavigationRoute(handler);

workbox.routing.registerRoute(navigationRoute);
Albuminoid answered 13/10, 2018 at 1:54 Comment(1)
where do you add this line please?Goran

© 2022 - 2024 — McMap. All rights reserved.