SlideShare a Scribd company logo
1 of 43
Download to read offline
@maxmaxmaxmaxМАКСИМ КЛИМИШИН
CTO ZAKAZ.UA
GVMachines Inc.
Изоморфный
JavaScript
Обомне
‣ 11+ летопытавебразработки,5летJavaScript,
6летPython
‣ Работалв oDesk,Helios,42cc.
‣ Со-организаторконференцийPyConUkraine,
KyivJS
‣ 3годаработаютехническимдиректоромв
ZAKAZ.UA
Что такое
изоморфный код?
isomorphic
Возможностьиспользовать
одини тотжекод
какнаклиентетакинасервере
ISOMORPHIC
СЕЙЧАС
CLIENT
API
SERVER
изоморфный код
Зачем этонадо?
Проблемыonepageapps
Зачем это надо?
‣ Производительность-загрузкаданных,
задержкапри старте
‣ Тяжелаяоперацияпорендерингуисозданию
DOM-дерева
‣ Недружелюбныедлякраулеров(hashbang)
Проблемыархитектуры
Зачем это надо?
‣ Двойнаявалидациявходныхданных
‣ Поддержкасложнойбизнес-логики
одновременнонаклиентеинасервере
‣ Зависимость отсерверавмобильных
приложениях
ИзоморфныйJavaScript
может
решитьэти проблемы
Зачем это надо?
ПочемуJavaScript?
Зачем это надо?
‣ Браузерыполноценноподдерживают
только JavaScript
‣ Все.
Проблема
JavaScript
Основныепреграды
JavaScript
‣ Несовместимыесcommon.jsбиблиотеки
‣ Плохаясовместимостьмодулей(backward
compatibility)
‣ Малоинструментовдляконтроля
асинхронногокода
‣ Глобальноесостояниеимутабельность
объектов
Чтоужеесть?
JavaScript
‣ React
‣ Meteor
‣ Derby
‣ Lazojs
‣ …
КУДА ДВИЖЕТСЯ
CLIENT
API
SERVER
изоморфный код
DATABASE CACHE
React Native
теперьможносоздавать
мобильныеприложения
МОБИЛЬНЫЕ
КУДА ДВИЖЕТСЯ
CLIENT
API
SERVER
изоморфный код
DATABASE CACHE
MOBILE
Такое заинтересует кого угодно
Такое заинтересует кого угодно
AST,LLVM
Естьвариантырешитьэту
проблемупо другому
Abstractsyntaxtree
AST
‣ pyjamasи другие-анализируетдерево python
кодаисоздаеткоднаfront-end
‣ проблемастем,чтонужнодобавлять runtime
языка,которыйиспользуется
‣ можноограничитьruntime,нос
неполноценнойподдержкойтрудно
AST
PYTHON
RUBY
…
AST JAVASCRIPT
RUNTIME
LLVM– Low LevelVirtualMachine
LLVM
‣ emscripten–тулзадляпреобразования LLVM в
JavaScript
‣ Онпортирруетстекит.д.
‣ Ноеслииспользоватьвместес Clojure
Compiler,токодбудетхорошо
оптимизированным
‣ Python,Rubyи всеязыкиLLVMвJavaScript
LLVM
PYTHON
RUBY
…
LLVM INTERMEDIATE JAVASCRIPT
RELOOPER ALGO
#include <stdio.h>
int main()
{
int sum = 0;
for (int i = 1; i <= 100; i++)
sum += i;
printf("1+...+100=%dn", sum);
return 0;
}
C
@.str = private constant [14 x
i8]
c"1+...+100=%d0A00"
define i32 @main() {
%1 = alloca i32, align 4
%sum = alloca i32, align 4
%i = alloca i32, align 4
store i32 0, i32* %1
store i32 0, i32* %sum, align 4
store i32 1, i32* %i, align 4
br label %2
; <label>:2
%3 = load i32* %i, align 4
%4 = icmp sle i32 %3, 100
br i1 %4, label %5, label %12
; <label>:5
%6 = load i32* %i, align 4
%7 = load i32* %sum, align 4
%8 = add nsw i32 %7, %6
store i32 %8, i32* %sum, align
4
br label %9
; <label>:9
%10 = load i32* %i, align 4
%11 = add nsw i32 %10, 1
store i32 %11, i32* %i, align 4
br label %2
; <label>:12
%13 = load i32* %sum, align 4
%14 = call i32 (i8*, ...)*
@printf(i8* getelementptr
inbounds
([14 x i8]* @.str, i32
0, i32 0),
i32 %13)
ret i32 0 }
LLVMassembly
function _main() {
var __label__;
var $1;
var $sum;
var $i;
$1 = 0;
$sum = 0;
$i = 0;
$2$2: while(1) {
var $3 = $i;
var $4 = $3 <= 100;
if (!($4))
{ __label__ = 2; break
$2$2; }
var $6 = $i;
var $7 = $sum;
var $8 = $7 + $6;
$sum = $8;
var $10 = $i;
var $11 = $10 + 1;
$i = $11;
__label__ = 0;
continue $2$2;
}
var $13 = $sum;
var $14 =
_printf(__str, $13);
return 0;
}
Low-levelJavaScript
function K() {
var a, b;
b = a = 0;
a:for(;;) {
if(!(b <= 100)) {
break a
}

a += b; b += 1;
}
_printf(J, a);
return 0;
}
+ClosureCompiler
Уподходов естьобщаяпроблема–
 debugging
