先后台分离的WEB应用项目上线时,会因浏览器的自动缓存策略而发生一些错误。好比项目的先后台同时由V1.0升级为了V1.1。此时因为浏览器缓存,用户在打开项目地址时仍然使用了缓存中的V1.0的代码。这便会发生V1.0的前台调用V1.1的后台的BUG。typescript
本文以angular为例,阐述一种前台更新后项目浏览器自动刷新的解决方案。json
本文示例代码地址:https://stackblitz.com/edit/angular-2k4qy2浏览器
想实现前台若是更新后便从新强制浏览器刷新的功能,则须要加入一个版本号来进行控制。在系统启动时读取前台的版本号,而后与服务器上的版本号进行比对。若是版本号相同,则说明浏览器当前加载的前台与服务器提供的前台的版本是统一的,则什么也不作;若是版本号不一样,则说明浏览器当前加载的版本与服务器提供的版本不统一,则强制浏览进行刷新以清除缓存带来的影响。缓存
在项目的src/assets文件夹中新建config.json
,并加入如下信息以记录当前应用的版本号:服务器
{ "version":"1.0.0" }
线上演示的需求,咱们必须将其创建在src/assets中。实际的生产项目中,能够将其按需创建在src文件夹下的任意位置。
若要对版本号进行比对,则须要获取两个版本号:第1个为WEB应用运行的版本号,第2个为服务器提供的WEB应用的版本号。ui
当这两个版本号不统一时,则说明当前运行的版本与服务器提供的版本不一致,便应进行强制刷新。this
export class AppComponent implements OnInit { private config: {version: string}; ➊ ngOnInit() { this.config = require('./../assets/config.json'); ➋ console.log(this.config.version); } }
export class AppComponent implements OnInit { constructor(private httpClient: HttpClient) { } private config: {version: string}; ngOnInit() { this.config = require('./../assets/config.json'); console.log(this.config.version); this.httpClient.get<{version: string}>('/assets/config.json') .subscribe(config => { console.log(config); }); ➊ } }
值得注意的是,在请求后台的config.json
时,浏览器最终调用的可能也是缓存的数据,这时候就须要在请求的header上作点文章,强制浏览器在请求config.json
时弃用缓存:spa
ngOnInit() { this.config = require("./../assets/config.json"); console.log(this.config.version); const headers = new HttpHeaders() .set('Cache-Control', 'no-cache') .set('Pragma', 'no-cache'); ➊ this.httpClient .get<{ version: string }>("/assets/config.json", {headers➋}) .subscribe(config => { console.log(config); }); }
location中提供了reload(true)方法来进行页面的强制刷新:code
.subscribe(config => { if (config.version !== this.config.version) { location.reload(true); ➊ } });
但不知何种缘由,该方法被标识为弃用。简单的查了一些资料,有人说这个方法可能在后面的版本中被浏览器弃用,因而使用如下代码进行页面刷新操做:blog
if (config.version !== this.config.version) { this.httpClient .get(""➊, { headers➋, responseType: "text"➌ }) .subscribe(() => location.reload()➍); }
在前台后分离的应用中,自动的进行缓存的判断当有助于客服人员大幅的减轻压力,加强用户对系统的粘稠度。本文使用暴露前台的版本文件并进行比对的方法,来判断是否要强制刷新浏览器缓存;再结合httpClient发请对loading页的请求,以达到间接的强制刷新浏览器缓存的目的。