前端重新部署如何通知用户刷新网页信息_前端异步请求

前端重新部署如何通知用户刷新网页信息_前端异步请求1.目标场景 有时候上完线,用户还停留在老的页面,用户不知道网页重新部署了,跳转页面的时候有时候js连接hash变了导致报错跳不过去,并且用户体验不到新功能。 2.思考解决方案 如何去解决这个问题 思

image.png

1.目标场景

有时候上完线,用户还停留在老的页面,用户不知道网页重新部署了,跳转页面的时候有时候js连接hash变了导致报错跳不过去,并且用户体验不到新功能。

2.思考解决方案

如何去解决这个问题 思考中…

如果后端可以配合我们的话我们可以使用webSocket 跟后端进行实时通讯,前端部署完之后,后端给个通知,前端检测到Message进行提示,还可以在优化一下使用EvnentSource 这个跟socket很像只不过他只能后端往前端推送消息,前端无法给后端发送,我们也不需要给后端发送。

以上方案需要后端配合,奈何公司后端都在忙,需要纯前端实现。

重新进行思考…

根据和小伙伴的讨论得出了一个方案,在项目根目录给个json 文件,写入一个固定的key值然后打包的时候变一下,然后代码中轮询去判断看有没有变化,有就提示。

image.png

果然是康老师经典不知道。

image.png

但是写完之后发现太麻烦了,需要手动配置json文件,还需要打包的时候修改,有没有更简单的方案, 进行第二轮讨论。

第二轮讨论的方案是根据打完包之后生成的script src 的hash值去判断,每次打包都会生成唯一的hash值,只要轮询去判断不一样了,那一定是重新部署了.

image.png

3.代码实现

interface Options {
    timer?: number
}

export class Updater {
    oldScript: string[] //存储第一次值也就是script 的hash 信息
    newScript: string[] //获取新的值 也就是新的script 的hash信息
    dispatch: Record<string, Function[]> //小型发布订阅通知用户更新了
    constructor(options: Options) {
        this.oldScript = [];
        this.newScript = []
        this.dispatch = {}
        this.init() //初始化
        this.timing(options?.timer)//轮询
    }


    async init() {
        const html: string = await this.getHtml()
        this.oldScript = this.parserScript(html)
    }

    async getHtml() {
        const html = await fetch('/').then(res => res.text());//读取index html
        return html
    }

    parserScript(html: string) {
        const reg = new RegExp(/<script(?:\s+[^>]*)?>(.*?)<\/script\s*>/ig) //script正则
        return html.match(reg) as string[] //匹配script标签
    }

    //发布订阅通知
    on(key: 'no-update' | 'update', fn: Function) {
        (this.dispatch[key] || (this.dispatch[key] = [])).push(fn)  
        return this;
    }

    compare(oldArr: string[], newArr: string[]) {
        const base = oldArr.length
        const arr = Array.from(new Set(oldArr.concat(newArr)))
        //如果新旧length 一样无更新
        if (arr.length === base) {
            this.dispatch['no-update'].forEach(fn => {
                fn()
            })
        
        } else {
            //否则通知更新
            this.dispatch['update'].forEach(fn => {
                fn()
            })
        }
    }

    timing(time = 10000) {
         //轮询
        setInterval(async () => {
            const newHtml = await this.getHtml()
            this.newScript = this.parserScript(newHtml)
            this.compare(this.oldScript, this.newScript)
        }, time)
    }

}

代码用法

//实例化该类
const up = new Updater({
    timer:2000
})
//未更新通知
up.on('no-update',()=>{
   console.log('未更新')
})
//更新通知
up.on('update',()=>{
    console.log('更新了')
})

4.测试

执行 npm run build 打个包

安装http-server

使用http-server 开个服务

image.png

重新打个包npm run build

image.png

这样子就可以检测出来有没有重新发布就可以通知用户更新了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13419.html

(0)

相关推荐

  • Python章节详情

    Python章节详情Python语言是一种高级编程语言,由Guido van Rossum于1989年12月发明,可以应用于各种领域,如Web开发、数据科学、机器学习、人工智能等等。Python语言易于学习、读写和维护,使其成为了当今最受欢迎的编程语言之一。在本篇文章中,我们将深入介绍Python语言在编程领域的各个方面。

    2024-07-24
    37
  • mysql使用b+树的原因_b+树索引和hash索引

    mysql使用b+树的原因_b+树索引和hash索引https://www.jianshu.com/p/7ce804f97967 众所周知,MySQL的索引使用了B+树的数据结构。那么为什么不用B树呢? 先看一下B树和B+树的区别。 1.B树 维基百科

    2023-02-21
    858
  • redis笔记01[通俗易懂]

    redis笔记01[通俗易懂]起步 redis简介 redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. redis与其他key-value缓存产品有一下三个特点: redis支持数据的持久化,可…

    2023-02-06
    158
  • 利用Python编写CGI脚本实现Web应用程序

    利用Python编写CGI脚本实现Web应用程序CGI(Common Gateway Interface,通用网关接口)是一种标准,用于在Web服务器和应用程序(或脚本)之间传递数据。Python是一种流行的编程语言,具有易读易写和广泛的第三方库支持。Python的CGI模块提供了处理CGI请求和响应的功能。

    2024-01-26
    88
  • 查看Python安装路径

    查看Python安装路径在编写Python程序时,经常需要知道Python安装的路径。查看Python安装路径非常简单,只需要在控制台中输入:codepython -c “import sys; print(sys.executable)”/code即可。

    2024-09-06
    24
  • Python语法错误:意外保留字的解决方法

    Python语法错误:意外保留字的解决方法Python保留字是指在Python编程语言中被预留的关键字,这些关键字拥有特定的含义,不能被用户用于定义变量名、函数名、类名等。

    2023-12-08
    114
  • 中拓互联:雁门关景区官方网站启用顶级域名“雁门关.中国”[通俗易懂]

    中拓互联:雁门关景区官方网站启用顶级域名“雁门关.中国”[通俗易懂]随着五一假期完美收官,旅游成绩单也火热出炉。全国范围内的景区、旅游城市迎来了旅游业的复苏,旅游数据呈现出势头强劲的态势。面对全面复苏的旅游行业热

    2023-07-10
    124
  • 大连市发现62例无症状感染者行动轨迹_大连现有确诊病例

    大连市发现62例无症状感染者行动轨迹_大连现有确诊病例其中,在域外疫情地区来连人员排查中发现5例、在密切接触者排查中发现41例、在重点人群筛查中发现5例、在社会面主动筛查中发现11例,市疾控中心复核

    2023-06-27
    140

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注