监听上传的服务器文件是否改变,从而刷新页面
监听上传的服务器文件是否改变,从而刷新页面=>
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')
// })
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?