You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Array.map()仅筛选展示缓存中的HTML文件

仅筛选展示缓存中HTML文件的实现

你只需要在生成列表前对缓存键数组做过滤即可,不需要改动原有渲染逻辑,有两种常用实现:

  • 后缀判断法:实现简单性能高,适合绝大多数路由规则清晰的站点
  • 响应头判断法:匹配最精准,适合缓存资源类型复杂、文件后缀不统一的场景

后缀判断实现

直接通过URL路径判断是否为HTML资源,可以兼容.html后缀的文件和无后缀的页面路由(比如/home、/docs/intro这类路由形式的HTML页面),修改后的完整代码如下:

<div data-offline></div>
<script>
    if (navigator && navigator.serviceWorker) {
        caches.open('pages').then(function (cache) {
            cache.keys().then(function (keys) {
                var offline = document.querySelector('[data-offline]');
                var listHtml = keys
                    .filter(function(key) {
                        var path = new URL(key.url).pathname;
                        // 匹配.html后缀,或路径中无.的页面路由
                        return path.endsWith('.html') || path.lastIndexOf('.') < path.lastIndexOf('/');
                    })
                    .map(function(key) {
                        return '<li><a href="' + key.url + '">' + key.url + '</a></li>';
                    })
                    .join('');
                offline.innerHTML = '<ul>' + listHtml + '</ul>';
            });
        });
    }
</script>

响应头判断实现

如果你的缓存里存在后缀不规范的HTML文件,可以读取缓存响应的Content-Type头,通过MIME类型精准判断是否为HTML资源,代码如下:

<div data-offline></div>
<script>
    if (navigator && navigator.serviceWorker) {
        caches.open('pages').then(function (cache) {
            cache.keys().then(function (keys) {
                // 遍历所有键匹配响应类型
                Promise.all(keys.map(function(key) {
                    return cache.match(key).then(function(res) {
                        if (res.headers.get('Content-Type').indexOf('text/html') !== -1) {
                            return '<li><a href="' + key.url + '">' + key.url + '</a></li>';
                        }
                        return '';
                    });
                })).then(function(items) {
                    var offline = document.querySelector('[data-offline]');
                    offline.innerHTML = '<ul>' + items.filter(Boolean).join('') + '</ul>';
                });
            });
        });
    }
</script>

注意:如果你的站点有其他无后缀的静态资源(比如无后缀的图片、接口响应),建议用第二种方案,避免误筛选。

内容的提问来源于stack exchange,提问作者rocco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.07 14:12:27