js请求避免缓存的三种方式

要确保每次请求都获取最新的资源,而不是从浏览器缓存中读取旧的版本,可以采取以下几种方式:

方法一:在 URL 上添加随机查询参数(推荐)

这是最简单有效的方式之一。通过为请求的 URL 添加一个随机参数(如时间戳或随机字符串),可以绕过浏览器缓存。

js 复制代码
export async function fetchRemoteJSAsText(url) {
    try {
        // 添加时间戳参数避免缓存
        const cacheBusterUrl = `${url}${url.includes('?') ? '&' : '?'}t=${Date.now()}`;
        
        const response = await fetch(cacheBusterUrl);
        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        }
        const text = await response.text();
        return text;
    } catch (error) {
        showFailToast('网络不良,请重试');
        return null;
    }
}

方法二:设置 Cache-Control 和 Pragma 请求头

也可以通过设置请求头来告诉浏览器不要使用缓存:

javascript 复制代码
// ... existing code ...
export async function fetchRemoteJSAsText(url) {
    try {
        const response = await fetch(url, {
            headers: {
                'Cache-Control': 'no-cache, no-store, must-revalidate',
                Pragma: 'no-cache',
                Expires: '0'
            }
        });
        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        }
        const text = await response.text();
        return text;
    } catch (error) {
        showFailToast('网络不良,请重试');
        return null;
    }
}

⚠️ 注意:某些 CDN 或服务器可能会忽略这些请求头,因此建议结合 方法一 使用。

方法三:服务器端配置(最佳实践)

如果可以控制目标服务器,可以在响应头中加入以下内容,强制浏览器不缓存该资源:

http 复制代码
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0

总结

  • 如果无法修改服务器配置,推荐使用 方法一(加随机参数)。
  • 如果你有权限控制服务器行为,方法三(服务端禁用缓存) 是最彻底的做法。
  • 方法二(设置请求头) 在大多数情况下也有效,但可能受服务器配置影响。
  • 可以选择其中一种或组合使用以确保每次都获取最新内容。
相关推荐
千码君201615 小时前
React Native:从react的解构看编程众多语言中的解构
java·javascript·python·react native·react.js·解包·解构
Evand J16 小时前
【MATLAB例程】基于USBL和DVL的线性回归误差补偿,对USBL和DVL导航数据进行相互补偿,提高定位精度,附代码下载链接
开发语言·matlab·线性回归·水下定位·usbl·dvl
RoboWizard17 小时前
扩容刚需 金士顿新款Canvas Plus存储卡
java·spring·缓存·电脑·金士顿
爱喝白开水a17 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
Neverfadeaway18 小时前
【C语言】深入理解函数指针数组应用(4)
c语言·开发语言·算法·回调函数·转移表·c语言实现计算器
武子康18 小时前
Java-152 深入浅出 MongoDB 索引详解 从 MongoDB B-树 到 MySQL B+树 索引机制、数据结构与应用场景的全面对比分析
java·开发语言·数据库·sql·mongodb·性能优化·nosql
杰克尼18 小时前
JavaWeb_p165部门管理
java·开发语言·前端
EndingCoder18 小时前
WebSocket实时通信:Socket.io
服务器·javascript·网络·websocket·网络协议·node.js
我胡为喜呀18 小时前
Vue3 中的 watch 和 watchEffect:如何优雅地监听数据变化
前端·javascript·vue.js
一成码农18 小时前
JavaSE面向对象(下)
java·开发语言