我正在设置一个支持脱机浏览的渐进式Web应用程序。
我已经为我的主要路线('domainsample.com/')设置了离线浏览,即使处于离线状态,它也会响应200。
但是当我导航到其他路线(“ domainsample.com/about”)时,我收到了No Internet Page
错误。
这是我在Heroku中部署的示例URL:https://pwa-hehe.herokuapp.com
我使用Vue CLI 3设置项目,并使用Node.js和Express.js在服务器中运行我的dist文件夹。
// server.js
const express = require('express')
const path = require('path')
const history = require('connect-history-api-fallback')
const app = express()
const staticFileMiddleware = express.static(path.join(__dirname + '/dist'))
app.use(staticFileMiddleware)
app.use(history({
disableDotRule: true,
verbose: true
}))
app.use(staticFileMiddleware)
app.get('/', function (req, res) {
res.render(path.join(__dirname + '/dist/'))
})
var server = app.listen(process.env.PORT || 3000, function () {
var port = server.address().port
console.log("App now running on port", port)
})
// manifest.json
{
"name": "pwa-offline",
"short_name": "pwa-offline",
"icons": [
{
"src": "./img/icons/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "./img/icons/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"start_url": "./index.html",
"display": "standalone",
"background_color": "#000000",
"theme_color": "#4DBA87"
}
// service-worker.js
/**
* Welcome to your Workbox-powered service worker!
*
* You'll need to register this file in your web app and you should
* disable HTTP caching for this file too.
*
*
* The rest of the code is auto-generated. Please don't update this file
* directly; instead, make changes to your Workbox build configuration
* and re-run your build process.
*
*/
importScripts("https://storage.googleapis.com/workbox-cdn/releases/3.6.3/workbox-sw.js");
importScripts(
"/precache-manifest.d3f1ce5d8331bddc555348f44cfba9d8.js"
);
workbox.core.setCacheNameDetails({prefix: "pwa-offline"});
/**
* The workboxSW.precacheAndRoute() method efficiently caches and responds to
* requests for URLs in the manifest.
*
*/
self.__precacheManifest = [].concat(self.__precacheManifest || []);
workbox.precaching.suppressWarnings();
workbox.precaching.precacheAndRoute(self.__precacheManifest, {});
答案 0 :(得分:0)
问题是您的服务人员不知道要缓存哪些资产。 --disable-web-security
的值是什么? (可能是网络清单文件)。
您需要配置工作箱,以便为self.__precacheManifest
方法拥有一些资产,因为这将指示服务工作者在哪些文件上缓存以及何时缓存。像这样:
precacheAndRoute
默认情况下,服务工作者不知道要缓存哪些资产或HTTP响应,因此我们必须根据我们的要求定义和实施缓存策略。
我写了一篇有关service workers and the available caching strategies的文章。如果您想加深话题,请看一下。
答案 1 :(得分:0)
对于同时使用vue / cli-pligin-pwa和vue-cli 3的任何人,我已经解决了这个问题。
vue / cli-pligin-pwa可以缓存您的js文件以供您的Web应用程序脱机使用。
但是由于您使用的是单页应用程序,因此必须设置某种后备。
对页面例如(sample.com/about)的请求将是一个导航请求,它将为/index.html
的缓存页面提供服务所以我要做的是,通过在我的代码行中输入以下代码来创建自定义服务工作者 vue.config.js文件
// vue.config.js
module.exports = {
pwa: {
// configure the workbox plugin
workboxPluginMode: 'InjectManifest',
workboxOptions: {
swSrc: 'public/service-worker.js'
}
}
}
现在,在您的公用文件夹目录中创建一个 service-worker.js ,并从vue / cli-pligin-pwa中写下生成的代码行,并添加以下行: workbox.routing.registerNavigationRoute('/ index.html');
//service-worker.js
self.__precacheManifest = [].concat(self.__precacheManifest || []);
workbox.precaching.suppressWarnings();
workbox.precaching.precacheAndRoute(self.__precacheManifest, {});
workbox.routing.registerNavigationRoute('/index.html');
// install new service worker when ok, then reload page.
self.addEventListener("message", msg => {
if (msg.data.action == 'skipWaiting') {
self.skipWaiting()
}
})
答案 2 :(得分:0)
有一个更简单的解决方案,不涉及使用InjectManifest
。
只需将其添加到您的vue.config.js
文件中即可:
pwa: {
workboxOptions: {
navigateFallback: 'index.html'
}
}
它将自动向您的服务人员添加必要的代码:
workbox.routing.registerNavigationRoute(workbox.precaching.getCacheKeyForURL("index.html"));
我遇到了同样的问题,在这里找到了解决方案:https://github.com/vuejs/vue-cli/issues/717#issuecomment-382079361