Suppose that you have a Scala.js project that compiles meaningfully to browser JavaScript, Node.js, and JVM.

Now imagine that in the browser, part of the application runs in the window while another part runs in a web worker.

Can SBT bundle two versions of the source code? One version has a main class for the browser window, while the other has a different main class that runs the web worker code?

If so, how would you configure this?

Please note that the project depends on JavaScript native libraries and webpack.

1

There are 1 answers

1
SeDav On BEST ANSWER

I'm doing exactly that in one of my projects, but with a main-class only for the JVM. The browser loads the transpiled scalajs-code and a small hook method, triggered by a js-file, initializing the core, with different parameters. This does work for Webworker and Frontend-thread and even for a SharedWorker

This could look like that:

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

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

at the frontend it could be a global script import and another initialization routine.

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

Of course, nothing prevents you to additionally create different subprojects in sbt, that all use the same, common library-project and bundle their specific needs for the target platform in a separate project.