最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • [前端项目创新]前端检测版本更新的简易之道

    正文概述 掘金(村上小树)   2020-12-26   424

    1.需求分析

    通常前端项目经开发迭代需求或者临时修复bug而上线后,我们都希望用户端能迅速检测项目已更新而去刷新页面。检测项目跟新的方法有很多,我这里提供一个适用度较高的简单易行的方法。

    2.代码示例及分析

    先直接贴源码:

    // 用于记录时间戳的变量,时间戳是响应头中的etag和last-modified字段其中之一
    let previousTimeTag
    
    (async function () {
        // 通过立即执行函数,记录首次请求的时间戳,以便与后面轮询得出的时间戳进行对比
        previousTimeTag = await getTimeTag()
        window.versionMonitor&&clearInterval(window.versionMonitor)
        // 开启轮询执行judge函数
        window.versionMonitor = setInterval(() => {
            judge()
        }, 60 * 1000)
    }())
    
    async function getTimeTag () {
        const response = await fetch(`${window.location.protocol}//${window.location.host}`, {
            method: 'HEAD',
            cache: 'no-cache'
        })
        // 以响应体的etag或者last-modified为时间戳
        return response.headers.get('etag') || response.headers.get('last-modified')
    }
    
    async function judge () {
        // 获取当前最新的时间戳
        const currentTimeTag = await getTimeTag()
        // 检测到最新请求的时间戳和上一次不一致,即文件发生变化
        if (previousTimeTag !== currentTimeTag) {
            // 这里编写更新逻辑
        }
    }
    

    其实逻辑非常简单,就是在记录首次请求时协商缓存中的etag或者last-modified作为最先的时间戳previousTimeTag,然后轮询请求同样的地址获取最新的时间戳currentTimeTag。如果previousTimeTagcurrentTimeTag不一致,执行刷新提示逻辑。流程图如下所示:

    [前端项目创新]前端检测版本更新的简易之道

    缺陷:如果服务器禁止协商缓存,那就没办法使用该方法了。

    3.代码细节分析

    1.etag和last-modified

    [前端项目创新]前端检测版本更新的简易之道

    两者都是响应头中记录关于协商缓存的字段。

    etag是与Web资源关联的记号(token),可以理解是对应Web资源的内容生成的hash码。如果两份Web资源的内容不一致,生成的etag也不一致。属于HTTP1.1的字段。

    last-modified用于记录Web资源的最后修改时间。属于HTTP1.0的字段。

    引用网上文章来说明为啥etag优先级要高于last-modified

    2.HEAD请求方法

    HEAD和GET本质是一样的,区别在于HEAD只含有相应中的相应行和响应头,不带响应体。通常用于检测服务器中某个文件是否存在。因为没有响应体,所以相应体积更小,响应时间更短。

    3.fetch中的cache设置

    default: 协商缓存和强缓存共用

    • 如果缓存匹配上并且有效( fresh), 它将直接从缓存中返回资源。
    • 如果缓存匹配上但已经过期 ,浏览器将会使用传统( conditional request )的请求方式去访问远程服务器 。如果服务器端显示资源没有改动,它将从缓存中返回资源。否则,如果服务器显示资源变动,那么重新从服务器下载资源更新缓存。
    • 如果缓存没有匹配,浏览器将会以普通方式请求,并且更新已经下载的资源缓存。

    no-store: 浏览器直接从远程服务器获取资源,不查看缓存,并且不会使用下载的资源更新缓存。

    reload: 浏览器直接从远程服务器获取资源,不查看缓存,然后使用下载的资源更新缓存。

    no-cache: 浏览器在其HTTP缓存中寻找匹配的请求。

    • 如果有匹配,无论是新的还是陈旧的,浏览器都会向远程服务器发出条件请求。如果服务器指示资源没有更改,则将从缓存中返回该资源。否则,将从服务器下载资源并更新缓存。 
    • 如果没有匹配,浏览器将发出正常请求,并使用下载的资源更新缓存。

    更多详细可以查看MDN文档:developer.mozilla.org/zh-CN/docs/…


    起源地下载网 » [前端项目创新]前端检测版本更新的简易之道

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元