Clojure&ClojureScript
Clojure
‣ КомпилируетсявJavaScript (какивлюбой
другойязык)потому синтаксисотсутствует
‣ SourceMaps+полноценнаяимплементация
рантайманаJavaScript– легкодебажить
‣ Неизменяемые структуры данных
ClojureScript
CLOJURESCRIPT JAVASCRIPT
CLOJURE RUNTIME
Lisp
Syntax free
Следствиемотсутствиясинтаксиса–
~35трансляторов/компиляторов/
интерпретаторовlisp-оподобныхязыков
OM
ClojureScript+OM
(defn- render-fn* []
(let [js (doto (.getEngineByName (ScriptEngineManager.) "nashorn")
; React requires either "window" or "global" to be defined.
(.eval "var global = this")
(.eval (-> "public/assets/scripts/main.js"
io/resource
io/reader)))
view (.eval js "omelette.view")
render-to-string (fn [edn]
(.invokeMethod
^Invocable js
view
"render_to_string"
(-> edn
list
object-array)))]
(fn render [title state-edn]
(html5
[:head
[:meta {:charset "utf-8"}]
[:meta {:http-equiv "X-UA-Compatible" :content "IE=edge,chrome=1"}]
Изоморфный JSкак
отдельныйсервис
Апочему-быне сделать
отдельныйсервис,который
рендеритJavaScriptгденадо
Service
Service
‣ Синхронныйсервис
‣ Очередь задач,асинхронно
Дваварианта
Service
приложение
database cache node.js
rendered rendered
task1
запрос2
state
серверзадачnode.js
запрос1
state
task2
cache
Выводы
Выводы
‣ Увеличиваетсяколичествоsharedкода,
уменьшаетсярассеивание бизнеслогики
междуразнымиплатформами(клиент,сервер,
мобильные)
‣ УлучшаетсяUX– засчет пререндеринга
пользовательполучаеткартинкунаэкране
быстрее
‣ Улучшаетсявидимостьвпоисковыхсистемах
‣ НенужновсепереписыватьнаJavaScript
Ктовтеме
Выводы
‣ Facebook
‣ Instagram
‣ Yahoo!Mail
‣ Walmart
‣ Airbnb
‣ Netflix
iForum 2015
@maxmaxmaxmax

More Related Content

What's hot

ZFConf 2010: History of e-Shtab.ru
ZFConf 2010: History of e-Shtab.ruZFConf 2010: History of e-Shtab.ru
ZFConf 2010: History of e-Shtab.ru
ZFConf Conference
 
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИСTARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
2ГИС Технологии
 
DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2
Alexander Makarov
 
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, JammitВёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Andrey Sitnik
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
it-people
 
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
2ГИС Технологии
 

What's hot (20)

UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Perl & Unicode
Perl & UnicodePerl & Unicode
Perl & Unicode
 
Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”
 
ZFConf 2010: History of e-Shtab.ru
ZFConf 2010: History of e-Shtab.ruZFConf 2010: History of e-Shtab.ru
ZFConf 2010: History of e-Shtab.ru
 
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИСTARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
 
DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2
 
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
 
Comma
CommaComma
Comma
 
Funny JS #1
Funny JS #1Funny JS #1
Funny JS #1
 
Основы доменной модели
Основы доменной моделиОсновы доменной модели
Основы доменной модели
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
 
Дмитрий Щадей "Зачем и как мы используем jsLint"
Дмитрий Щадей "Зачем и как мы используем jsLint"Дмитрий Щадей "Зачем и как мы используем jsLint"
Дмитрий Щадей "Зачем и как мы используем jsLint"
 
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, JammitВёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
 
Securing Rails Applications
Securing Rails ApplicationsSecuring Rails Applications
Securing Rails Applications
 
Не JS во фронтенде
Не JS во фронтендеНе JS во фронтенде
Не JS во фронтенде
 
Страх и ненависть в исходном коде
Страх и ненависть в исходном кодеСтрах и ненависть в исходном коде
Страх и ненависть в исходном коде
 
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
 
Proizvodnaya slozhnoj funkcii
Proizvodnaya slozhnoj funkciiProizvodnaya slozhnoj funkcii
Proizvodnaya slozhnoj funkcii
 

Viewers also liked

TIME: 2015 Person of the Year
TIME: 2015 Person of the YearTIME: 2015 Person of the Year
TIME: 2015 Person of the Year
guimera
 

Viewers also liked (12)

CSSO — минимизируем CSS
 CSSO — минимизируем CSS CSSO — минимизируем CSS
CSSO — минимизируем CSS
 
Дэвид Флэнаган — Javascript (5 издание)
Дэвид Флэнаган — Javascript (5 издание)Дэвид Флэнаган — Javascript (5 издание)
Дэвид Флэнаган — Javascript (5 издание)
 
TIME: 2015 Person of the Year
TIME: 2015 Person of the YearTIME: 2015 Person of the Year
TIME: 2015 Person of the Year
 
Though The Lens of an iPhone: Alaska
Though The Lens of an iPhone: AlaskaThough The Lens of an iPhone: Alaska
Though The Lens of an iPhone: Alaska
 
What Would da Vinci Do?
What Would da Vinci Do?What Would da Vinci Do?
What Would da Vinci Do?
 
The 2016 Economic Outlook in 17 Slides
The 2016 Economic Outlook in 17 SlidesThe 2016 Economic Outlook in 17 Slides
The 2016 Economic Outlook in 17 Slides
 
The Rise Of China
The Rise Of ChinaThe Rise Of China
The Rise Of China
 
Snapchat Visual Marketing Strategy
Snapchat Visual Marketing StrategySnapchat Visual Marketing Strategy
Snapchat Visual Marketing Strategy
 
Bill Aulet GEC2016 keynote speech March 16 2016 Medellin Colombia
Bill Aulet GEC2016 keynote speech March 16 2016 Medellin ColombiaBill Aulet GEC2016 keynote speech March 16 2016 Medellin Colombia
Bill Aulet GEC2016 keynote speech March 16 2016 Medellin Colombia
 
GAME ON! Integrating Games and Simulations in the Classroom
GAME ON! Integrating Games and Simulations in the Classroom GAME ON! Integrating Games and Simulations in the Classroom
GAME ON! Integrating Games and Simulations in the Classroom
 
The French Revolution of 1789
The French Revolution of 1789The French Revolution of 1789
The French Revolution of 1789
 
Can We Assess Creativity?
Can We Assess Creativity?Can We Assess Creativity?
Can We Assess Creativity?
 

Similar to Изоморфный JavaScript (iForum 2015)

PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
BlackFan
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
ZFConf Conference
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5
Technopark
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Ontico
 
Problems of Automated Generation of Exploits on the Basis of Source Code
Problems of Automated Generation of Exploits on the Basis of Source CodeProblems of Automated Generation of Exploits on the Basis of Source Code
Problems of Automated Generation of Exploits on the Basis of Source Code
Positive Hack Days
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf Conference
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest
 
Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)
Pavel Novitsky
 

Similar to Изоморфный JavaScript (iForum 2015) (20)

PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5
 
MSI In-Store Pickup Функционал & сложности
MSI In-Store Pickup Функционал & сложностиMSI In-Store Pickup Функционал & сложности
MSI In-Store Pickup Функционал & сложности
 
Perl in practice
Perl in practicePerl in practice
Perl in practice
 
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demo
 
JavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработкиJavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработки
 
"Изоморфная разработка на javascript с помощью react.js" Максим Климишин
"Изоморфная разработка на javascript с помощью react.js" Максим Климишин"Изоморфная разработка на javascript с помощью react.js" Максим Климишин
"Изоморфная разработка на javascript с помощью react.js" Максим Климишин
 
JPoint 2017 - Where is my service, dude?
JPoint 2017 - Where is my service, dude?JPoint 2017 - Where is my service, dude?
JPoint 2017 - Where is my service, dude?
 
Top 10 problems supporting Magento customers
Top 10 problems supporting Magento customersTop 10 problems supporting Magento customers
Top 10 problems supporting Magento customers
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
 
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
Zabbix в сервисной компании  ОНЛАНТА -  Zabbix Meetup Moscow Zabbix в сервисной компании  ОНЛАНТА -  Zabbix Meetup Moscow
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
 
Problems of Automated Generation of Exploits on the Basis of Source Code
Problems of Automated Generation of Exploits on the Basis of Source CodeProblems of Automated Generation of Exploits on the Basis of Source Code
Problems of Automated Generation of Exploits on the Basis of Source Code
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
 
Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)
 
Magento code debugging
Magento code debuggingMagento code debugging
Magento code debugging
 

More from Max Klymyshyn

Зачем читать чужой код?
Зачем читать чужой код?Зачем читать чужой код?
Зачем читать чужой код?
Max Klymyshyn
 

More from Max Klymyshyn (20)

Papers We Love Kyiv, July 2018: A Conflict-Free Replicated JSON Datatype
Papers We Love Kyiv, July 2018: A Conflict-Free Replicated JSON DatatypePapers We Love Kyiv, July 2018: A Conflict-Free Replicated JSON Datatype
Papers We Love Kyiv, July 2018: A Conflict-Free Replicated JSON Datatype
 
KharkivJS 2017: Коллаборативные системы и CRDT
KharkivJS 2017: Коллаборативные системы и CRDTKharkivJS 2017: Коллаборативные системы и CRDT
KharkivJS 2017: Коллаборативные системы и CRDT
 
OdessaJS 2017: Groupware Systems for fun and profit
OdessaJS 2017: Groupware Systems for fun and profitOdessaJS 2017: Groupware Systems for fun and profit
OdessaJS 2017: Groupware Systems for fun and profit
 
PyCon Ukraine 2017: Operational Transformation
PyCon Ukraine 2017: Operational Transformation PyCon Ukraine 2017: Operational Transformation
PyCon Ukraine 2017: Operational Transformation
 
Communicating Sequential Processes (CSP) in JavaScript
Communicating Sequential Processes (CSP) in JavaScriptCommunicating Sequential Processes (CSP) in JavaScript
Communicating Sequential Processes (CSP) in JavaScript
 
PiterPy 2016: Parallelization, Aggregation and Validation of API in Python
PiterPy 2016: Parallelization, Aggregation and Validation of API in PythonPiterPy 2016: Parallelization, Aggregation and Validation of API in Python
PiterPy 2016: Parallelization, Aggregation and Validation of API in Python
 
Fighting async JavaScript (CSP)
Fighting async JavaScript (CSP)Fighting async JavaScript (CSP)
Fighting async JavaScript (CSP)
 
React.js: Ускоряем UX/UI
React.js: Ускоряем UX/UIReact.js: Ускоряем UX/UI
React.js: Ускоряем UX/UI
 
KharkovPy #12: I/O in Python apps and smart logging (russian)
KharkovPy #12: I/O in Python apps and smart logging (russian)KharkovPy #12: I/O in Python apps and smart logging (russian)
KharkovPy #12: I/O in Python apps and smart logging (russian)
 
5 мифов о производительности баз данных и Python
5 мифов о производительности баз данных и Python5 мифов о производительности баз данных и Python
5 мифов о производительности баз данных и Python
 
Изоформные приложения на React.js
Изоформные приложения на React.jsИзоформные приложения на React.js
Изоформные приложения на React.js
 
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScriptТрансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
 
PiterPy 2015 - Трансдюсеры и Python
PiterPy 2015 - Трансдюсеры и PythonPiterPy 2015 - Трансдюсеры и Python
PiterPy 2015 - Трансдюсеры и Python
 
Robust web apps with React.js
Robust web apps with React.jsRobust web apps with React.js
Robust web apps with React.js
 
LvivJS 2014 - Win-win c React.js
LvivJS 2014 - Win-win c React.jsLvivJS 2014 - Win-win c React.js
LvivJS 2014 - Win-win c React.js
 
Инновации и JavaScript
Инновации и JavaScriptИнновации и JavaScript
Инновации и JavaScript
 
Odessapy2013 - Graph databases and Python
Odessapy2013 - Graph databases and PythonOdessapy2013 - Graph databases and Python
Odessapy2013 - Graph databases and Python
 
Angular.js - JS Camp UKraine 2013
Angular.js - JS Camp UKraine 2013Angular.js - JS Camp UKraine 2013
Angular.js - JS Camp UKraine 2013
 
Зачем читать чужой код?
Зачем читать чужой код?Зачем читать чужой код?
Зачем читать чужой код?
 
AgileBaseCamp 2013 - Start Up and Get Done
AgileBaseCamp 2013 - Start Up and Get DoneAgileBaseCamp 2013 - Start Up and Get Done
AgileBaseCamp 2013 - Start Up and Get Done
 

Изоморфный JavaScript (iForum 2015)