自动更新脚本实现指南:让您的应用始终保持最新(JavaScript版)

代码概述

该自动更新脚本用于在页面加载后定期检查新版本的脚本,并在发现新版本时提示用户刷新页面。以下是各个模块的详细分析:

设置更新检查间隔

const CHECK_INTERVAL = 10 * 1000; // 每10秒检查一次更新

该常量定义了更新检查的间隔时间,单位为毫秒。在此脚本中,每10秒检查一次更新。

记录页面状态

let isPageHidden = false; // 页面是否隐藏

此变量用于记录页面是否处于隐藏状态,以避免在页面不可见时进行不必要的更新检查。

定时器ID和更新提示控制

let updateTimerId = null; // 定时器ID
let shouldShowUpdatePrompt = true; // 是否需要提示用户更新

updateTimerId 用于存储定时器的ID,以便在需要时停止定时器。shouldShowUpdatePrompt 用于控制是否需要提示用户更新。

脚本标签存储

let oldScripts = []; // 旧的脚本标签数组
let newScripts = []; // 新的脚本标签数组

这些数组分别用于存储旧的和新的脚本标签,以便进行比较。

获取HTML内容

async function fetchHtml() {
    try {
        const response = await fetch('/');
        if (!response.ok) {
            throw new Error('Failed to fetch HTML');
        }
        return response.text();
    } catch (error) {
        console.error('Error fetching HTML:', error);
        return '';
    }
}

该函数使用 fetch API 获取页面的HTML内容,并处理可能的错误。如果获取失败,会返回一个空字符串。

解析HTML中的脚本标签

function parseScripts(html) {
    const scriptRegex = /<script(?:\s+[^>]*)?>(.*?)<\/script\s*>/ig;
    return html.match(scriptRegex) || [];
}

使用正则表达式解析HTML中的脚本标签,并返回匹配到的脚本标签数组。如果没有匹配的标签,则返回一个空数组。

初始化检查更新流程

async function initializeUpdateCheck() {
    const html = await fetchHtml();
    oldScripts = parseScripts(html);
    console.log('Old scripts:', oldScripts);
}

该函数在初次加载时获取当前页面的HTML内容并解析出脚本标签,存储在 oldScripts 数组中。

比较新旧脚本标签

async function compareScripts(oldArr, newArr) {
    console.log('Comparing scripts:', oldArr, newArr);
    const combinedLength = new Set(oldArr.concat(newArr)).size;
    if (combinedLength !== oldArr.length) {
        console.warn('Scripts have been updated.');
        return true;
    }
    return false;
}

该函数比较新旧脚本标签数组,如果脚本标签的数量发生变化,返回 true 表示需要刷新页面,否则返回 false

自动更新检查

async function autoUpdateCheck() {
    updateTimerId = setTimeout(async () => {
        const newHtml = await fetchHtml();
        newScripts = parseScripts(newHtml);

        // 页面隐藏时不检查更新
        if (!isPageHidden) {
            const shouldRefresh = await compareScripts(oldScripts, newScripts);
            if (shouldRefresh && shouldShowUpdatePrompt) {
                // 延时更新,防止部署未完成用户就刷新页面
                setTimeout(() => {
                    // 提示用户刷新页面
                    window.dispatchEvent(
                        new CustomEvent("onmessageUpdate", {
                            detail: {
                                msg: "发现系统版本更新,请刷新页面~",
                                version: '1.0.0' // 可动态获取版本号
                            },
                        })
                    );
                }, 10000);
                shouldShowUpdatePrompt = false;
            }
        }

        if (shouldShowUpdatePrompt) {
            autoUpdateCheck();
        }
    }, CHECK_INTERVAL);
}

该函数使用定时器定期检查更新,并在发现新版本时通过自定义事件通知用户刷新页面。页面隐藏时不进行更新检查,以减少不必要的资源消耗。

停止更新检查

function stopUpdateCheck() {
    if (updateTimerId) {
        clearTimeout(updateTimerId);
        updateTimerId = null;
    }
}

该函数用于停止定时器,从而停止更新检查。

开始检查更新

async function startUpdateCheck() {
    await initializeUpdateCheck();
    autoUpdateCheck();

    // 监听页面隐藏和显示事件
    document.addEventListener('visibilitychange', () => {
        isPageHidden = document.hidden;
        if (!isPageHidden && shouldShowUpdatePrompt) {
            autoUpdateCheck();
        } else {
            stopUpdateCheck();
        }
    });
}

该函数启动更新检查流程,并监听页面的可见性变化,以决定是否继续进行更新检查。

导出启动函数

export default { start: startUpdateCheck };

最后,将启动更新检查的函数导出,以便在其他模块中使用。

✨ 效果展示

这个提示可以自己根据工程所用的UI组件库自行实现效果,示例图是基于 ElementUI 组件库实现
效果预览

🎀 结论

通过以上步骤,我们实现了一个简单但功能强大的自动更新脚本。它可以定期检查更新,并在发现新版本时提示用户刷新页面,从而确保用户始终使用最新版本的应用程序。这种自动化更新机制可以显著提升用户体验和应用程序的稳定性。
🎉 如果你有任何问题或建议,欢迎在评论区留言讨论!也可以去 苏宛墨の小破站 留言讨论!

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值