SlideShare a Scribd company logo
1 of 45
Download to read offline
Изоморфная разработка
c React.js
@maxmaxmaxmaxМАКСИМ КЛИМИШИН
CTO ZAKAZ.UA
GVMachines Inc.
Что такое
изоморфный код?
isomorphic
Возможностьиспользовать
одини тотжекод
какнаклиентетакинасервере
ISOMORPHIC
СЕЙЧАС
CLIENT
API
SERVER
изоморфный код
Valueproposition
Проблемыonepageapps
Зачем это надо?
‣ Производительность-загрузкаданных,
задержкаотображенияпристарте
‣ Тяжелаяоперацияпорендерингуисозданию
DOM-дерева
‣ Недружелюбныедлякраулеров(hashbang)
Проблемыархитектуры
Зачем это надо?
‣ Двойнаявалидациявходныхданных
‣ Поддержкасложнойбизнес-логики
одновременнонаклиентеинасервере
‣ Зависимость отсерверавмобильных
приложениях
ИзоморфныйJavaScript
может
решитьэти проблемы
Зачем это надо?
CSPChannels
Communicating sequentialprocesses
‣ Параллельныепроцессыобмениваются
информацией
‣ Безбуферныйобменинформациейтипа
«рандеву»
‣ Взаимодействиепроисходитчерезканал
CSPchannels
var ch = chan();
go(function*() {
yield put(ch, 1);
console.log(2);
yield put(ch, 3);
console.log(yield take(ch));
});
go(function*() {
console.log(yield take(ch));
//yield timeout(100);
console.log(4);
console.log(yield take(ch));
yield put(ch, 5);
});
Пример
1
4
2
3
5
Результат
CSP
React.js
Чтонужно
‣ Рендеритькомпонентына сервере
‣ Обновлятьданныенаклиенте без
перезагрузкистраницы
‣ Максимальноунифицироватькодсервераи
клиента
Состояниезапроса
‣ Location
‣ Cookies
‣ GETparams
‣ POSTparams
request = url + cookies + get + post
Пример
{
client: (location) => {
return state.merge(Map([
["url", location.pathname],
["protocol", location.protocol],
["hostname", location.hostname],
["hash", location.hash]
]));
},
server: (request) => {
return state.merge(Map([
["url", request.url],
["method", request.method]
]));
}
}
Состояниеприложения
‣ API/external sourcecall1,
‣ Call2
‣ Calli
state = f(request)
Архитектурно
REQUEST STATE APPBROWSER
APIRESPONSE
ISOMORPHICRENDER
APP
Архитектурно
state = f(request)
dom_cli = React.render(…state)
html_srv = React.renderToString(…state)
Пример
module.exports = React.createClass({
statics: {
// state will be executed within CSP `go` routine
state: function(state, channel) {
return go(function * () {
yield put(channel, ["title", "World"]);
channel.close(); }) }
},
render: function () {
return <h1>Hello, <span>{this.props.title}</span></h1>
}})
Пример
var stateCh = chan(),
component = React.createFactory(type);
type.state ? type.state(state, stateCh) : null;
go(function *() {
var context = Map(yield take(stateCh));
yield put(renderCh, Map([
…
[keys.state, context],
[keys.render, {server: server(component),
client: client(component)}]
]))});
Пример
var client = (component) => {
return (context) => {
return React.render(
component(context.get(keys.state).toObject()),
document.getElementById(context.get(keys.name)));
}};
var server = (component) => {
return (context) => {
return React.renderToString(
component(context.get(keys.state).toObject()));
}};
isoroutes
Попробоватьможно
https://goo.gl/xyptPx
КакэтосделатьвReact.js
‣ вroot-овомкомпонентеопределить
статическийизоморфныйметод,который
‣ собираетсостояниезапроса:path,cookies
getparams,postparams
‣ консолидируетзаборданных
‣ отложитьрендерroot-овогокомпонентадо
концавыполненияметода
Решения
‣ Relay–анализзапросов,cache engine
‣ GraphQL– консолидируетсложность API
‣ Transmit– оченьтупая queryengine,которая
делегируетсянакодquery
Relay
Relay.createContainer(Story, {
queries: {
story: graphql`
Story {
author {
name,
profile_picture {
uri
}
},
text}`
}
Недостатки
‣ Relay– нетрелиза
‣ GraphQL– нет релиза,ноестьпарсер
Transmit.createContainer(Main, {
queryParams: {
pagesToFetch: 10
},
queries: {
/**
* Return a Promise */
data: function (queryParams) {
// isomorphic fetch
return fetch(…).then(…)
}
}
Transmit
заменаrelay+graphqlнапромисы
Transmit
Попробоватьможнов
google://react-isomorphic-starterkit
64Крезультатовisomorphicreact.js
против 47Mreact.js
React Native
теперьможносоздавать
мобильныеприложения
МОБИЛЬНЫЕ
Реактдоставляэ.
REACT NATIVE
CLIENT
SERVER
изоморфный код
API
MOBILE
Изоморфный JSкак
отдельныйсервис
Service
‣ Асинхронная загрузкаданныхрасполагаетк
медленномубекенду
‣ Тупоекешированиеприводитксложной
инвалидации
Проблемс
Апочему-быне сделать
отдельныйсервис,который
рендеритJavaScriptгденадо
Service
Service
‣ Синхронныйсервис
‣ Очередь задач,асинхронно
Дваварианта
Service
приложение
database cache node.js
rendered rendered
task1
запрос2
state
серверзадачnode.js
запрос1
state
task2
cache
Полезнодлямозга
Выводы
Выводы
‣ Увеличиваетсяколичествоsharedкода,
уменьшаетсярассеивание бизнеслогики
междуразнымиплатформами(клиент,сервер,
мобильные)
‣ УлучшаетсяUX– засчет пререндеринга
пользовательполучаеткартинкунаэкране
быстрее
‣ Улучшаетсявидимостьвпоисковыхсистемах
‣ НенужновсепереписыватьнаJavaScript
Недостатки
‣ Ограничениявсехплатформ,учавствующихв
выполненииприложения (клиент∩сервер∩
мобильный)
‣ Увеличиваетколичествокомпонентовв
системе(если неnode.js-basedпроект)
‣ Сложнеетестировать
Ктовтеме
Выводы
‣ Facebook
‣ Instagram
‣ Yahoo!Mail
‣ Walmart
‣ Airbnb
‣ Netflix
@maxmaxmaxmax

More Related Content

Similar to Isomorphic React.js (by Maksym Klymyshyn) - Hack'n'Tell JavaScript - 2015.05.16

"Изоморфная разработка на javascript с помощью react.js" Максим Климишин
"Изоморфная разработка на javascript с помощью react.js" Максим Климишин"Изоморфная разработка на javascript с помощью react.js" Максим Климишин
"Изоморфная разработка на javascript с помощью react.js" Максим КлимишинFwdays
 
Микросервисы, чистый PaaS и конкурс Мисс Россия
Микросервисы, чистый PaaS и конкурс Мисс РоссияМикросервисы, чистый PaaS и конкурс Мисс Россия
Микросервисы, чистый PaaS и конкурс Мисс РоссияAlexander Byndyu
 
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...e-Legion
 
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС «Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС 2ГИС Технологии
 
Node.js Меньше сложности, больше надежности Holy.js 2021
Node.js Меньше сложности, больше надежности Holy.js 2021Node.js Меньше сложности, больше надежности Holy.js 2021
Node.js Меньше сложности, больше надежности Holy.js 2021Timur Shemsedinov
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Ontico
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинSergey Xek
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только одинHappyDev
 
Mihail Zachepilo - WebAssembly powered Machine Learning
Mihail Zachepilo - WebAssembly powered Machine LearningMihail Zachepilo - WebAssembly powered Machine Learning
Mihail Zachepilo - WebAssembly powered Machine LearningOdessaJS Conf
 
Mihail Zachepilo - WebAssembly powered Machine Learning
Mihail Zachepilo - WebAssembly powered Machine LearningMihail Zachepilo - WebAssembly powered Machine Learning
Mihail Zachepilo - WebAssembly powered Machine LearningMaria Kuneva
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаAndrey Karpov
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаcorehard_by
 
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...Oleg Chirukhin
 
Асинхронный биллинг для службы такси - IzhDevCom November 2014
Асинхронный биллинг для службы такси - IzhDevCom November 2014Асинхронный биллинг для службы такси - IzhDevCom November 2014
Асинхронный биллинг для службы такси - IzhDevCom November 2014Egor Konovalov
 
KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)
KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)
KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)SIPLABS Communications
 
Cloud APIs - обзор API западных провайдеров и API Scalaxy, Нат Гаджибалаев
Cloud APIs - обзор API западных провайдеров и API Scalaxy, Нат ГаджибалаевCloud APIs - обзор API западных провайдеров и API Scalaxy, Нат Гаджибалаев
Cloud APIs - обзор API западных провайдеров и API Scalaxy, Нат ГаджибалаевFuenteovejuna
 
Фронтенд разработка без боли
Фронтенд разработка без болиФронтенд разработка без боли
Фронтенд разработка без болиAnton Piskunov
 
«Рамблер Касса» как пример высокопроизводительного проекта на .Net (Дмитрий П...
«Рамблер Касса» как пример высокопроизводительного проекта на .Net (Дмитрий П...«Рамблер Касса» как пример высокопроизводительного проекта на .Net (Дмитрий П...
«Рамблер Касса» как пример высокопроизводительного проекта на .Net (Дмитрий П...Ontico
 
Symfony в архитектуре Upwork Enterprise
Symfony в архитектуре Upwork EnterpriseSymfony в архитектуре Upwork Enterprise
Symfony в архитектуре Upwork EnterpriseDmitry Semenov
 
Как не наступить на грабли, внедряя скрипты в java приложение
Как не наступить на грабли, внедряя скрипты в java приложениеКак не наступить на грабли, внедряя скрипты в java приложение
Как не наступить на грабли, внедряя скрипты в java приложениеSergey Tselovalnikov
 

Similar to Isomorphic React.js (by Maksym Klymyshyn) - Hack'n'Tell JavaScript - 2015.05.16 (20)

"Изоморфная разработка на javascript с помощью react.js" Максим Климишин
"Изоморфная разработка на javascript с помощью react.js" Максим Климишин"Изоморфная разработка на javascript с помощью react.js" Максим Климишин
"Изоморфная разработка на javascript с помощью react.js" Максим Климишин
 
Микросервисы, чистый PaaS и конкурс Мисс Россия
Микросервисы, чистый PaaS и конкурс Мисс РоссияМикросервисы, чистый PaaS и конкурс Мисс Россия
Микросервисы, чистый PaaS и конкурс Мисс Россия
 
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
 
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС «Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
 
Node.js Меньше сложности, больше надежности Holy.js 2021
Node.js Меньше сложности, больше надежности Holy.js 2021Node.js Меньше сложности, больше надежности Holy.js 2021
Node.js Меньше сложности, больше надежности Holy.js 2021
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
 
Mihail Zachepilo - WebAssembly powered Machine Learning
Mihail Zachepilo - WebAssembly powered Machine LearningMihail Zachepilo - WebAssembly powered Machine Learning
Mihail Zachepilo - WebAssembly powered Machine Learning
 
Mihail Zachepilo - WebAssembly powered Machine Learning
Mihail Zachepilo - WebAssembly powered Machine LearningMihail Zachepilo - WebAssembly powered Machine Learning
Mihail Zachepilo - WebAssembly powered Machine Learning
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
 
Асинхронный биллинг для службы такси - IzhDevCom November 2014
Асинхронный биллинг для службы такси - IzhDevCom November 2014Асинхронный биллинг для службы такси - IzhDevCom November 2014
Асинхронный биллинг для службы такси - IzhDevCom November 2014
 
KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)
KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)
KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)
 
Cloud APIs - обзор API западных провайдеров и API Scalaxy, Нат Гаджибалаев
Cloud APIs - обзор API западных провайдеров и API Scalaxy, Нат ГаджибалаевCloud APIs - обзор API западных провайдеров и API Scalaxy, Нат Гаджибалаев
Cloud APIs - обзор API западных провайдеров и API Scalaxy, Нат Гаджибалаев
 
Фронтенд разработка без боли
Фронтенд разработка без болиФронтенд разработка без боли
Фронтенд разработка без боли
 
«Рамблер Касса» как пример высокопроизводительного проекта на .Net (Дмитрий П...
«Рамблер Касса» как пример высокопроизводительного проекта на .Net (Дмитрий П...«Рамблер Касса» как пример высокопроизводительного проекта на .Net (Дмитрий П...
«Рамблер Касса» как пример высокопроизводительного проекта на .Net (Дмитрий П...
 
Symfony в архитектуре Upwork Enterprise
Symfony в архитектуре Upwork EnterpriseSymfony в архитектуре Upwork Enterprise
Symfony в архитектуре Upwork Enterprise
 
Как не наступить на грабли, внедряя скрипты в java приложение
Как не наступить на грабли, внедряя скрипты в java приложениеКак не наступить на грабли, внедряя скрипты в java приложение
Как не наступить на грабли, внедряя скрипты в java приложение
 

More from Intersog

The power of 1 on 1
The power of 1 on 1 The power of 1 on 1
The power of 1 on 1 Intersog
 
FrontEnd: JS + css + html
FrontEnd: JS + css + htmlFrontEnd: JS + css + html
FrontEnd: JS + css + htmlIntersog
 
Clients mean all_for_us
Clients mean all_for_usClients mean all_for_us
Clients mean all_for_usIntersog
 
Intersog Hack_n_Tell. Docker. First steps.
Intersog Hack_n_Tell. Docker. First steps.Intersog Hack_n_Tell. Docker. First steps.
Intersog Hack_n_Tell. Docker. First steps.Intersog
 
How to bring greater QA value with a little bit of release management
How to bring greater QA value with a little bit of release managementHow to bring greater QA value with a little bit of release management
How to bring greater QA value with a little bit of release managementIntersog
 
How to Create a Data Infrastructure
How to Create a Data InfrastructureHow to Create a Data Infrastructure
How to Create a Data InfrastructureIntersog
 
No one likes getting up at 3 am to fix bugs OR how to be a better developer
No one likes getting up at 3 am to fix bugs OR how to be a better developerNo one likes getting up at 3 am to fix bugs OR how to be a better developer
No one likes getting up at 3 am to fix bugs OR how to be a better developerIntersog
 
Как не завалить клиентское интервью
Как не завалить клиентское интервьюКак не завалить клиентское интервью
Как не завалить клиентское интервьюIntersog
 
Agile business development.
Agile business development. Agile business development.
Agile business development. Intersog
 
Infographic based on "Scrum: the art of doing twice the work in half the time"
Infographic based on "Scrum: the art of doing twice the work in half the time"Infographic based on "Scrum: the art of doing twice the work in half the time"
Infographic based on "Scrum: the art of doing twice the work in half the time"Intersog
 
Java4hipsters
Java4hipsters Java4hipsters
Java4hipsters Intersog
 
Final countdown-in-sales
Final countdown-in-salesFinal countdown-in-sales
Final countdown-in-salesIntersog
 
Как пройти пути от любительских поделок на Arduino до промышленных решений за...
Как пройти пути от любительских поделок на Arduino до промышленных решений за...Как пройти пути от любительских поделок на Arduino до промышленных решений за...
Как пройти пути от любительских поделок на Arduino до промышленных решений за...Intersog
 
Стек протоколов для IoT. Пример использования SNMP
Стек протоколов для IoT. Пример использования SNMPСтек протоколов для IoT. Пример использования SNMP
Стек протоколов для IoT. Пример использования SNMPIntersog
 
DIY IoT: Raspberry PI 2 + Windows 10 for IoT devices + Microsoft Azure
DIY IoT: Raspberry PI 2 + Windows 10 for IoT devices + Microsoft AzureDIY IoT: Raspberry PI 2 + Windows 10 for IoT devices + Microsoft Azure
DIY IoT: Raspberry PI 2 + Windows 10 for IoT devices + Microsoft AzureIntersog
 
Zigbee social network
Zigbee social networkZigbee social network
Zigbee social networkIntersog
 
​Успешные, популярные и интересные IoT проекты в США. Тренды
​Успешные, популярные и интересные IoT проекты в США. Тренды​Успешные, популярные и интересные IoT проекты в США. Тренды
​Успешные, популярные и интересные IoT проекты в США. ТрендыIntersog
 
Small tips для иррационала
Small tips для иррационалаSmall tips для иррационала
Small tips для иррационалаIntersog
 
Healthcare. Правила коммуникации.
Healthcare. Правила коммуникации.Healthcare. Правила коммуникации.
Healthcare. Правила коммуникации.Intersog
 
The Unicorn Workflow
The Unicorn WorkflowThe Unicorn Workflow
The Unicorn WorkflowIntersog
 

More from Intersog (20)

The power of 1 on 1
The power of 1 on 1 The power of 1 on 1
The power of 1 on 1
 
FrontEnd: JS + css + html
FrontEnd: JS + css + htmlFrontEnd: JS + css + html
FrontEnd: JS + css + html
 
Clients mean all_for_us
Clients mean all_for_usClients mean all_for_us
Clients mean all_for_us
 
Intersog Hack_n_Tell. Docker. First steps.
Intersog Hack_n_Tell. Docker. First steps.Intersog Hack_n_Tell. Docker. First steps.
Intersog Hack_n_Tell. Docker. First steps.
 
How to bring greater QA value with a little bit of release management
How to bring greater QA value with a little bit of release managementHow to bring greater QA value with a little bit of release management
How to bring greater QA value with a little bit of release management
 
How to Create a Data Infrastructure
How to Create a Data InfrastructureHow to Create a Data Infrastructure
How to Create a Data Infrastructure
 
No one likes getting up at 3 am to fix bugs OR how to be a better developer
No one likes getting up at 3 am to fix bugs OR how to be a better developerNo one likes getting up at 3 am to fix bugs OR how to be a better developer
No one likes getting up at 3 am to fix bugs OR how to be a better developer
 
Как не завалить клиентское интервью
Как не завалить клиентское интервьюКак не завалить клиентское интервью
Как не завалить клиентское интервью
 
Agile business development.
Agile business development. Agile business development.
Agile business development.
 
Infographic based on "Scrum: the art of doing twice the work in half the time"
Infographic based on "Scrum: the art of doing twice the work in half the time"Infographic based on "Scrum: the art of doing twice the work in half the time"
Infographic based on "Scrum: the art of doing twice the work in half the time"
 
Java4hipsters
Java4hipsters Java4hipsters
Java4hipsters
 
Final countdown-in-sales
Final countdown-in-salesFinal countdown-in-sales
Final countdown-in-sales
 
Как пройти пути от любительских поделок на Arduino до промышленных решений за...
Как пройти пути от любительских поделок на Arduino до промышленных решений за...Как пройти пути от любительских поделок на Arduino до промышленных решений за...
Как пройти пути от любительских поделок на Arduino до промышленных решений за...
 
Стек протоколов для IoT. Пример использования SNMP
Стек протоколов для IoT. Пример использования SNMPСтек протоколов для IoT. Пример использования SNMP
Стек протоколов для IoT. Пример использования SNMP
 
DIY IoT: Raspberry PI 2 + Windows 10 for IoT devices + Microsoft Azure
DIY IoT: Raspberry PI 2 + Windows 10 for IoT devices + Microsoft AzureDIY IoT: Raspberry PI 2 + Windows 10 for IoT devices + Microsoft Azure
DIY IoT: Raspberry PI 2 + Windows 10 for IoT devices + Microsoft Azure
 
Zigbee social network
Zigbee social networkZigbee social network
Zigbee social network
 
​Успешные, популярные и интересные IoT проекты в США. Тренды
​Успешные, популярные и интересные IoT проекты в США. Тренды​Успешные, популярные и интересные IoT проекты в США. Тренды
​Успешные, популярные и интересные IoT проекты в США. Тренды
 
Small tips для иррационала
Small tips для иррационалаSmall tips для иррационала
Small tips для иррационала
 
Healthcare. Правила коммуникации.
Healthcare. Правила коммуникации.Healthcare. Правила коммуникации.
Healthcare. Правила коммуникации.
 
The Unicorn Workflow
The Unicorn WorkflowThe Unicorn Workflow
The Unicorn Workflow
 

Isomorphic React.js (by Maksym Klymyshyn) - Hack'n'Tell JavaScript - 2015.05.16