处理 Service Worker
在这里,您将学习如何从网站/应用程序中与 Service Worker 进行交互。请记住,必须通过 HTTPS 提供 service worker 服务。
第一点很重要,您需要知道 Service Worker 运行在一个单独的线程中,但是您可以通过 /src-pwa/register-service-worker.js
使其与应用程序空间进行交互。
与 Service Worker 交互
注意,Quasar CLI 已经集成了 register-service-worker npm 包,所以您不需要再手动安装它。
// src-pwa/register-service-worker.js file
import { register } from 'register-service-worker'
register(process.env.SERVICE_WORKER_FILE, {
ready (registration) {
console.log('Service worker is active.')
},
registered (registration) {
console.log('Service worker has been registered.')
},
cached (registration) {
console.log('Content has been cached for offline use.')
},
updatefound (registration) {
console.log('New content is downloading.')
},
updated (registration) {
console.log('New content is available; please refresh.')
},
offline () {
console.log('No internet connection found. App is running in offline mode.')
},
error (error) {
console.error('Error during service worker registration:', error)
}
})
TIP
构建时 Quasar CLI 会将此文件与 /src
一起作为应用的一部分打包到构建产物中。所以您可以在其中使用 ES6,导入其他文件……
SSL 证书
您可能会注意到,在某些开发环境中,如果您不使用 HTTPS 服务,即使在本地主机上,Workbox 也不会在 quasar dev
期间加载 service worker,您会发现有两个脚本无法加载,Chrome 浏览器的控制台可能不会打印相关信息,但是 Firefox 浏览器的控制台会打印它们。有以下三种解决办法:
- 设置 quasar.config.js > devServer >
https: true
- 设置从 localhost 到 127.0.0.1 的回环地址(但这不是没有安全隐患)。
- 使用 tunnelmole, localhost.run 或 ngrok 和他们提供的 https 地址。
下面有一个使用 tunnelmole 的示例(请先安装它:yarn global add tunnelmole
或 npm i -g tunnelmole
):
$ tmole 80
http://b8ootd-ip-157-211-195-182.tunnelmole.com is forwarding to localhost:80
https://b8ootd-ip-157-211-195-182.tunnelmole.com is forwarding to localhost:80
# ...并使用控制台中显示的 HTTPS 地址
当在 quasar.config.js 文件中设置 devServer > https: true
时,Quasar 会利用 webpack 自动生成一个 SSL 证书。如果您希望使用自己的证书,请参考:Filippo 的博客。然后您的 quasar.config.js > devServer > https
应该像这样:
// quasar.config.js
devServer: {
htpps: {
// Use ABSOLUTE paths or path.join(__dirname, 'root/relative/path')
key: "/path/to/server.key",
pfx: "/path/to/server.pfx",
cert: "/path/to/server.crt",
ca: "/path/to/ca.pem",
passphrase: 'webpack-dev-server' // do you need it?
}
}
更多关于 Webpack 和 Https 的信息参考这里.
重要的部署主机配置
有一点很重要,不要允许浏览器缓存 Service Worker 文件(默认为 sw.js
),否则,应用的更新可能因为浏览器从缓存中加载 service-worker 而被忽略。
所以在部署的主机上,必须为 sw.js
文件添加 "Cache-Control": "no-cache"
响应头。
例如,使用 Google Firebase 部署时,需要在 firebase.json
中添加如下配置:
{
"hosting": {
"headers": [
{ "source":"/sw.js", "headers": [{"key": "Cache-Control", "value": "no-cache"}] }
]
}
}