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).