Play Framework前端JS使用Scala.js外部依赖项

时间:2015-03-20 00:29:23

标签: playframework scala.js

我尝试使用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")

但是我没有成功使用它来加载依赖库。

1 个答案:

答案 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"
)

但是,如果我无法弄明白,我认为这是一个新帖子的问题。