versionUpdater.js 1.8 KB
/*
 * @Date: 2024-02-06 11:38:13
 * @LastEditors: hookehuyr hookehuyr@gmail.com
 * @LastEditTime: 2024-02-06 12:01:32
 * @FilePath: /xysBooking/src/utils/versionUpdater.js
 * @Description: 文件描述
 */
/* eslint-disable */
export class Updater {
    constructor(options = {}) {
        this.oldScript = [];
        this.newScript = [];
        this.dispatch = {};
        this.init(); //初始化
        this.timing(options.time); //轮询
    }

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

    async getHtml() {
        // TAG: html的位置需要动态修改
        const html = await fetch(import.meta.env.VITE_BASE).then((res) => res.text()); //读取index html
        return html;
    }

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

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

    compare(oldArr, newArr) {
        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);
    }
}