Announcing Scala.js 1.14.0

Sep 25, 2023.

We are pleased to announce the release of Scala.js 1.14.0!

This release mainly brings speed improvements in the reachability analysis by parallelizing it. It also upgrades the Scala 2.13.x standard library to version 2.13.12.

Read on for more details.

Getting started

If you are new to Scala.js, head over to the tutorial.

If you need help with anything related to Scala.js, you may find our community in #scala-js on Discord and on Stack Overflow.

Bug reports can be filed on GitHub.

Release notes

If upgrading from Scala.js 0.6.x, make sure to read the release notes of Scala.js 1.0.0 first, as they contain a host of important information, including breaking changes.

This is a minor release:

  • It is backward binary compatible with all earlier versions in the 1.x series: libraries compiled with 1.0.x through 1.13.x can be used with 1.14.0 without change.
  • Despite being a minor release, 1.14.0 is forward binary compatible with 1.13.x. It is not forward binary compatible with 1.12.x. Libraries compiled with 1.14.0 can be used with 1.13.x but not with 1.12.x or earlier.
  • It is not entirely backward source compatible: it is not guaranteed that a codebase will compile as is when upgrading from 1.13.x (in particular in the presence of -Xfatal-warnings).

As a reminder, libraries compiled with 0.6.x cannot be used with Scala.js 1.x; they must be republished with 1.x first.

Improvements

Reachability Analysis is parallel by default

We have observed up to 2x speedup of reachability analysis on the Scala.js test suite with this change. This corresponds to a 20% speedup overall on linking.

In case you encounter issues, you can disable the new behavior by setting:

scalaJSLinkerConfig ~= { _.withParallel(false) }

This will disable all parallelism in the linker (expect significant slowdown).

Implicit conversions to js.Any for js.UndefOr in Scala 3

Because js.UndefOr is implemented differently in Scala 3, the implicit conversion to js.Any was not available.

Thanks to @armanbilge, js.UndefOr[T] now implicitly converts to js.Any, provided T is convertiable to js.Any.

For example, the following now compiles on Scala 3:

val x: js.Any = js.defined("")

New ECMAScript Core Types

Call-site inline

The compiler and linker now use @inline / @noinline hints provided at the call-site. See the Scaladoc for @inline for details.

Better Default Bridge Generation

The linker will now avoid generating a default bridge in a subclass if an existing bridge in the superclass can be used. This can lead to minor code-size improvements.

Bug fixes

The following bugs have been fixed in 1.14.0:

  • #4882: Make UUID.compareTo() consistent with the JVM.

You can find the full list on GitHub.