我们试图强制客户端的浏览器在静态文件发生变化时重新加载它们。目前,我们的构建脚本会自动创建一个带有构建时间戳的新目录,并替换代码中的内容以指向该目录。
但是,我觉得这不是最佳解决方案。如果存在新构建,它会强制客户端浏览器加载每个文件,即使只有 1 个文件更改,构建时间也会因扫描每个文件并替换每个静态文件引用而显着增加。
我知道我们也可以在声明文件时设置版本(类似于 < link src="blahblah.css?version=1.1"/>),但这迫使我们更改所有代码以包含版本占位符和仍然有我们的构建脚本替换它。
有没有更聪明的方法来做到这一点?我们正在使用 Spring MVC。 mvc:resources 中是否有任何我不知道的选项可以在不更改代码的情况下执行此操作?或者 web.xml 上的东西?
我们正在使用 tomcat。有没有办法在服务器级别执行此操作?使用像 Varnish 之类的缓存会有所帮助吗?或者这些缓存只允许设置过期时间而不检查文件是否更改?请记住,我对服务器和缓存配置任务一点都不满意。
我发现了这个项目https://code.google.com/p/modpagespeed/
,但由于它离我的舒适区很远,我很难理解它的功能,如果这个帮助我想要的东西。
有人有什么想法吗? 谢谢
最佳答案
您可以使用版本作为查询参数,例如/resources/foo.js?_version=1.0.0
.如果您使用 Maven,从 /META-INF/maven/{groupId}/{artifactId}/pom.properties
获取版本信息并不难.当然,这将强制重新加载每个新版本的所有脚本……但新版本可能不会经常部署。
那么正确设置 HTTP 缓存 header 始终是一个好习惯。 <mvc:resources>
应该正确处理 Last-Modified
标题给你。还有你can set cache-period
使浏览器更频繁地检查资源修改。
关于Java web app : Force browser to load static content (js, css, html) 如果部署文件改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25533797/