Scala.js & Scala Native
UI libraries: Laminar (reactive), Tyrian (Elm-like), scalajs-react, Slinky, Calico.
39.1 Scala.js — Scala to JavaScript
UI libraries: Laminar (reactive), Tyrian (Elm-like), scalajs-react, Slinky, Calico. Share code between JVM and JS with crossProject. Tooling: Vite plugin, ScalablyTyped (TypeScript typings → Scala facades). WebAssembly backend available in newer versions.
// build.sbt: enablePlugins(ScalaJSPlugin); scalaJSUseMainModuleInitializer := true
import org.scalajs.dom
@main def app(): Unit =
val button = dom.document.createElement("button")
button.textContent = "Click me"
button.addEventListener("click", _ => dom.window.alert("Hello from Scala.js!"))
dom.document.body.appendChild(button)39.2 Scala Native — Scala to native binaries (LLVM)
Fast startup, low memory, C interop (@extern), suitable for CLIs and systems tools.
// build.sbt: enablePlugins(ScalaNativePlugin)
import scala.scalanative.unsafe.*
import scala.scalanative.libc.stdio
@main def native(): Unit =
Zone { stdio.printf(c"Hello, %s!\n", toCString("native")) }39.3 GraalVM native-image
Alternative for JVM apps: ahead-of-time compile to a native executable (scala --power package --native-image).