Может ли плагин sbt-crossproject поддерживать две Scala.js сборки с двумя отдельными основными классами, обе с выводом, управляемым плагином scalajs-bundler?

#scala #sbt #scala.js #scalajs-bundler #sbt-crossproject

#scala #sbt #scala.js #scalajs-bundler #sbt-crossproject

Вопрос:

Предположим, что у вас есть Scala.js проект, который осмысленно компилируется в JavaScript браузера, Node.js, и JVM.

Теперь представьте, что в браузере часть приложения запускается в окне, а другая часть — в web worker.

Может ли SBT объединить две версии исходного кода? Одна версия имеет основной класс для окна браузера, в то время как другая имеет другой основной класс, который запускает код web worker?

Если да, то как бы вы это настроили?

Пожалуйста, обратите внимание, что проект зависит от собственных библиотек JavaScript и webpack.

Комментарии:

1. У меня нет времени сейчас писать полный ответ, поэтому: вы можете сделать это, либо а) определив 2 sbt project s, каждый со своим собственным main классом, в зависимости от третьего общего проекта, который содержит все остальное; или б) определив дополнительную конфигурацию в проекте sbt (отправная точка: scala-sbt.org/1.x/docs/Advanced-Configurations-Example.html inConfig(MyCompile)(ScalaJSPlugin.compileConfigSettings) ).

2. Спасибо. Как вы думаете, имеет ли смысл реорганизовать кодовую базу в отдельные проекты с общими зависимостями?

Ответ №1:

Я делаю именно это в одном из своих проектов, но с main -классом только для JVM. Браузер загружает транспилированный scalajs-код и небольшой метод hook, запускаемый js-файлом, инициализирующим ядро, с различными параметрами. Это работает для Webworker и Frontend-thread и даже для SharedWorker

Это может выглядеть следующим образом:

 importScripts("client-fullopt.js");
importScripts("conf/app-config.js");

MyProject.WebWorkerActorParent.initBackend(myProjectConfig);
MyProject.WebWorkerActorParent.addWorker(this);
  

во внешнем интерфейсе это может быть глобальный импорт скрипта и другая процедура инициализации.

 <script src='client-fullopt.js' />
<script>
  MyProject.WebWorkerActorParent.initFrontend();
</script>
  

Конечно, ничто не мешает вам дополнительно создавать разные подпроекты в sbt , которые все используют один и тот же общий библиотечный проект, и объединять их специфические потребности для целевой платформы в отдельный проект.

Комментарии:

1. Спасибо за это предложение. Извините, что потребовалось так много времени, чтобы принять ответ. Есть новые идеи?