class: center, middle
background-image: url(title.jpg)
title: Выкидываем ReactJS
description: Все знают, что много джаваскрипта - это плохо. Но как быть, когда сайт большой, и не хочется через несколько лет упереться в стандартную проблему jQuery (и других библиотек того же поколения) - постоянные конфликты композиции? Послушайте о том, куда решились спрыгнуть в Kasta, и что в результате получилось.
???
- Кто я
- Зачем вообще реакт (и предшественники)
- Как начали юзать реакт в касте
- Google Pagespeed, история про эйр
- Intercooler - идея, суть происходящего
- Трейдоффы
- Твинспарк
- результат
- hn?
- htmx, unpoly
- варианты развития
- live view
---
# Кто здесь
- CTO Kasta.ua
- Начал использовать ReactJS в июне 2013
- Выступал о нём N раз
---
# Предыстория
- 2002: ненавязчивый (unobtrusive) JS
- 2004: Dojo, Prototype, Gmail + Google Closure
- 2005+: Prototype, jQuery
- 2010+: Knockout.js, BackboneJS, AngularJS
- FRP, Flapjax, Hoplon
---
# Зачем React
- Приемлемая скорость
- Связность (cohesion) лучше
- Связанность (coupling) ниже
- Локальность поведения в коде
- Вид - функция от состояния
---
# Kasta 2015
- Было: Django + jQuery
- Стало: Clojure + CLJS + React
- Зачем?
---
# Результат
- Глобальный стор, с подписками на данные в компонентах
- Загрузка данных триггерится на маунте компонентов
- Один код исполняется в браузере и на JVM (никаких Node.js)
- Работающий live reload
---
class: center
# Oops
---
# Как же так
- .min.js - 2.5MB
- Если делить на модули, базовый модуль ~1.5MB
- Время загрузки Реакта на старых устройствах :(
---
# Неожиданное
- Логика отображения переползает в Реакт (вместо CSS)
- Сложная логика переползает на клиент с сервера (и потом надо повторять в аппах)
- Высокие требования к дисциплине и самоконтролю разработчика
---
# Intercooler.js
- Рендеринг только на сервере **(революция!)**
- Атрибуты элементов указывают, что обновлять *(bye-bye unobtrusive JS!)*
- Локальность кода ± окей
- Легко (!) перейти с текущей модели рендеринга
---
# Intercooler.js
## AJAX With Attributes
```
Click Me!
```
intercoolerjs.org
---
# Проблемы?
- Вид больше **не** функция от состояния :(
- Очень сложные интерфейсы делать очень сложно (*#давайпока*)
- Привычки фронтендщикам приходится менять :)
- Дебажить иначе?
- jQuery
- Наследование атрибутов
- Отсутствие расширяемости
---
# TwinSpark
- Без jQuery (и поддержки IE)
- Без наследования
- Легко добавлять новые атрибуты
- **700** строк кода
- **11KB** .min.js
- За 4 месяца переделали каталог
---
class: center
# Демо
```html
```
--- class: center # Результат