Доступ к выходным данным scala.js в ресурсах
Я пытаюсь создать сервер приложений, используя scala.js, scalatags, akka-http и mill в качестве инструмента сборки. Все идет хорошо, пока браузер не попытается найти скрипты с сгенерированным кодом scala.js. Это код масштабных тегов, который успешно создается и ссылается на скомпилированный код scala.js (HiPage.js - построенный как ScalaJSModule в mill). Когда он запускается, println ниже распечатывает: file:/Users/nnovod/projects/lims/LIMS/resources/HiPage.js, где я действительно разместил вывод javascript из scala.js
object HiPage {
val boot =
"Hi().main(document.getElementById('contents'))"
println(getClass.getResource("/HiPage.js").toString)
val skeleton =
html(
head(
script(`type`:="text/javascript", src:="/HiPage.js"),
link(
rel:="stylesheet",
href:="https://cdnjs.cloudflare.com/ajax/libs/pure/0.5.0/pure-min.css"
)
),
body(
onload:=boot,
div(id:="contents")
)
)
}
В конечном итоге это отображается в браузере следующим образом:
<html>
<head>
<script type="text/javascript" src="/HiPage.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/pure/0.5.0/pure-min.css"/>
</head>
<body onload="Hi().main(document.getElementById('contents'))">
<div id="contents"></div>
</body>
</html>
Это мой маршрут akka-http...
val route =
path("hello") {
get {
complete(
HttpEntity(
ContentTypes.`text/html(UTF-8)`,
HiPage.skeleton.render
)
)
}
}
Браузер никогда не может найти HiPage.js ("Не удалось загрузить ресурс: сервер ответил статусом 404 (не найден)"). HiPage.js находится в каталоге ресурсов верхнего уровня и находится в коде с помощью println(getClass.getResource("/HiPage.js"). ToString). Что мне нужно сделать, чтобы его увидеть, когда браузер запрашивает его с сервера?
1 ответ
Не уверен, что это лучший способ, но я, наконец, смог решить проблему, начав все ссылки src в скрипте с /resource, а затем отредактировав мой маршрут akka-http, включив в него следующее:
pathPrefix("resource") {
extractUnmatchedPath { unmatched =>
val resource = unmatched.toString()
if (!resource.startsWith("/"))
reject()
else
getFromResource(resource.substring(1))
}
}