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

前端重新部署如何通知用户刷新网页信息_前端异步请求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)

相关推荐

  • js 回到页面顶部_js重新加载当前页面

    js 回到页面顶部_js重新加载当前页面首先我们新建一个空页面,把body的高度设置为3000px。这样做的目的是让浏览器出现滚动条,不然我们还得放很多的内容把页面撑起来。 html部分我们写两个div,一个是标志位,放在浏览器的顶部,这样

    2023-08-21
    83
  • 袋鼠云app_袋鼠查

    袋鼠云app_袋鼠查不知不觉间,2022年的脚步已经走到了倒数第二个月。临近年末,我们对产品本身以及客户反馈的一些问题进行了持续的更新和优化,例如基线告警、数据服务平台新增TDengine 数据源支持、行级权限根据用户属

    2023-06-14
    97
  • 数据库-MySQL

    数据库-MySQL数据库-MySQL 一日不思量,也攒眉千度。 简介:数据库-MySQL。 一、索引 B+ Tree 原理 树简介参考链接:https://www.cnblogs.com/taojietaoge/p/1

    2023-04-19
    109
  • 线上服务器上的数据库启动不起来了 如何恢复数据「终于解决」

    线上服务器上的数据库启动不起来了 如何恢复数据「终于解决」前言 同事不知道线上数据库里面有正在运行的数据,直接kill掉了,重新装了一个新的数据库。然后,悲剧发生了,线上服务突然访问不了,查看日志,发现是数据库连不上了,他偷偷的新的数据库停了,然后准备重启…

    2023-03-30
    99
  • 用PyQt5实现QLineEdit

    用PyQt5实现QLineEditQLineEdit是PyQt5的核心类之一,它是一个编辑文本的窗口组件。在本文中,我们将会详细介绍如何使用PyQt5来实现QLineEdit。

    2024-05-08
    18
  • 给 Python 项目添加关键信息的继承

    给 Python 项目添加关键信息的继承在 Python 项目中,我们经常需要给不同的类或模块添加一些共同的关键信息,比如日志、权限等。而这些关键信息的添加往往需要在每个类或模块中单独处理,代码重复、风险增加。此时,使用继承可以大大减少重复代码、增加可读性和可维护性。

    2023-12-15
    59
  • redis缓存穿透缓存穿透缓存雪崩_redis缓存穿透怎么解决

    redis缓存穿透缓存穿透缓存雪崩_redis缓存穿透怎么解决NoSQL 开发中或多或少都会用到,也是面试必问知识点。最近这几天的面试每一场都问到了。但是感觉回答的并不好,还有很多需要梳理的知识点。这里通过几篇 Redis 笔记整个梳理一遍,后面再加上面试题。

    2023-02-28
    101
  • 如何查看Python版本

    如何查看Python版本在Python的学习过程中,我们需要经常查看自己电脑上Python的版本信息。这有助于我们了解当前安装的Python环境,根据实际情况编写代码。

    2024-05-01
    43

发表回复

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