ݺߣ

ݺߣShare a Scribd company logo
@maxmaxmaxmaxМАКСИМ КЛИМИШИН
CTO GVMachines Inc.
React.js:
ускоряем UX / UI
Обомне
‣ 12+ летопытавебразработки,6летJavaScript,
7летPython,годсClojure
‣ Работалв oDesk(Upwork),Helios,
42CoffeeCups.
‣ Со-организаторконференцийPyConUkraine,
KyivJS,KyivPy,Hotcode
‣ с2012годаработаюCTOв GVMachinesInc.
GVMachinesInc.
‣ Стартап по доставкепродуктовпитанияиз
супермаркетов
‣ РаботаемвУкраинекакZAKAZ.UA (Киев,
Днепропетровск,Харьков,скороввашем
городе)ив СШАкакCartFresh(Бостон)
‣ Pythonнабекенде
Нашпуть
Сегодняпоговоримо
Тема
‣ Чтоу насбыло
‣ Почему мыосталисьсReact.js
‣ Каксделать быстрее
‣ Планы
Архитектура
Как это было
АрхитектураПО– этофундаментальные
структурныерешения,которыебудет
несоизмеримодорого изменитьпосле
реализации
Чтоунасбыло
Тема
‣ Python+ Django
‣ Solr+специфичные индексы
‣ Redis
‣ jQuery +jQuery UI +bootstrap2
Как это было
Решили ехатьсjQueryиBootstrap,
неособозаморачиваясьнадкодом
Maintainability
Как это было
Поддерживаемостьсистемы– этокогда
стоимостьпервоначальнойреализации
существеннобольшевсравнениисо
стоимостьюизменений
Как это было
‣ Кодаставалобольше,менятьбылосложнее.
‣ Корзинагенериласьвiframeогромным
кускомDjango-шаблона.Работатьбыло
крайнесложно.
‣ Страницапродукта– сложныймикс
контекстадляшаблона,шаблонаи
несколькихjsфайлов
‣ JSкод вперемешкусDjangoTemplates
‣ Фиксоднойошибкипорождалдвеновые
Решение
Стратегия
Разработка
‣ Опробоватьновыетехнологии:Angular,
Backbone,React.js
‣ Внедрять постепенно,неломаяподорогеине
переписываявесьпроект
‣ Интеграционныетесты
Результат
Разработка
‣ Angularотпалсразукакслишкомсложный
‣ Backbone.jsбыл,нонатотмоментунегобыли
проблемысутечкойпамятииникакого
преимуществапосравнению сjQuery кодомне
было
Разработка
React.jsприжился,посколькоощутимо
выигрывалвпроизводительностиперед
фреймворками,приэтом нетребовалслишком
глубокознанияинструмента
Разработка
Ключевыепреимущества
‣ Еслипрегенерироватькоднасервере– реакт
небудетэтогоделатьна клиенте
‣ Длягенерациидостаточноподатьодинаковое
состояние
‣ Еслисостояние междугенерациейи
отображениемизменится – реактпроизведет
минимальноеколичествоизменений DOM
Результат
Разработка
Короче,мыкупилисьнато,каккомандаReact.js
превратилиO(n3)проблемув O(n)спомощью
двухпростыхдопущений
Процесс
Планируем
Процесс
‣ Переходплавный, дляначала
переписываемсамую ключевую часть–
 корзину
‣ Решили обойтись безcommon.jsи т.п.–
невсечленыкомандыпонимали как
этоработает
Планируем
Процесс
‣ Серверный рендеринг – второй этап
‣ Переводкаталога– третий этап
‣ Переводвзаимодействия с
пользователем– четвертый этап
Всекакобычно
Процесс
‣ Послекорзины2года мышли к
каталогу
‣ Серверный рендеринг реализован
несколько месяцевпосле
полноценной работыкаталога
Разницав перспективе
Процесс
‣ Походузнакомствосновыми
концепциями:CSP,ImmutableDS,
Clojure,CRDT,Haskell
‣ Теория очередей,практическая
работапо моделированию
Процесс
‣ Втораяитерация затянуласьс
аутсорсом
‣ Привычка генерироватьсостояние
server-sideдобавилагеморроя
‣ Изменениявынудили написатьновый
бекенддляAPI
React.js: Ускоряем UX/UI
Плохиерешения
Процесс
‣ Строитьновуюсистемумаксимально
используястарыйбекендпривелок
нереальному усложнениюкодабекенда
‣ Использовать подходс$.ajaxвнутри
React.jsкомпонентпривелок
усложнениюи copy-paste-styleкодуна
клиенте
Плохиерешения
Процесс
‣ Продолжитьиспользованиеглобальных
переменных
‣ Продолжитьиспользоватьглобальные
события
Детали
React.js: Ускоряем UX/UI
УнифицированныйAPI
Детали
‣ Решениевынестисложностьпо
генерациисостояниявAPIс
возможностью композициииаггрегации
‣ Один APIдля всех– Mobileapp,website
front-end
УнифицированныйAPI
Детали
‣ Решениевынестисложностьпо
генерациисостояниявAPIс
возможностью композициииаггрегации
‣ APIиспользуеткак бекендтакиклиент
‣ Избавилоотнеобходимостиотдавать
сайтчерез node.js сервер
Side-effects
Детали
‣ Параллельные запросыводномAPI
вызове
‣ Простыеипонятныеошибкивалидации
аргументов
‣ Генерация документациинабазе
простойинтроспекцииAPIвызовов
Примерзапроса
Детали
{
"meta": {"session_id": “%SESSION_ID”},
"request": [
{
"type": "timewindows.list",
"args": {
"store_ids": ["00002111"],
"zone_id": "02111"
},
"v": "0.1"
}
]
}
Примердоки
Детали
MODULE: timewindows
-------------------------------------------
RESOURCE: timewindows.list
{'count': <Or(<Int(gt=0)>, <Null>)>,
'index': <class 'trafaret.Int'>,
'only_available': <class 'trafaret.Bool'>,
'store_ids': <List(<String>)>,
'zone_id': <String>}
Архитектура
APISERVERS
request
state
generated
stateresponse
RENDERING
WORKER
REACT.JSDOM
RENDERER
put htmlinto
cache
CACHESERVERS
time
React.js: Ускоряем UX/UI
Чтодальше?
Планы
‣ детерминированнаямодельдля
инвалидациисгенерированногодома
дерева
‣ Уменьшениеколичестваасинхронного
кодав JS(CSP)
‣ Неизменяемые структуры(Redux,
Immutable)
‣ Работас корзинойчерезCRDT-базу
Планы
static state (state, channel, n=0) {
// we could use CSP channels here
return go(function * () {
yield put(channel, title(“About"));
var talks = yield take(json({url: “/api/talks.json”}));
yield put(channel, [“talks", talks]);
channel.close()
})
}
Communicatingsequentialprocesses
Планы
CRDT(Swarm.js)
Спасибо.
Thanks!
@maxmaxmaxmax

More Related Content

React.js: Ускоряем UX/UI