To compile, simply use the compile task:

sbt> compile

This will generate .sjsir and .class files for each class in your project (just like for Scala JVM). The .class files are used by the Scala.js compiler for symbol lookup during separate compilation. Do not use these .class files to run your project on a JVM. See the section below about cross-compilation.

The .sjsir files are an internal representation which can be linked to actual JavaScript code as will be explained shortly.

Produce one JavaScript file

To produce a proper JavaScript file from your code, you need to call the linker:

sbt> fastOptJS

This will perform fast Scala.js-specific optimizations and write the resulting code to a single JavaScript file. You can now use this JavaScript file in your HTML page or in whatever way you like. The resulting file in the target folder will have the suffix -fastopt.js.

Actually do something

By default, Scala.js produces “libraries”, that do not actually do anything when their -fastopt.js file is loaded. To make it do something, you need a top-level object with a main method:

object Main {
  def main(args: Array[String]): Unit = {
    println("Hello world!")

as well as the following sbt setting, which, to put it simply, turns your Scala.js project into an “application” rather than a “library”:

scalaJSUseMainModuleInitializer := true

Just like in a JVM project, sbt will automatically detect the object with a main(Array[String]): Unit method, and use it as the main method of the application. Now, the .js file produced by fastOptJS will print "Hello world!".

Note that this will require that there is a unique such object or that the one to use be explicitly set with mainClass in Compile := Some(<name>). If you explicitly set mainClass, note that it needs to be set on a per-configuration basis (i.e. the part in Compile is essential, otherwise the setting will be ignored). For further information see the Stack Overflow entry ‘How to set mainClass in ScalaJS build.sbt?’ (specific to Scala.js) and the Stack Overflow entry ‘How to set main class in build?’ (not specific to Scala.js).

Note for Scala.js 0.6.17 and earlier: in Scala.js 0.6.17 and earlier, the main object was required to extend the special trait js.JSApp. Since 0.6.18, any object with a standard main method will be recognized. js.JSApp is now deprecated. See the Scaladoc of js.JSApp for migration tips.

Running in the console

You can run a Scala.js application (that has scalaJSUseMainModuleInitializer set to true) by using the run task:

sbt> run

This will run the -fastopt.js file right inside of your sbt console. By default, the file is run with Node.js, which you need to install separately.

Scala.js 0.6.x only: If your application or one of its libraries requires a DOM (which can be specified with jsDependencies += RuntimeDOM), you will also need to install jsdom with npm install jsdom. jsDependencies += RuntimeDOM is now deprecated, and should be replaced by jsEnv := new org.scalajs.jsenv.jsdomnodejs.JSDOMNodeJSEnv().

There are alternative JavaScript interpreters that are available. See JavaScript environments for more details.

Deprecated: Run without scalaJSUseMainModuleInitializer

Scala.js 0.6.x only

It is still possible to run a Scala.js application that does not have scalaJSUseMainModuleInitializer := true. However, this is not recommended anymore.

Disabling the optimizations

If, for some reason (for example, to make stepping through the code with a debugger more predictable), you want to disable the optimizations, you can do so with the following sbt setting:

scalaJSLinkerConfig ~= { _.withOptimizer(false) }

scalaJSLinkerConfig contains various other options controlling the Scala.js linker. See the Scaladoc of StandardLinker.Config for details.


To make the resulting JavaScript even smaller (and usually faster as well), the sbt plugin integrates the Google Closure Compiler under the so-called full-optimizations. You can use them by issuing:

sbt> fullOptJS

This will produce another single JavaScript file that is fully optimized. Note that this can take a while and is therefore not recommended in the development cycle. The resulting file in the target folder will have the suffix -opt.js.

You can run your code and tests in fullOpt stage with the following command:

sbt> set scalaJSStage in Global := FullOptStage

Deprecated: Writing Launcher Code

Scala.js 0.6.x only

For applications that do not use scalaJSUseMainModuleInitializer := true, it is possible to generate a small .js file that calls the main method, known as a “launcher” file. This is done with the following sbt setting:

persistLauncher := true

The resulting file in the target folder will have the suffix -launcher.js.

This feature is deprecated: applications should migrate to using scalaJSUseMainModuleInitializer.