请考虑一个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
中捆绑任意数量的导入。