问题描述
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使用的不透明,半生不熟的实现更为透明。