Почему в фасадах 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 на фасадах?
Есть ли обходной путь сейчас?
1 ответ
@JSExport
на классы и объекты верхнего уровня устарел в Scala.js 0.6.15. То, что вы после, на самом деле @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
,