【问题标题】:Why does not Play Framework reload assets?为什么 Play Framework 不重新加载资源?
【发布时间】:2015-08-27 18:40:28
【问题描述】:

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

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

【问题讨论】:

  • 公共资产文件夹中的 It 开发模式文件应反映更改。但通常会使用一些模板(Play 使用 Twirl 作为模板语言)。
  • 应该但没有

标签: scala playframework


【解决方案1】:

某些浏览器会将资源缓存在您的公用文件夹中,因此当 Play 服务器将提供新内容时,您仍会看到旧内容。如果您使用的是 Chrome,您可以通过执行硬重新加载 (Ctrl+Shift+R) 来清除缓存,这将强制它再次从服务器获取所有内容。

更好的解决方案是使用资产指纹识别,您可以找到有关here 的信息。这基本上意味着您的资产的名称会在其内容发生变化时发生变化,因此您的浏览器会意识到它需要下载新文件而不是提供缓存的文件。要做到这一点非常简单——在你的路由文件中,改变

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

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

当您需要引用资产时,不要使用 Assets.at,而是使用 Assets.versioned 即。

<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 中,而不是将其作为您的公共文件夹中的资产)播放将在任何更改后重新编译您的模板并提供新页面。

【讨论】:

  • 首先,它不是缓存,因为我立即测试了缓存问题。其次,我不使用模板引擎。第三,我用GET / controllers.Assets.at(path="/public", file="/view/index.html")路由,GET / controllers.Assets.versioned(path="/public", file="/view/index.html") GET /assets/*file controllers.Assets.versioned(path="/public", file)不行。
  • 太棒了。我也有类似的问题,你的解决方案就像一个魅力。真的很烦,要重新编译好几次才发现一个不存在的bug,后来发现问题是因为我所做的更改因为缓存没有反映在浏览器中。
【解决方案2】:

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

【讨论】:

  • 太好了,这对我有用,尽管我不明白为什么。
【解决方案3】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 2013-05-19
  • 2013-03-20
  • 1970-01-01
  • 2020-04-08
相关资源
最近更新 更多