Scala.js

introduction

Scala

val divMul: P[Int] = 
  P( factor ~ (CharIn("*/").! ~/ factor).rep ).map(eval)

Scala

implicit def monadMTMAB[MT[_[_], _], MAB[_, _], A](
  implicit t: MonadTrans[MT],
  m: Monad[MAB[A, ?]]
): Monad[MT[MAB[A, ?], ?]] =
  t.apply[MAB[A, ?]]

JavaScript

var xhr = new XMLHttpRequest()

xhr.open("GET",

  "https://api.twitter.com/1.1/search/" +

  "tweets.json?q=%23scalajs"

)

xhr.onload = (e: Event) => {

  if (xhr.status == 200) {

    var r = JSON.parse(xhr.responseText)

    $("#tweets").html(parseTweets(r))

  }

}

xhr.send()

JavaScript

var xhr = new XMLHttpRequest()

xhr.open("GET",

  "https://api.twitter.com/1.1/search/" +

  "tweets.json?q=%23scalajs"

)

xhr.onload = (e: Event) => {

  if (xhr.status == 200) {

    var r = JSON.parse(xhr.responseText)

    $("#tweets").html(parseTweets(r))

  }

}

xhr.send()

JavaScript Scala!

var xhr = new XMLHttpRequest()

xhr.open("GET",

  "https://api.twitter.com/1.1/search/" +

  "tweets.json?q=%23scalajs"

)

xhr.onload = (e: Event) => {

  if (xhr.status == 200) {

    var r = JSON.parse(xhr.responseText)

    $("#tweets").html(parseTweets(r))

  }

}

xhr.send()

Зачем менять JavaScript на что-то другое?

А вы и сами это знаете ;)

Scala

2004 год, Martin Odersky, EPFL

Основная цель - создать практичный язык, где подружатся мощные ООП и ФП составляющие

Строгая статическая типизация с выводом типов

Immutability by default, immutable collections

Мощные compile-time возможности

JVM, better Java?

Scala.js

2013 год, Sébastien Doeraene, EPFL

Scala -> JavaScript: плагин к обычному Scala компилятору

Поддерживаются все фичи языка, кроме зависимых от JVM

JS Interoperability

JS/JVM cross-compilation

console.log("Hello World!");
println("Hello World!")

Scala.js

JavaScript

class Person {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  fullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}
class Person(val firstName: String, 
             val lastName: String) {

  def fullName(): String =
    s"$firstName $lastName"
}

Scala.js

JavaScript

const personMap = new Map([
  [10, new Person("Roger", "Moore")],
  [20, new Person("James", "Bond")]
]);
const names = [];
for (const [key, person] of personMap) {
  if (key > 15) {
    names.push(`${key} = ${person.firstName}`);
  }
}
val personMap = Map(
  10 -> new Person("Roger", "Moore"),
  20 -> new Person("James", "Bond")
)
val names = for {
  (key, person) <- personMap
  if key > 15
} yield s"$key = ${person.firstName}"

Scala.js

JavaScript

Scala.js features

Всё, что есть в ES6/7

Immutable.js

Всё, что есть в TypeScript

+

+

+

Многое другое

Demo time!

Библиотеки

Фасады для JS библиотек

jQuery, React, Angular, Angular2 (in progress), Vue.js, ...

Scala/Scala.js библиотеки

Udash, Widok, Diode, ScalaTags, Monix, Scala.Rx, Akka.js, ...

Проблемы

sbt, sbt-web

Сборка библиотек не для Scala.js

Нужно тянуть рантайм

Кадры

Когда использовать?

Команда уже использует Scala на бэкенде.

Высокие требования к корректности кода.

Большой и сложный проект с длительным временем поддержки.

Когда не использовать?

Высокие требования к начальному времени загрузки приложения.

Разработка JS библиотеки, а не конечного продукта

Создание прототипов или маленьких проектов

Полезные ссылки

Спасибо!

Scala.js

By Yury Badalyants

Scala.js

  • 382