# Ring
Нет реализации — нет зависимостей,
багов, етц
Маленькая — легко реализовать
Низкоуровневая
Вход-выход — просто тестировать
Веб-сокеты не засунешь
Slide 6
Slide 6 text
# Middleware
(fn [handler ...] → handler’)
ring.middleware:
+ Sessions
+ Cookies
+ Uploads
+ Form parsing
...
Slide 7
Slide 7 text
# Диспатчинг
## Moustache
(def my-app (app
[“hi”] {:get “hello world only for GET!”}
[“hi” name] {:get [“hello “ name]}))
# Templating — ягодки
## Enlive
Парсинг и трансформация HTML
Код отдельно от верстки
Переиспользование snippets
Модификации можно комбинировать
Макросы!
Slide 12
Slide 12 text
# Templating — ягодки
## Enlive
(at a-node
[:a :selector] a-transformation
[:another :selector] another-transformation
...)
(html/deftemplate index “tutorial/template1.html”
[ctxt]
[:p#message] (html/content
(get ctxt :message “Nothing to see here”))
Slide 13
Slide 13 text
# Templating — ягодки
## Laser
Еще более функциональный
(laser/document
(laser/parse html)
(laser/class= “meow”)
(laser/content “omg”))
Slide 14
Slide 14 text
# Aleph
Сетевая библиотека
Общение через каналы
Conforms to Ring, только
request и response разделены
HTTP, WebSockets, TCP, UDP, Redis
# http-kit
Pure Java & Clojure, very small
Server & client
Ring-compliant
Websockets, long-polling,
streaming extensions
Slide 19
Slide 19 text
# edn
Data exchange format
Based on Clojure syntax
Rich set of elements
collections, symbols, keywords
Extensible for new types
Self-describing (no schema)
Namespaces
# edn
clojure.core/read-string
clojure.edn/read-string (since 1.5)
and
cljs.reader/read-string
Slide 23
Slide 23 text
# ClojureScript
Slide 24
Slide 24 text
# Lessons learned from Node.js
Писать клиент и сервер на одном
языке очень удобно!
Только почему на JavaScript?
Slide 25
Slide 25 text
# ClojureScript
JS is broken
Slide 26
Slide 26 text
# ClojureScript
JS is fundamentally broken
Slide 27
Slide 27 text
# ClojureScript
JS is fundamentally broken
Синтаксические изменения не спасут
Нужно править семантику
Slide 28
Slide 28 text
# Что сломано?
Типы
Структуры данных
Зависимости
Неймспейсы
Полиморфизм
Типовые операции
Slide 29
Slide 29 text
# CoffeeScript?
Типы
Структуры данных
Зависимости
Неймспейсы
Полиморфизм
Типовые операции
Slide 30
Slide 30 text
# CoffeeScript?
Типы
Структуры данных
Зависимости
Неймспейсы
Полиморфизм
Типовые операции
Slide 31
Slide 31 text
# CoffeeScript?
Типы
Структуры данных
Зависимости
Неймспейсы
Полиморфизм
Типовые операции
Slide 32
Slide 32 text
# CoffeeScript?
Типы
Структуры данных
Зависимости
Неймспейсы
Полиморфизм
Типовые операции
Slide 33
Slide 33 text
# CoffeeScript?
Типы
Структуры данных
Зависимости
Неймспейсы
Полиморфизм
Типовые операции
Slide 34
Slide 34 text
# CoffeeScript?
Типы
Структуры данных
Зависимости
Неймспейсы
Полиморфизм
Типовые операции
Slide 35
Slide 35 text
# CoffeeScript?
Типы
Структуры данных
Зависимости
Неймспейсы
Полиморфизм
Типовые операции
Slide 36
Slide 36 text
# CoffeeScript?
Типы
Структуры данных
Зависимости
Неймспейсы
Полиморфизм
Типовые операции
Меньше кнопок нажимать
Slide 37
Slide 37 text
# Как правильно?
Состояние
Иммутабельность
ФП
Макросы
Строгая типизация
Протоколы
Slide 38
Slide 38 text
# Как правильно?
Стандартные решения
для стандартных проблем
Slide 39
Slide 39 text
# Как правильно?
Стандартные решения
для стандартных проблем
Реализаций import: 0
ООП-фреймворков: 0
Альтерн. синтаксисов: 0
Альтерн. коллекций: 0
Monad tutorials: 0
Slide 40
Slide 40 text
# Как работает?
Компилируется на большой Clojure
Генерирует Javascript для
Google Closure Compiler
Оптимизируется
Google Closure Compiler
Зависимости через
Goolge Closure Library
Slide 41
Slide 41 text
Notice Clojure (Rich Hickey)
and Closure (Google)
Slide 42
Slide 42 text
# Компиляция?
Dead code elimination
Smart code compression
Снимает browser quirks
Может увеличить производительность
Debug :(
Slide 43
Slide 43 text
# Отличия от Clojure
Однопоточный
Compilation и macroexpansion
только на Clojure (no eval)
Browser-connected REPL
Native JS regexes
Slide 44
Slide 44 text
# Отличия от Clojure
Atoms, but no Refs nor STM
No Vars
No agents
No symbol or var (def) metadata
Slide 45
Slide 45 text
# Отличия от Clojure
(.foo o) => o.foo()
(.-foo o) => o.foo
Slide 46
Slide 46 text
# Персистентные структуры данных
Native JS impl
http://www.50ply.com/cljs-bench/
2-6 times slower than JVM
Google Chrome usually ×3-5 times
faster than Safari / FF
Slide 47
Slide 47 text
# Персистентные структуры данных
Slide 48
Slide 48 text
# Персистентные структуры данных
Slide 49
Slide 49 text
# Зачем?
Разработка больших приложений
Организация кода
Командная работа
Переиспользуемость кода
Производительность, оптимизация
Slide 50
Slide 50 text
# Библиотеки
No problem
Нужен extern файл
/**
* @param {(string|Object.)} arg1
* @param {Object.=} settings
* @return {jQuery.jqXHR}
*/
jQuery.ajax = function(arg1, settings) {};