设置一个 scala.js 交叉编译库

Setup a scala.js cross compiled library

我有一个小型 Scala 库,想在 Scala.js 应用程序中使用:https://github.com/fbaierl/scala-tarjan

出于这个原因,我决定创建一个交叉编译库,它可以编译为 Scala.js 和 Scala JVM:https://github.com/fbaierl/scalajs-cross-compile-tarjan。但我对如何从这里继续下去有点困惑。

到目前为止,我在共享目录中拥有所有相关代码:

和 JVM 和 JS 部分的两个 Tarjan.scala 类:

对于仅从共享库调用方法的 JVM 和 JS,这些应该是 public "interface classes"。

js/src/main/scala/Tarjan.scala:

import com.github.fbaierl.tarjan.{TarjanRecursive => lib}
import scala.scalajs.js.annotation.{JSExport, JSExportTopLevel}

@JSExportTopLevel("Tarjan")
object Tarjan {
   @JSExport
   def tarjan[T](g: Map[T, List[T]]): Unit = lib.tarjan(g)
}

jvm/src/main/scala/Tarjan.scala:

import com.github.fbaierl.tarjan.{TarjanRecursive => lib}

object Tarjan {
  def tarjan[T](g: Map[T, List[T]]): Unit = lib.tarjan(g)
}

这通常是正确的方法吗?我可以像那样编译项目并发布到例如声纳型?

不是为 JS 和 JVM 复制 "interface classes",您可能希望使用 scalajs-stubs 库以便能够在共享代码中使用 @JSExportTopLevel@JSExport

shared/src/main/scala/Tarjan.scala:

import com.github.fbaierl.tarjan.{TarjanRecursive => lib}
import scala.scalajs.js.annotation.{JSExport, JSExportTopLevel}

@JSExportTopLevel("Tarjan")
object Tarjan {
  @JSExport
  def tarjan[T](g: Map[T, List[T]]): Unit = lib.tarjan(g)
}

build.sbt:

… .jvmSettings(
  libraryDependencies += "org.scala-js" %% "scalajs-stubs" % scalaJSVersion % "provided"
)

参见 https://www.scala-js.org/doc/project/cross-build.html 底部的 "Exporting shared classes to JavaScript"。