我尝试使用ScalaJS在公共库和我的Play框架Web项目之间共享一些scala代码。
我在一个单独的版本(不同的文件夹,不同的build.sbt)中使用ScalaJS创建了共享项目,包括使用uTest的单元测试,所有内容似乎都按预期工作。我已经将库代码交叉编译为单独的目标(shared_jvm和shared_js)并使用了SBT的publishLocal命令。此时一切都很好。
我使用以下代码在web_js文件夹中为我的特定Web应用程序ScalaJS代码在我的Play框架Web应用程序中创建了一个单独的项目:
lazy val web_js = (project in file("web_js")).settings(
scalaVersion := "2.11.1",
persistLauncher := true,
persistLauncher in Test := false,
unmanagedSourceDirectories in Compile := Seq((scalaSource in Compile).value),
libraryDependencies ++= Seq(
"org.scala-js" %%% "scalajs-dom" % "0.8.0",
"be.doeraene" %%% "scalajs-jquery" % "0.8.0",
"org.myorg" %%% "shared-js" % "0.1-SNAPSHOT"
)).
enablePlugins(ScalaJSPlugin, ScalaJSPlay)
SBT解决了图书馆没有任何问题。我能够编译并且没有错误,并且我能够在我的代码中引用共享库。
为了使用我的共享JS代码,我扩展了JSApp并在共享库中调用了一个对象,如下所示:
//Index.scala
import org.myorg.shared.SharedObject
object Index extends JSApp {
def main(): Unit = {
SharedObject.printSomething()
}
}
但是,在我加载浏览器后调用它时,我得到与共享库中的对象相关的未定义错误:
Uncaught TypeError: undefined is not a function
如何将依赖的ScalaJS库加载到Play Framework项目的页面中?
其他说明:
我无法在"来源"中看到我的共享库代码chrome的调试器视图。我只能看到上面粘贴的Index.scala代码段。这让我相信我引用的共享库实际上并没有被浏览器加载,但我不确定它是否与它的工作方式有关。
顺便说一句,我已经看过play-with-scalajs-example项目,并且我正在使用它来使用此代码段加载上面的Index.scala入口点:
@playscalajs.html.scripts("/assets", projectName = "web_js")
但是我没有成功使用它来加载依赖库。
答案 0 :(得分:0)
我想我只是误解了javascript错误和/或在一段时间内没有更新生成的javascript。
事实证明我依赖于未加载的外部javascript资源(moment.js)。当我通过将脚本标记插入页面手动加载它时:
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.9.0/moment.min.js"></script>
它按预期工作并调用我的共享库。这很奇怪,因为我不记得在生成的fastopt.js脚本中看到我的代码,但我一定错过了它或者我的盒子上有一些配置问题。
我不确定为什么我的嵌入式moment.js脚本无效,因为它是我的一个依赖项中的资源的一部分,我将它包含在jsDependencies设置中,如下所示:
jsDependencies ++= Seq(
"org.myorg" %%% "momentjs" % "0.1-SNAPSHOT" / "moment.js"
)
但是,如果我无法弄明白,我认为这是一个新帖子的问题。