开发者社区> 问答> 正文

自建钉钉企业内部应用h5页面缓存严重问题

前端设置添加了页面meta标签,包括项目打包hash文件名,后端也设置了响应头过期时间为0,nginx也配置了不缓存index.html。但是项目发布后,前端修改的代码在钉钉工作台h5进入并不能即时更新,包括项目中使用fetch进行no-cache标头进行请求项目版本文件方法也失效,包括后端修改数据库后再次访问接口,也是使用的缓存数据,请问各位大佬,还有什么解决的办法吗

展开
收起
游客tyuhpz4vdbpis 2024-01-29 16:42:41 432 0
1 条回答
写回答
取消 提交回答
  • 这个问题涉及到前后端协同以及多个层级的缓存控制。针对你所描述的情况,以下是一些排查和解决方案:

    1. 前端 meta 标签

      • 你应该已经在 HTML 文件中的 <head> 区域设置了如下的元标签,以禁用浏览器缓存:
        <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
        <meta http-equiv="Pragma" content="no-cache">
        <meta http-equiv="Expires" content="0">
        
      • 确保每个被缓存问题困扰的资源(特别是动态脚本和样式表)都带有正确的 Cache-Control 头部或哈希指纹,例如通过 Webpack 打包时加上 [contenthash]
    2. 后端响应头

      • 后端应当为所有不应缓存的动态接口设置合适的响应头,比如:
        Cache-Control: no-cache, no-store, max-age=0, must-revalidate
        Pragma: no-cache
        Expires: 0
        
    3. Nginx 配置

      • 对于入口的 index.html 文件,确保 Nginx 配置了不缓存策略,例如:
        location = /index.html {
            add_header Cache-Control 'no-cache, no-store, must-revalidate';
            expires off;
        }
        
      • 如果整个应用都是动态内容,可以考虑全局禁用缓存,或者至少对动态API路径做相应配置。
    4. Fetch 请求

      • 使用 Fetch API 发送请求时,明确指定 no-cache 缓存模式:
        fetch(url, {
            headers: {
                'Cache-Control': 'no-cache',
            },
            mode: 'cors', // 如果跨域的话
        });
        
    1. 服务端主动推送更新
      • 对于某些场景,可以尝试使用HTTP/2的Server-Sent Events (SSE) 或 WebSocket 推送更新通知给客户端。
    2024-01-29 18:05:22
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
基于英特尔 SSD 的虚拟机缓存解决SSD 立即下载
用户态高速块缓存方案 立即下载
高性能Web架构之缓存体系 立即下载