Scala для супергеройского фронтенда

Алексей Фомкин, Флексис

28 апреля 2016

Почему Scala это просто

В Scala всего 40* ключевых слов, тогда как в JS их 46**

Почему Scala это просто

Мощные языковые примитивы вместо синтаксического сахара


  val xs = List(1, 2, 3)

  val obj = Map(
    'a' -> 1,
    'b' -> 2,
    'c' -> 3
  )

Почему Scala это просто

  • Предсказуемый (No WAT)
  • Язык регулярно чистят от старого

Строгая статическая типизация

Невероятные сверхспособности Scala​


  val x = "Hello"

  x / 2 

  // value / is not a member of String

Мощная библиотека коллекций

Невероятные сверхспособности Scala​


  val masha = ???
  val allPersons = ???

  def friendsOf(xs: Person*) = 
    xs.flatMap(x => 
      allPersons.filter(_.isFriendOf(x)).
      distinct

  friendsOf(masha)

   // Условная регулярка
   val Pattern = """(\d+).(\d+).(\d+)""".r

   "28.04.2016" match {
     case Pattern("22", "04", _) => 
       println("It's Lenins birthday!")
     case Pattern(day, month, year) => 
       startPartyAt(day, month, year)
     case _ => 
       throw new Exception("It's not a date!")
   }

Pattern matching

Невероятные сверхспособности Scala​


  // Объявляем AST
  trait PseudoHtml
  case class Node(name: Symbol, children: Seq[PseudoHtml]) extends PseudoHtml
  case class Attribute(name: Symbol, value: String) extends PseudoHtml
  case class Text(value: String) extends PseudoHtml

  // Объявляем сам eDSL
  implicit def stringToPseudeHtmlText(s: String) = Text(s)
  implicit class GenPseudoHtml(val symbol: Symbol) {
    def apply(xs: PseudoHtml*) = Node(symbol, xs)
    def /=(value: String) = Attribute(symbol, value)
  }

Дружественность к eDSL

Невероятные сверхспособности Scala​


  'ul('class /= "list"
    'li('class /= "item", "Vodka"),
    'li('class /= "item", "Balalayka"),
    'li('class /= "item", "Perestroyka")
  )

Дружественность к eDSL

Невероятные сверхспособности Scala​

Scala транслируется в JavaScript

  • Все пакуется в один файл
  • Неиспользуемый код удаляется
  • Оптимизируется через Closure Compiler

Scala транслируется в JavaScript

  • Наш гигантский SPA занимает всего 1,3 MB
  • А в сжатом виде всего 290 KB
  • Туда включен код компонентов
  • И даже часть CSS

Scala транслируется в JavaScript

  • Полная оптимизация - 3 минуты
  • Обычная сборка с нуля - 80 сек.
  • Инкрементальная компиляция - 8 сек.

Scala транслируется в JavaScript

  • Двустороннее взаимодействие с JS
  • Трансляция биндингов TS в Scala.js

Поддержка IDE

  • Автоимпорт проектов
  • Точное автодополнение
  • Точная навигация по коду

Вопросы?

Алексей Фомкин, Флексис

28 апреля 2016

http://twitter.com/yelbota

http://github.com/fomkin

mjs30-scala-superhero

By Aleksey Fomkin

mjs30-scala-superhero

  • 1,039