Vaadin @Javascript: 清除更新后的JS文件缓存

7

我在我的应用程序中使用@JavaScript注释来从类路径中加载.js文件。

现在我已经更新了文件并重新部署了(本地),但我始终得到旧版本。我尝试重新加载所有内容(ctrl+R, ctrl+F5),但那不起作用,而且我也不希望用户这样做。

我过去使用的一个技巧(没有Vaadin)是附加一个请求参数与版本(例如?version=1),并更新URL以便更改它。 但显然,@JavaScript注释不允许这样做(Vaadin甚至不会尝试加载该文件)。


也许你的应用程序在 UI 对象上使用了 @PreserveOnRefresh 注释?这可能会阻止 Vaadin 重新加载任何 JS。 - Danny Daglas
不,我没有使用@PreserveOnRefresh。此外,我已经重新启动了服务器,所以那也不会有任何影响。目前我只是更改了文件名(添加了_vxxx,其中xxx是一个数字),这样就可以了。 - herman
所以你的意思是,即使重新启动服务器,旧文件仍然存在?你能在目标目录中使用 find 查找该文件吗?可能有多个文件(例如来自 IDE 和构建工具),如果两者都在类路径中,则只会选择一个。 - cfrick
好了,至少现在我已经重命名了文件,旧名称的文件也不再存在了。在重命名之前,我确实检查了“target”文件夹中的文件,并且它已包含新内容,但是在浏览器中仍然显示旧内容。 - herman
4个回答

4
我通过利用Vaadin servlet配置中的resourceCacheTime参数来解决了这个问题:
@VaadinServletConfiguration(ui = MyUI.class, resourceCacheTime = 0)

虽然如我在这里的另一个问题中所述,它有其局限性。


1
这是浏览器的功能,用于本地缓存JS文件,与Vaadin无关。正如您自己发现的那样:如果您想确保用户拥有最新版本的JS文件,则应将JS文件名更改为:script_buildNumber.js

我不同意这与Vaadin无关:网页应用程序有办法告诉浏览器不要缓存某些资源。我自己想到了重命名文件的解决方法,但那只是一个权宜之计。至少能够添加一个请求参数可以避免我在版本控制中改变文件的实际名称。 - herman
在容器重新启动后,新文件肯定会从磁盘上加载,并且在默认配置下,在Fx中进行CTRL-F5重新加载将拉取新文件。 - cfrick

0

使用Chrome的无痕浏览功能(但在访问辣鸡/不愉快的网站时不要使用它)。

只需在无痕模式下打开您的浏览器https://support.google.com/chrome/answer/95464?hl=en,浏览器将不会缓存任何内容。

其他浏览器也有此功能(Opera、IE、Firefox、Safari)。


我不希望我的用户必须在隐身模式下访问我的Web应用程序,以确保他们拥有最新的JavaScript文件。Vaadin应该提供一种告诉浏览器不要缓存它们的方法,或者支持向名称添加请求参数,以便文件不必被物理重命名。 - herman
当然,我同意你的看法,我以为你只需要它来进行开发。 - tonix

0
正如我在1月12日关于这个问题的评论中所指出的,重命名文件是有效的。虽然这似乎是目前唯一的方法,但远非理想。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接