Почему в фасадах 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,

Другие вопросы по тегам