使用akkahttp静态资源重载



简而言之:是否可以使用akka-http重新加载静态资源?

更多:

  • 我有Scala项目
  • 我正在使用App对象启动我的Main
  • 我正在使用getFromResourceDirectory查找我的资源文件夹

我想要的是在开发过程中热交换我的静态资源。例如,我有index.htmlapplication.js,我会更改它们,并且我希望在刷新浏览器而不重新启动服务器后看到更改。做这种事的最佳做法是什么?

我知道Play!允许这样做,但我不想仅仅因为这样就把我的项目建立在Play!上。

两个选项:

  1. 最简单:在本地运行时使用getFromDirectory指令,并将其指向要"热加载"的文件所在的路径,它直接从文件系统提供这些文件,因此每次更改文件并通过Akka HTTP加载时,它都将是最新版本
  2. getFromResourceDirectory从类路径加载文件,资源是可用的,因为SBT每次构建(copyResources)时都会将它们复制到target下的类目录中。您可以使用unmanagedClasspath配置sbt,使其在类路径中包含静态资源目录。然而,如果您想在运行package时将资源打包到工件中,这将需要更多的sbt trixery(如果您只是将src/resources放在unmanagedClasspath中,那么如果使用复制的或修改的,则将取决于类路径排序)

我无法通过添加到unmanagedClasspath来让它工作,所以我改为使用getFromDirectory。如果getFromResourceDirectory像这样失败,您可以使用getFromDirectory作为后备。

val route =
  pathSingleSlash {
    getFromResource("static/index.html") ~
    getFromFile("../website/static/index.html")
  } ~
  getFromResourceDirectory("static") ~
  getFromDirectory("../website/static")

首先,它尝试在静态资源目录中查找文件,如果失败,则检查是否/website/static有该文件。

下面的代码尝试在目录"staticContentDir"中查找文件。如果找到该文件,则会将其发送回客户端。如果找不到,它会尝试从类路径中的目录"site"中获取文件。用户url为:http://server:port/site/path/to/file.ext

/站点/来自"staticPath"

  val staticContentDir = calculateStaticPath()
  val staticPath = "site"
  val routes = pathPrefix(staticPath) {
    entity(as[HttpRequest]) { requestData =>
      val fullPath = requestData.uri.path
      encodeResponse {
        if (Files.exists(staticContentDir.resolve(fullPath.toString().replaceFirst(s"/$staticPath/", "")))) {
          getFromBrowseableDirectory(staticContentDir.toString)
        } else {
          getFromResourceDirectory("site")
        }
      }
    }
  }

我希望它是清楚的。

相关内容

  • 没有找到相关文章

最新更新