在 Scala.js 外观中,为什么 @js.native 注释排除了 @JSExport 注释?

In Scala.js facades, why does the @js.native annotation preclude the @JSExport one?

请考虑一个 Scala.js 库,其本机依赖项实现为纯 JavaScript CommonJS 模块。

该库包含 JavaScript 依赖项的外观。正如预期的那样,外观包含很多代码,例如:

@JSImport("com", "Foo") @js.native
class Foo extends js.Object { ... }

不幸的是,ScalaJS-Bundler 以一种在全局范围内隐藏 Foo 的方式捆绑了它。明显的修复涉及将 @JSExport 注释添加到其他两个,但这会导致编译器错误。

为什么 js.native 与 JSExport 不兼容?在外观上添加对@JSExport 的支持需要什么?

现在有任何解决方法吗?

@JSExport 在顶层 类 并且对象已弃用 in Scala.js 0.6.15。你要的其实是@JSExportTopLevel.

@JSExportTopLevel@JSImport/@JSGlobal不兼容没有根本原因。不是因为以下三点:

  • 支持它意味着在整个编译器工具链中做更多的工作来支持它,
  • 这感觉像是一个罕见的用例,并且
  • 还有另一种方法可以达到同样的效果。

另一种实现结果的方法是简单地导出一个val存储导入的结果,如下:

@js.native
@JSImport("com", "Foo")
class Foo extends js.Object { ... }

// 'private' not to pollute the Scala API with this object
private object Reexports {
  @JSExportTopLevel("Foo") // or another name
  val Foo = js.constructorOf[Foo]
}

如果你只重新导出一个这样的导入肯定会有点冗长,但你可以在唯一的 object Reexports.

中捆绑任意多个