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

问题描述 投票:0回答:3

我在开发模式下启动了我的 play 应用程序,并尝试更改索引 html 文件,但 play 没有更新它。 我的应用程序仅包含公共文件夹中的资产,为了查看更改,我必须重新启动我的应用程序。我的观察表明,play 会编译

target/web/public/main
目录中的资源,并且当
public
目录中的文件发生更改时不会更新它

我应该如何配置我的应用程序,以便在更改它时重新加载所有资产?

scala playframework
3个回答
2
投票

某些浏览器会将资源缓存在您的公共文件夹中,因此当 Play 服务器提供新内容时,您仍然会看到旧内容。如果您使用 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 将重新编译进行任何更改后的模板并提供新页面。


2
投票

这真是个愚蠢的问题。我的一个子项目包含配置

scalaSource in Compile := baseDirectory.value
,它只是覆盖了
scalaSource
中的原始
Compile
。改成
scalaSource in ThisScope := baseDirectory.value
就解决了问题。


0
投票

有时需要等待一段时间才能播放才能检测到文件变化,请尝试刷新页面几次看看是否有效

此外,如果您在特殊环境中运行 Play,例如运行从 MacOS 链接到 Docker 容器的代码,则需要对 Play 的文件更改侦听器进行一些特殊设置才能使检测工作。

© www.soinside.com 2019 - 2024. All rights reserved.