scala 为什么Play Framework不重新加载资源?

t98cgbkg  于 2023-10-18  发布在  Scala
关注(0)|答案(3)|浏览(139)

我在开发模式下启动了我的play应用程序,并试图更改索引html文件,但play没有更新它。我的应用程序只包括公共文件夹中的资产,为了看到更改,我必须重新启动应用程序。我的观察表明,play编译target/web/public/main目录中的资源,并且在public目录中的文件更改时不更新它
我应该如何配置我的应用程序,以便在更改时重新加载所有资产?

li9yvcax

li9yvcax1#

某些浏览器会将资源缓存在您的公共文件夹中,因此当播放服务器提供新内容时,您仍然会看到旧内容。如果您使用的是Chrome,您可以通过执行硬重载(Ctrl+Shift+R)来清除缓存,这将迫使它再次从服务器获取所有内容。
一个更好的解决方案是使用资产指纹,您可以在这里找到有关信息。这基本上意味着,当资产的内容发生变化时,资产的名称也会发生变化,因此您的浏览器将意识到它需要下载新文件,而不是提供缓存的文件。要做到这一点很简单-在您的路由文件中,更改

GET  /assets/*file        controllers.Assets.at(path="/public", file)

GET  /assets/*file  controllers.Assets.versioned(path="/public", file: Asset)

当你需要引用一个资产时,不要使用Assets.at,而要使用Assets.versioned ie。

<link rel="stylesheet" href="@routes.Assets.at("stylesheets/main.css")">

成为

<link rel="stylesheet" href="@routes.Assets.versioned("stylesheets/main.css")">

然而,正如Kris在他的评论中所说,如果你要使用twirl模板系统(你的索引页面在app/views/index.scala.html中,而不是将其作为公共文件夹中的资产)Play将在任何更改后重新编译模板并提供新页面。

k0pti3hp

k0pti3hp2#

这真是个愚蠢的问题。我的一个子项目包含配置scalaSource in Compile := baseDirectory.value,它只是覆盖了Compile中的原始scalaSource。这个问题已经解决了,改为scalaSource in ThisScope := baseDirectory.value

btxsgosb

btxsgosb3#

有时你需要等待一小段时间的发挥,以检测文件的变化,尝试刷新页面几次,看看它是否工作
此外,如果您在特殊环境中运行Play,例如从MacOS运行链接到Docker容器的代码,则需要some special settings到Play的文件更改侦听器才能进行检测。

相关问题