Specify the sbt version in
project/build.properties, which needs to be 0.13.16 or higher (or sbt 1.x):
If you want to use Scala.js 1.x, add the following plugins to
addSbtPlugin("com.vmunier" % "sbt-web-scalajs" % "1.1.0") addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.1.0")
Otherwise, if you prefer using Scala.js 0.6.x, add the following plugins to
addSbtPlugin("com.vmunier" % "sbt-web-scalajs" % "1.1.0-0.6") addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.33")
Lastly, put the following configuration in
lazy val server = project.settings( scalaJSProjects := Seq(client), pipelineStages in Assets := Seq(scalaJSPipeline) ).enablePlugins(SbtWeb) lazy val client = project.enablePlugins(ScalaJSPlugin, ScalaJSWeb)
Note: make sure you use the
To see the plugin in action, you can run
sbt new with one of these Giter8 templates:
- Play with Scala.js:
sbt new vmunier/play-scalajs.g8
- Akka HTTP with Scala.js:
sbt new vmunier/akka-http-scalajs.g8
Have a look at the sbt-web-scalajs v1.1.0 release, which details the breaking changes introduced in
sbt-web-scalajs looks up the
scalaJSStage setting from the Scala.js projects to know whether to run
scalaJSStagesetting is set to
FastOptStageby default, which means sbt-web-scalajs runs
scalaJSStage := FullOptStagecan be set in a Scala.js project, so that sbt-web-scalajs runs
fullOptJSfor that project.
scalaJSStage in Global := FullOptStagesets
FullOptStagefor all the Scala.js projects from the build.
How it works
There are two plugins:
WebScalaJSis automatically added to your SbtWeb project.
ScalaJSWebshould be manually added to the Scala.js projects that are used by your SbtWeb project.
- Scala.js projects are collected in the
scalaJSProjectssetting key of the SbtWeb project. The plugin does nothing if
scalaJSProjectsis not specified or is empty.
- When compilation or testing takes place, then the
WebScalaJSplugin runs all required tasks on
scalaJSProjectsprojects, copies the output to sbt-web assets and takes care of Source Maps.
Settings and Tasks
scalaJSProjectssetting lists the Scala.js projects whose output are used by the server.
scalaJSPipelineperforms the following tasks for each project defined in the
scalaJSStagesetting is equal to:
FastOptStage, then run
FullOptStage, then run
Read the ScalaJSWeb's
sourceMappingssetting from the project and its transitive dependencies.
sourceMappingslists the directories containing Scala files to be used for Source Maps. Copy all Scala files found in these directories to the sbt-web assets.
sourceMappingssetting lists the directories containing Scala files to be used for Source Maps. The Scala files from the Scala.js project need to be copied and packaged, so that the server can serve these files to the browser when using Source Maps.
sourceMappingsis scoped under
fullOptJS. Let's have a look at the value of
> project client > show Compile/fastOptJS/sourceMappings [info] * (<path>/client/src/main/scala, d09610e823cb5bgb1d53)
d09610e823cb5bgb1d53 has been computed from the directory's canonical path using
sbt.io.Hash.halfHashString(f.getCanonicalPath) and is used to configure the Scala.js'
mapSourceURI scalac option. When generating Source Maps, Scala.js will replace the prefix path of each Scala file with its hash value. The hash uniquely identifies a file/directory and can be safely exposed to the users as the full file path is not disclosed.
The plugin copies the Scala files to the sbt-web assets, so that they can be served to the browser and used for Source Maps.
By default, Source Maps are enabled in both
fullOptJS. However, Source Maps can easily be disabled in
fullOptJS by adding the following line to the Scala.js project's settings:
scalaJSLinkerConfig in (Compile, fullOptJS) ~= (_.withSourceMap(false))
When Source Maps are disabled, the
.map files and the Scala files are not copied and do not exist in the sbt-web assets.
Note that Source Maps only get requested by the browser when the DevTools is open, so it does not hinder the performance of your website.
Scala.js continuous compilation
The plugin also watches files from the Scala.js projects. Redefine
compile to trigger
scalaJSPipeline when using
compile in Compile := ((compile in Compile) dependsOn scalaJSPipeline).value
Publish a new version of the plugin
For Scala.js 1.x (no need to cross publish as Scala.js 1.x only supports SBT 0.13.x):
$ sbt publish
For Scala.js 0.6.x:
$ SCALAJS_VERSION=0.6.32 sbt ^publish