简而言之:是否可以使用akka-http重新加载静态资源?
再多一点:
App
对象启动我的Main
类。 getFromResourceDirectory
来查找我的资源
文件夹中。我希望在开发过程中热插拔我的静态资源。
例如,我有index.html
或application.js
,我更改了这些内容,并且在刷新浏览器而不重新启动服务器后,我希望看到更改。做这种事的最佳做法是什么?
我知道Play!
允许这样做,但不希望仅仅因此而将我的项目基于Play!
。
答案 0 :(得分:4)
两个选项:
getFromDirectory
指令,并将其指向您希望“加载”文件的路径。是的,它直接从文件系统为它们提供服务,因此每次更改文件并通过Akka HTTP加载它都将是最新版本。getFromResourceDirectory
从类路径加载文件,资源可用,因为SBT会在每次构建(target
)时将它们复制到copyResources
下的类目录中。您可以使用unmanagedClasspath
配置sbt,使其包含类路径中的静态资源目录。如果你想在运行package
时打包工件中的资源,但是这需要更多的sbt-trixery(如果你只是将src/resources
放在unmanagedClasspath
中它将依赖于类路径排序,如果使用复制的或修改过的。)答案 1 :(得分:2)
我无法通过添加到unmanagedClasspath使它正常工作,所以我改用getFromDirectory。如果getFromResourceDirectory这样失败,则可以使用getFromDirectory作为后备。
val route =
pathSingleSlash {
getFromResource("static/index.html") ~
getFromFile("../website/static/index.html")
} ~
getFromResourceDirectory("static") ~
getFromDirectory("../website/static")
首先,它尝试在静态资源目录中查找文件,如果失败,则检查../website/static是否具有该文件。
答案 2 :(得分:1)
以下代码尝试在目录" staticContentDir "中找到该文件。如果找到该文件,则将其发送回客户端。如果找不到,则尝试从目录" 站点"中提取文件。在类路径中。 用户网址为:http://server:port/site/path/to/file.ext
/ site /来自" 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")
}
}
}
}
我希望很清楚。