前端的日益发展,都离不开性能优化的手段,包括 CDN、CSS Sprite、文件的合并压缩、异步加载、资源缓存等等。更多的时候为了减小用户量的请求,因而就有了PWA,秒开网站,离线访问等等的炫酷装B技能。html
因而就火烧眉毛想拉开PWA神秘的面纱,使用到下面的:前端
先上图:vue
vuecli3.0react
register-service-workergit
使用过 create-react-app 的小伙伴确定知道,react官方推荐的脚手架中默认佩带有 register-service-worker的包,通过打包后,额外生成如下文件:github
`manifest.json: 可配置该应用在浏览器,桌面中的打开方式,应用名字,应用运行动画等等chrome
service-worker.js: 可看到被压缩打包好的service worker的安装,激活、卸载等等的功能与配置express
asset-manifest.json: 离线下强制缓存的文件,使得APP可在离线下运行npm
有关service worker的详细问题可经过如下连接查看:json
后端配置
//如下的Code设置了公用的响应头中返回的强缓存时间、CORS跨域等等
app.all("*", function(req, res, next) {
if(req.path !== "/" && !req.path.includes(".")) {
res.header("Access-Control-Allow-Origin", req.headers["origin"] || "*")
res.header("Access-Control-Allow-Credentials", true)
res.header("Access-Control-Allow-Headers", 'Content-Type,Content-Length, Authorization, authorization,\'Origin\',Accept,X-Requested-With')
res.header("Access-Control-Allow-Methods", "POST,GET,PUT,DELETE,OPTIONS")
res.header("Content-Type", "application/json;charset=utf-8")
if(req.method.toUpperCase() === "GET"){
res.header("Cache-Control","max-age=7200")
}
}
next()
})
复制代码
经过设置请求缓存后,静态资源都必须设置为强制缓存,才能达到离线访问的效果。
此次采坑中遇到神坑的问题,当服务器设置了响应头res.header("Access-Control-Allow-Origin", req.headers["origin"] || "*")
后,若是同一个浏览器都是GET到该服务器的请求,则会报错,报错中显示跨域禁止,由于上面设置的强制缓存的缘由,浏览器会主动缓存该GET请求,因此缓存中的GET请求的响应头中的Access-Control-Allow-Origin
(设置容许域名跨域)会显示第一次发出GET请求的域名,而第二次同一个浏览器不一样的域名去GET这个请求,则Access-Control-Allow-Origin
返回的是第一个请求的域名,因此会报错。
最后经过打包后,第一次访问SPA时,service worker会自动缓存该SPA中所须要的资源,而AJAX请求的数据,则是被浏览器主动缓存的,从而能够达到缓存的效果,在安卓的高版本的chrome中,还能够将该SPA像APP同样打包下载到桌面上,有本身的开机动画等等。
在评论处感谢王品洲
的提醒:(PC)Chrome不能添加到桌面上 :能够试试 F12->Application-> Manifest ->Add to homesreen