Почему на фасадах Scala.js аннотация @ js.native исключает аннотацию @JSExport? - PullRequest
0 голосов
/ 05 июня 2018

Обратите внимание на библиотеку Scala.js с нативной зависимостью, реализованную в виде обычного JavaScript-модуля CommonJS.

В библиотеке есть фасад для зависимости JavaScript.Как и ожидалось, фасад включает в себя много кода, например:

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

К сожалению, ScalaJS-Bundler объединяет Foo таким образом, что это скрывает его от глобальной области видимости.Очевидное исправление заключается в добавлении аннотации @JSExport к двум другим, но это приводит к ошибке компилятора.

Почему js.native не совместим с JSExport?Что нужно сделать, чтобы добавить поддержку @JSExport на фасадах?

Доступен ли сейчас какой-либо обходной путь?

1 Ответ

0 голосов
/ 05 июня 2018

@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.

...