我试图使用ScalaJS在一个公共库和我的play框架web项目之间共享一些scala代码。
我使用ScalaJS在一个单独的构建中创建了共享项目(不同的文件夹,不同的build.sbt),包括使用uTest的单元测试,所有的事情都像预期的那样正常工作。我交叉编译了库代码以分离目标(shared_jvm和shared_js),并使用了SBT的publishLocal命令。现在一切都很好。
我在我的play框架web应用程序中为我的特定web应用程序ScalaJS代码创建了一个单独的项目,它位于一个web_js文件夹中,使用以下代码:
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代码片段。这让我相信,我所引用的共享库实际上并不是由浏览器加载的,但我不确定它的工作方式是否正确。
顺便说一句,我已经看到了玩金刚游戏-例子项目,我正在使用这个片段来加载上面的Index.scala入口点:
@playscalajs.html.scripts("/assets", projectName = "web_js")但我还没有成功地使用它来加载依赖库。
发布于 2015-03-20 07:09:18
我想我只是误解了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"
)但我想如果我搞不清楚的话,这是一个新职位的问题。
https://stackoverflow.com/questions/29157411
复制相似问题