JavaScript & modern scala backend

26
FOSS-SEA 2013 JavaScript & modern scala backend Ruslan Shevchenko <[email protected]> @rssh1 (gradsoft, gosave)

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

90-е

Запрос / Страничка html (JavaScript испрользуется только локально)

Структризация обработки

Разделение на блоки контроллера, модели и представления

MV

C

MVC

Конфигурация по умолчанию

Раутер, контроллер и модель структрируются автоматически на основе соглашений

MV

C

MVC

Появление Ajax

Javascript может делать запросы к серверу и Подгружать информацию

MV

C

MVC

Rich client

Presentation Layer переезжает на клиент

M

V

C

REST

Rich client/ backbone style

M

V

C

REST

Взаимодействие = синхронизация моделей

Rich client / Angular style

Клиент - самостоятельно приложение (обращается по RPC)

M

V

C

RPC

Тенденции

Если persistence умеет REST — зачем нам application ?

M

V

C

RPC

Тенденции

Возможность интеракций инициированных сервером (websockets, comet)

M

V

C

Scala

● Почему не javascript ?● - static typing. ● ● <troll-mode-on>

● [99, 100, 101].sort()● </troll-mode-off>●

Scala

● Почему javascript ?● - описание структур ● - передача на клиент поведения●

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

import org.jscala._

@JavaScript class Test {

def hello() {

print("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

Спасибо за внимание

● Вопросы ?●

● - Руслан Шевченко ● @rssh1● <[email protected]>●