在`scala-js 1.x.x`的命名空间下导出时,@@ JSExportTopLevel`的标准方式

问题描述

我有两个同名的 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.xx

解决方法

在命名空间下进行导出是deprecated in Scala.js 0.6.26,并最终在1.x中删除,因为就ECMAScript模块export而言,此类导出与任何内容都不对应。编译器不得不跳过非标准箍,以使它们看起来可以工作。

正如上面链接的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解析为顶级Scala软件包,而不是范围内的val xxx。)

使用这种编码,您可以明确选择xxx的显示方式,如JavaScript所示。这比Scala.js 0.6.x使用的不透明,半生不熟的实现更为透明。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...