#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.htmlinConfig(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. Спасибо за это предложение. Извините, что потребовалось так много времени, чтобы принять ответ. Есть новые идеи?