Scala.js编译目的地

Jos*_*niz 13 scala.js

我正在开发一个Scala.js交叉项目,其中该jvm文件夹代表我的服务器应用程序并js代表我的scala.js代码.

每当我通过sbt crossJS/fastOptJS编译的JS 编译我的scala.js代码时最终会进入./js/target/scala-2.11/web-fastopt.js.

我需要在jvm文件夹中的服务器项目的资源中访问此编译的JS文件,因此我可以通过我的Web应用程序来服务它.我想我必须做点什么,artifactPath但到目前为止我似乎无法从我的实验中得到任何结果.

gzm*_*zm0 6

你可以简单地设置artifactPath了的fastOptJS任务(或fullOptJS任务)至(管理)资源的JVM项目的目录:

// In the JS project's settings
artifactPath in fastOptJS :=
  (resourceManaged in jvm in Compile).value /
    ((moduleName in fastOptJS).value + "-fastopt.js"))
Run Code Online (Sandbox Code Playgroud)

如果您运行fastOptJS任务,这将把它放在目录中.但是,它不会包含在sbt的resources任务中,如果启动服务器,它将不会自动触发.因此:

// In the JVM project's settings
resources in Compile += (fastOptJS in js).value.data
Run Code Online (Sandbox Code Playgroud)

几个笔记:

  • 如果您的Web服务器仅提供特定目录,则只需要第一步.否则第二个就足够了,因为这会将文件添加到资源中; 它所在的地方是次要的.
  • crossTarget在@ochrons的答案中设置,也将输出资源目录中的所有.class.sjsir文件.
  • 看看Vincent Munier的sbt-play-scalajs开箱即用的sbt-web/Scala.js集成(它遵循一种稍微不同的方法:它从js项目中复制文件,而不是直接将其放入JVM项目.如果你有多个JVM项目,这很有用).


och*_*ons 5

您可以配置Scala.js SBT插件以在您选择的文件夹中输出JavaScript文件。例如这样:

// configure a specific directory for scalajs output
val scalajsOutputDir = Def.settingKey[File]("directory for javascript files output by scalajs")

// make all JS builds use the output dir defined later
lazy val js2jvmSettings = Seq(fastOptJS, fullOptJS, packageJSDependencies) map { packageJSKey =>
  crossTarget in(js, Compile, packageJSKey) := scalajsOutputDir.value
}
// instantiate the JVM project for SBT with some additional settings
lazy val jvm: Project = sharedProject.jvm.settings(js2jvmSettings: _*).settings(
  // scala.js output is directed under "web/js" dir in the jvm project
  scalajsOutputDir := (classDirectory in Compile).value / "web" / "js",
Run Code Online (Sandbox Code Playgroud)

如果您想在Web应用程序中使用-jsdeps.js和.js.map文件,该文件还将存储在同一文件夹中。

有关更完整的示例,请查看本教程该教程解决了创建更复杂的Scala.js应用程序的许多其他问题。