在 `scala-js 1.x.x` 中的命名空间下导出时使用 `@JSExportTopLevel` 的标准方法

Standard way with for `@JSExportTopLevel` when Exporting under a namespace in `scala-js 1.x.x`

我有两个 类 同名 A 有不同的包一:-

xxx.yyy.v1.A

第二个为:-

xxx.yyy.v2.A

我必须在 scala-js (1.1.1) 中使用 @JSExportTopLevel

完成这个的标准方法是什么?

之前在 scala-js (0.6.x) 中,我使用了这样的东西:-

@JSExportTopLevel("xxx.yyy.v1.A")

@JSExporttopLevel("xxx.yyy.v2.A")

但是对于 scala-js (1.1.1),它现在被删除了。 Exporting under a namespace (deprecated)

注意:- 我在 scala-js 升级中遇到这个问题 0.6.x -> 1.x.x

我的配置:-

scala -> 2.13.3,jvm -> 14,sbt -> 1.3.13,scala-js -> 1.x.x

在命名空间下导出是 deprecated in Scala.js 0.6.26 并最终在 1.x 中删除,因为此类导出与 ECMAScript 模块 export 方面的任何内容都不对应。编译器必须跳过 non-standard 个环节才能使它们看起来正常工作。

正如上面链接的 0.6.26 的发行说明所解释的那样,替代方法是显式构造一个 JS 对象,该对象将保存这些命名空间和要导出的值。你的情况:

object JSNamespacesExports {
  @JSExportTopLevel("xxx")
  val xxx = new js.Object {
    val yyy = new js.Object {
      val v1 = new js.Object {
        val A = _root_.xxx.yyy.v1.A
      }

      val v2 = new js.Object {
        val A = _root_.xxx.yyy.v2.A
      }
    }
  }
}

_root_. 用于强制将 xxx 解析为 top-level Scala 包,而不是范围内的 val xxx。)

使用此编码,您可以明确选择希望 xxx 的显示方式,如 JavaScript 所示。这比 Scala.js 0.6.x 使用的不透明 half-baked 实现更透明。