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



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

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

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

不幸的是,ScalaJS-Bundler 捆绑了 Foo,将其隐藏在全局范围之外。 显而易见的修复包括将@JSExport注释添加到其他两个注释中,但这会导致编译器错误。

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

现在是否有任何解决方法?

在 Scala 0.6.15 中不推荐使用顶级类和对象的@JSExport.js。你所追求的其实是@JSExportTopLevel.

没有根本原因@JSExportTopLevel@JSImport/@JSGlobal不兼容。这不是因为以下 3 件事:

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

实现结果的另一种方法是简单地导出存储导入结果的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中捆绑任意数量的导入。

最新更新