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