首页 > 其他分享 >监听上传的服务器文件是否改变,从而刷新页面

监听上传的服务器文件是否改变,从而刷新页面

时间:2023-10-11 15:24:39浏览次数:33  
标签:const string update dispatch html 上传 监听 fn 页面

 

监听上传的服务器文件是否改变,从而刷新页面=>

interface Options {
  timer?: number;
}

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 || 10000); //轮询
  }

  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*>/gi); //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 NewUpdater = new Updater({
  timer: 10000
});

export default NewUpdater;


// import NewUpdater from '@/utils/Updater';
// //未更新通知
// NewUpdater.on('no-update',()=>{
//   console.log('未更新1111111')
// })
// //更新通知
// NewUpdater.on('update',()=>{
//   console.log('更新了22222222')
// })

 

标签:const,string,update,dispatch,html,上传,监听,fn,页面
From: https://www.cnblogs.com/dreamtt/p/17757261.html

相关文章

  • DELL R730 idrace web页面无法显示,可不重启服务器,ssh登录重启idrace服务
    故障现象:Dell服务器带外管理Idrace的web页面无法显示。处理过程:  无需冷启动服务器  ssh登录Dell服务器带外管理地址用户名与密码同为登录web页面账号密码  运行重启命令:racadmracreset  等待约2分钟后,Idrace带外管理web页面恢复正常显示,可正常登录。racadmrac......
  • 视频直播源码,AndroidStudio登录页面的切换
    视频直播源码,AndroidStudio登录页面的切换xml代码 <?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"  xmlns:app="http://schemas.android.com/apk/res-auto"  ......
  • 文件上传ssh 并显示进度条
    importosimportparamikoimporttimedefdownload_file_with_progress(hostname,port,username,password,remote_path,local_path):ssh=paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect(hostname=hostname,p......
  • Chrome安装后打不开任何页面 & 改名后图标变成小白块
    【网上最简单】Chrome安装后打不开任何页面&改名后图标变成小白块[30秒解决] 自从76版本后,我发现Chrome更新后,打不开任何网页,我就再也没有升级,停留在76.0.3809.87。最近Chrome大版本升级到了85,网上说是“史诗级”增强,我就心动了,但是升级后,然e...还是和以前一样,不是说升级了......
  • java如何做大体积的文件上传和下载
    在Java中,实现大体积文件的上传和下载涉及到处理文件的分片、并发上传、断点续传等问题。本文将详细介绍如何通过Java实现大体积文件的上传和下载。1.文件上传文件上传是将本地文件上传到服务器的过程。对于大体积文件的上传,我们可以将文件分成多个小片段进行并发上传。1.1文件......
  • 如何优雅的上传博客
    平常使用markdown(Typora)写文档很方便,在各式各样的平台展示都不成问题。但是图片上传博客平台却很不方便,上传git平台另说。这里介绍一个本人修改的博客图片上传工具,xle97/dotnet-cnblogs......
  • fasthttp + `page partial gziped cache`: 页面输出服务性能提升20%
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯接上一篇:http中使用gzip输出内容时,如何预先压缩前一半页面?经过实测,对线上一个输出html的服务进行了改造,通过预先压缩页面前半部分的方法,此接口的性能提升了20%.......
  • 前端如何实现大文件上传
    在开发过程中,经常会遇到一些较大文件上传,如果只使用一次请求去上传文件,一旦这次请求中出现什么问题,那么无论这次上传了多少文件,都会失去效果,用户则需要重新上传所有资源。所以就想到一种方式,将一个大文件分成多个小文件,这样通过多个请求实现大文件上传。接下来我们就来看看具体......
  • vue实现简单的页面框架
    效果图:代码结构:......
  • git上传至公共或私有github
    1.下载gitbash参考链接:https://git-scm.com/download2.创建git的秘钥gitconfig--globaluser.name"githubname"gitconfig--globaluser.email"githubemail"ssh-keygen-trsa-C"githubemail"其中:githubname是你的名称,githubemail是你的邮箱3.添加de......