Menü

Programmiersprache: Scala.js auf der Zielgeraden zu Version 1.0

Der Scala-to-JavaScript-Compiler gilt zwar schon seit vier Jahren nicht mehr als experimentell, aber der große Schritt zu 1.0 steht erst 2020 bevor.

Lesezeit: 2 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen 18 Beiträge
Von

Die Entwickler von Scala.js haben den ersten Release Candidate der 1.0-Version des Scala-to-JavaScript-Compilers herausgegeben. Die fertige Variante steht für Ende Januar 2020 auf dem Plan. Das 1.0-Release betont die Reife des Projekts für den produktiven Einsatz und soll die Rückwärtskompatibilität für künftige Minor-Versionen garantieren.

Große Neuerungen bringt Scala.js 1.0 nicht mit, da der Fokus im Vergleich zu Version 0.6.x auf der Vereinfachung statt neuen Features lag. Allerdings gibt es eine nennenswerte Änderung am globalen Bezug zu JavaScript: js.Dynamic.global und @JSGlobalScope greifen auf den globalen Scope von JavaScript zu, nicht mehr auf ein globales Object.

Das bedeutet zum einen, dass nur Zugriffe auf Objekte erlaubt sind, die sowohl statisch definiert sind als auch zulässige JavaScript-Bezeichner sein. Das bedeutet, dass folgende Codezeilen in Scala.js 1.0 zu Kompilierfehlern führen:

val mathName = "Math"
println(js.Dynamic.global.selectDynamic(mathName))

println(js.Dynamic.global.`not-a-valid-JS-identifier`)

Der Zugriff in der letzten Zeile verwendet einen nicht erlaubten Namen für den Bezeichner, und in der zweiten Zeile ist Math erst zur Laufzeit definiert. Der Zugriff auf das Standardobjekt mit demselben Namen über

println(js.Dynamic.global.Math)

ist dagegen erlaubt, da es statisch definiert ist.

Ein positiver Nebeneffekt vom Bezug zum globalen Scope ist, dass Scala.js nun Zugriff auf globale Variablen bekommt, die spezielle Varianten standardmäßig bereitstellen wie require() in Node.js.

Mit Version 1.0 vereinfacht Scala.js die Definition von nativen inneren Klassen, was bis Version 0.6.x eine recht umständliche Vorgehensweise erforderte. Außerdem lässt sich nun auch in verschachtelten, nicht-nativen JavaScript-Klassen js.constructorOf verwenden.

Unter der Haube ist unter anderem erwähnenswert, dass der Compiler standardmäßig ES2015-Code erstellt, während der Vorgänger noch in das veraltete ES 5.1 im Strict Mode kompilierte. Letzteres lässt sich jedoch weiter über angepasste Einstellung in sbt erzeugen:

scalaJSLinkerConfig in ThisBuild ~= 
{ _.withESFeatures(_.withUseECMAScript2015(false)) }

Für den Sprung auf Version 1.0 schneiden die Entwickler ein paar alte Zöpfe ab. So unterstützt der Compiler weder Scala 2.10.x noch die Unterversionen 2.11.0 bis 2.11.11 – in der 2.11.Serie ist jedoch 2.11.12 weiterhin erlaubt. Hinsichtlich des Java Development Kit verabschiedet sich der Compiler von den Versionen 6 und 7. Beim Build-Tool sbt setzt Scala.js mindestens Version 1.2.1 voraus, während der Vorgänger noch mit sbt 0.13.x zusammenarbeitete.

Die in Version Scala.js 0.6.x als überholt (deprecated) bezeichneten Elemente verschwinden in Version 1.0. Daher empfiehlt das Scala.js-Team, vorhandene Projekte zunächst mit Scala.js 0.6.31 zu kompilieren und die Deprecation-Warnungen zu behandeln.

Scala.js blickt auf eine inzwischen sechsjährige Geschichte zurück. Der Compiler entstand wie die Programmiersprache Scala bei der École Polytechnique Fédérale de Lausanne (EPFL). Bereits zum Release der Version 0.6 bescheinigten die Entwickler dem Werkzeug bereits 2015 eine gewisse Reife für den professionellen Einsatz, indem sie es nicht mehr als experimentell kennzeichneten.

Auch der Erfinder von Scala, Martin Odersky, sieht in dem Compiler ein wichtiges Standbein für die Programmiersprache. In einem Gespräch mit heise Developer sagte er zu Scala.js: "Das ist eine enorm leistungsfähige Implementierung, die aber derzeit hauptsächlich von Scala-Entwicklern genutzt wird, die aufs Frontend wollen. Aber ich denke, Scala.js ist auch etwas, das sich andere Leute, die von JavaScript kommen, anschauen könnten".

Weitere Details zum Release Candidate von Scala.js 1.0 lassen sich der offiziellen Ankündigung entnehmen.

Siehe dazu auf heise Developer:

(rme)