UniGui禁用缓存

今天有人问到如何禁用缓存,原因是引用了第三方js,css等文件,但是因为缓存的原因,修改后没有及时生效。

首先纠正一点,地址后加?不会禁用缓存

可以看到,后面即使加了?但仍然是from memory cache。对于浏览器而言所有的文件加载都是Get方法,加不加?不影响。只要地址不变,就会使用缓存。

下面介绍几种禁用缓存的方法。

方法一:

在ServerModule的OnHTTPCommand事件中,加入以下代码

AResponseInfo.CacheControl := 'max-age=0, no-cache, no-store, must-revalidate, proxy-revalidate';

此代码的作用是禁止浏览器缓存,这样就不会缓存,每次请求都会向服务加载。

可以看到每次刷新都没有使用缓存,但是此方法有缺点,只支持exe模式, exe模式下所有的请求,无论是数据还是文件,都是由unigui服务器进行处理,而isapi模式下,文件请求都是由iis进行处理,所以没有执行到此代码,也就不会生效(iis可以设置自定义header来禁用缓存),同理HyperServer下也不生效,因为hy下文件处理由hy完成,同样没有执行到此代码。另外一个确定是会增加服务器压力,不缓存,那么所有文件在每次刷新的时候都会重新加载,就会增加服务器压力。解决方案是针对不同的文件进行禁用缓存,使用以下代码:

if ARequestInfo.URI = '/files/script.js' then

AResponseInfo.CacheControl := 'max-age=0, no-cache, no-store, must-revalidate, proxy-revalidate';

这样可以精确到单个文件进行缓存禁用。

TIPS:高级用法

可以在servermodule的onhttpcommand事件里增加一下代码

{$IFDEF DEBUG}

AResponseInfo.CacheControl := 'max-age=0, no-cache, no-store, must-revalidate, proxy-revalidate';

{$ENDIF}

这样可以在调试的时候不启用缓存,在调试过程中避免因为缓存、更换unigui版本、修改js/css文件等引起的报错。

方法二:

使用入口文件,新建一个js文件,写入以下代码

复制代码
document.write("<script type='text/javascript' src=' 
/files/script.js?t=" + Date.now() + "'><\/script>");

多个文件向下追加即可,其他文件均由此文件进行引入,不在单独进行引入。此代码的作用是在引入文件的时候后面追加t=当前时间这样每次加载的url地址就都不一样也就不会使用缓存。此方法适用各种模式。

相关推荐
haixingtianxinghai35 分钟前
Redis真的是单线程吗?
数据库·redis·缓存
尽兴-1 小时前
Redis7 底层数据结构解析
数据结构·数据库·缓存·redis7
深蓝电商API3 小时前
缓存策略在海淘代购系统中的应用
缓存·系统架构·跨境电商·代购系统·反向海淘·代购平台
庞轩px3 小时前
缓存Key设计的“七要七不要”
java·jvm·redis·缓存
難釋懷5 小时前
Redis分片集群手动故障转移
数据库·redis·缓存
用什么都重名7 小时前
Redis 入门与实践:从基础到 Stream 消息队列
数据库·redis·缓存
常利兵8 小时前
Spring Boot缓存新玩法:一键切换,租户无忧
spring boot·后端·缓存
Lyyaoo.9 小时前
Spring Boot日志
spring boot·缓存·单元测试
Curvatureflight10 小时前
Redis实战:缓存设计与高频场景全解析
数据库·redis·缓存
我真会写代码10 小时前
从入门到精通:Redis实战指南,解锁高性能缓存核心能力
数据库·redis·缓存