在 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
.
中捆绑任意多个
请考虑一个 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
.