JavaScript & modern scala backend
Transcript of JavaScript & modern scala backend
FOSS-SEA 2013
JavaScript & modern scala backendRuslan Shevchenko
<[email protected]>@rssh1
(gradsoft, gosave)
Есть ли у нас план ?
● - обзор архитектур web приложений– 90, MVC, ROR-Like, one-page ..
● - scala-frameworks– lift, play, spray.io, scalatra
● - использование и генерация javascript– jscala, scala-js
Конфигурация по умолчанию
Раутер, контроллер и модель структрируются автоматически на основе соглашений
MV
C
MVC
Scala
● Почему не javascript ?● - static typing. ● ● <troll-mode-on>
● [99, 100, 101].sort()● </troll-mode-off>●
Main frameworks:
● Lift– (old-style, presentation first)
● Play– (mainstream, ROR analog)
● Spray.io– (ligthweight, RPC style)
● Scalatra– (servlet compatible)
Lift
def render = {
"type=submit" #>
SHtml.submit("Register", process,
"onclick" -> JsIf(JsEq(ValById("first_name"), ""), Alert("alert") & JsReturn(false)).toJsCmd)
}
Работа фреймворка – преобразование XML (свои теги)
Play
– раутер — конфигурация - контроллер — синхронная или Асинхронаая функция из Request в response - view – compile-time шаблоны (мы не используем)
Netty, в будущем — миграция на spray.ioo
Play / Example
def index = Action.async {
val futureInt = Future { intensiveComputation() }
val timeoutFuture = Promise.timeout("Oops", 1.second)
Future.firstCompletedOf(Seq(futureInt, timeoutFuture)).map {
case i: Int => Ok("Got result: " + i)
case t: String => InternalServerError(t)
}
}
Play/JSON
case class Person(
name: String, age: Int)
object Person{
implicit val personFmt =
Json.format[Person]
}
JavaScript / scala
● Write in scala, produce javascriot– Jscala http://www.jscala.org
● (lightweight, macros, from Alexander Nemish, Kiev)
– Scala-js http://www.scala-js.org● (fully functional scala-to-js compiler, EPFL institute)
jscalaimport org.jscala._
@JavaScript class Test {
def hello() {
print("Hello")
}}
val testJs = Test.javaScript.as[JsStmt] // Get class Test JsAst
val main = javascript {
val t = new Test()
t.hello()}
jscala
val testJs = Test.javaScript.as[JsStmt]
val main = javascript {
val t = new Test()
t.hello()}
jscala
● Исполнение – макросы– @JavaScript, javascript{ .. }
● Подмножество scala– нет стандартные scala-lib – Урезанные управляющие структуры, – DOM API динамическое(пока)
● Компактный читаемый javascript без runtime
scala-js
● Полноценный компилятор● Все фичи скалы, ● Полноценная библиотека● Порядка 10 Mb рантайма / стандартных
бибилиотек (js)– Используется google closure дл я минимизации
Scala/javascript
●
● - API (thrift)● - спецификация API пишется на ● - генерация (jscala, scala-js)● ● - асинхронность
● Scala – Akka● Erlang, RxJava