redux: the best for isomorphic apps

83
redux: the best for isomorphic apps Денис Измайлов Startup Makers 24 сентября 2015

Upload: denis-izmaylov

Post on 09-Jan-2017

574 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: redux: the best for isomorphic apps

redux: the bestfor isomorphic apps

Денис ИзмайловStartup Makers 24 сентября 2015

Page 2: redux: the best for isomorphic apps

Почему так?

2

Page 3: redux: the best for isomorphic apps

Как это связано?

3

Page 4: redux: the best for isomorphic apps

redux — очередной Flux?

4

Page 5: redux: the best for isomorphic apps

Вспомним Flux

5

Page 6: redux: the best for isomorphic apps

Проблема масштабирования MVC

30 апреля 2014, Сан-Франциско F8 Facebook Developer Conference

6

Page 7: redux: the best for isomorphic apps

30 апреля 2014, Сан-Франциско F8 Facebook Developer Conference

7

Page 8: redux: the best for isomorphic apps

Command-Query Responsibility Segregation

CQRS

8

Page 9: redux: the best for isomorphic apps

CQRSCommand-Query Responsibility Segregation

модельдля чтенияи записи

9

Page 10: redux: the best for isomorphic apps

CQRSCommand-Query Responsibility Segregation

модельдля чтенияи записи

модель для чтенияданных

10

Page 11: redux: the best for isomorphic apps

CQRSCommand-Query Responsibility Segregation

модель для чтенияданных

модельдля чтенияи записи

модель для записиданных

11

Page 12: redux: the best for isomorphic apps

30 апреля 2014, Сан-Франциско F8 Facebook Developer Conference

модель для чтения

12

Page 13: redux: the best for isomorphic apps

30 апреля 2014, Сан-Франциско F8 Facebook Developer Conference

модель для чтения

модель для записи

13

Page 14: redux: the best for isomorphic apps

Основные цели

1.Один источник правды

2.Избежать состояние гонки

3.Избежать каскадных обновлений

4.Воспроизводимость состояния

14

Page 15: redux: the best for isomorphic apps

Основные цели

Воспроизводимость состояния

15

Page 16: redux: the best for isomorphic apps

Основные цели

Воспроизводимость состояния

state Bstate A

16

Page 17: redux: the best for isomorphic apps

Основные цели

Воспроизводимость состояния

state Bstate A

state Bstate A

17

Page 18: redux: the best for isomorphic apps

Основные цели

Воспроизводимость состояния

error statestate A

error statestate A

Record / Replay

18

Page 19: redux: the best for isomorphic apps

2014 - клонировали, как могли

• 12 мая: Fluxxor • 1 июля: Reflux.js • 24 июля: официальный релиз от Facebook • 24 октября: Flummox • 2 ноября: Marty.js • 4 ноября: Yahoo выпускает Fluxible • 11 декабря: AirBnb выпускает alt

19

Page 20: redux: the best for isomorphic apps

Мир на пороге новых проблем: Flux

• Какие плюсы и минусы?

• Что выбрать из этого?

• Как с этим жить?

20

Page 21: redux: the best for isomorphic apps

Изоморфные приложения

21

Page 22: redux: the best for isomorphic apps

Организация изоморфных приложений

API

Browser-specific JS

Server-specific JS

Вашеприложение

22

Page 23: redux: the best for isomorphic apps

Организация изоморфных приложений

Browser-specific JS

Server-specific JS

Бизнес-логикаRoutes МоделиСхемы

Валидацияi18n

КонфигурацияКомпонентыСтилизация

и т.д

23

Page 24: redux: the best for isomorphic apps

Server-Side Rendering(SSR)

Генерация отображения на стороне сервера

24

Page 25: redux: the best for isomorphic apps

Взаимодействие

API сервер

Front-endсервер

25

Page 26: redux: the best for isomorphic apps

Взаимодействие

API сервер

Front-endсервер

Браузер

26

Page 27: redux: the best for isomorphic apps

Взаимодействие

API сервер

Front-endсервер

Браузер

27

Page 28: redux: the best for isomorphic apps

Взаимодействие

API сервер

Front-endсервер

Браузер

- HTML - критичный CSS

28

Page 29: redux: the best for isomorphic apps

Взаимодействие

API сервер

Front-endсервер

Браузер

- HTML - критичный CSS - JavaScript

29

Page 30: redux: the best for isomorphic apps

Взаимодействие

API сервер

Front-endсервер

Front-end клиент

- HTML - критичный CSS - JavaScript

30

Page 31: redux: the best for isomorphic apps

Выгоды• Время загрузки страницы сокращается в 5-6 раз

• Снижаются затраты на поддержку

• Быстрый старт новых проектов

• Положительный эффект для SEO

• Снижает риск проблем memory leak

• Write once, run anywhere (WORA)

31

Page 32: redux: the best for isomorphic apps

Промежуточный итог• Flux — архитектура для создания клиентских приложений

• Flux — больше шаблон, чем формальный фреймворк

• Flux создан сделать приложение более масштабируемым, предсказуемым, а отладку - простой

• Изоморфные приложения повышают UX и снижают затраты

32

Page 33: redux: the best for isomorphic apps

Так ли хорош Flux?

33

Page 34: redux: the best for isomorphic apps

Проблемы реализаций Flux

• Обилие boilerplate-кода

• Заточенность кода под API

• Логика сторов связана с их состоянием

34

Page 35: redux: the best for isomorphic apps

Пара примеров с alt.js

35

Page 36: redux: the best for isomorphic apps

Создание сторов

36

Page 37: redux: the best for isomorphic apps

Создание сторов

полезная часть

37

Page 38: redux: the best for isomorphic apps

Создание компонент

38

Page 39: redux: the best for isomorphic apps

Создание компонент

бесполезнаячасть

39

Page 40: redux: the best for isomorphic apps

Проблемы реализаций Flux

• Обилие boilerplate-кода

• Заточенность кода под API

• Логика сторов связана с их состоянием

• Сложно сделать record/replay состояний

40

Page 41: redux: the best for isomorphic apps

Проблемы реализаций Flux

• Обилие boilerplate-кода

• Заточенность кода под API

• Логика сторов связана с их состоянием

• Сложно сделать record/replay состояний

• Сложная для понимания роль диспетчера

41

Page 42: redux: the best for isomorphic apps

Проблемы диспетчера Flux

Store 2

Диспетчер

Component 3

Action 1

42

Page 43: redux: the best for isomorphic apps

Проблемы диспетчера Flux

Store 2

ДиспетчерAction 1

Component 3

Action 1

43

Page 44: redux: the best for isomorphic apps

Проблемы диспетчера Flux

Store 2

ДиспетчерAction 1

Component 3

Action 1

Uncaught Error: Invariant Violation: Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.

44

Page 45: redux: the best for isomorphic apps

Проблемы диспетчера Flux

https://github.com/facebook/flux/issues/4745

Page 46: redux: the best for isomorphic apps

Проблемы реализаций Flux

• Обилие boilerplate-кода

• Заточенность кода под API

• Логика сторов связана с их состоянием

• Сложно сделать record/replay состояний

• Сложная для понимания роль диспетчера

• Проблема повторного использования

46

Page 47: redux: the best for isomorphic apps

Проблемы Flux при Server-Side Rendering

• Сложно реализовать асинхронную загрузку данных

• Передача состояния сторов от сервера клиенту

• Flux изначально создавался для клиентской части: “Flux is the application architecture that Facebook uses for building client-side web applications.”~ https://facebook.github.io/flux/- OK

47

Page 48: redux: the best for isomorphic apps

Все эти проблемы решает redux

48

Page 49: redux: the best for isomorphic apps

Обновление архитектуры

49

Page 50: redux: the best for isomorphic apps

Сторы — не классыА функции описывающие мутации:

50

Page 51: redux: the best for isomorphic apps

Раз это функции…

51

Page 52: redux: the best for isomorphic apps

Сторы переименованы в reducers

52

Page 53: redux: the best for isomorphic apps

Где же теперь state?

53

Page 54: redux: the best for isomorphic apps

State хранится в Диспетчере

54

Page 55: redux: the best for isomorphic apps

Диспетчера больше нет

55

Page 56: redux: the best for isomorphic apps

Диспетчер переименован в Store

56

Page 57: redux: the best for isomorphic apps

Это всё?

57

Page 58: redux: the best for isomorphic apps

Нет

58

Page 59: redux: the best for isomorphic apps

Middleware

59

Page 60: redux: the best for isomorphic apps

Middleware• Точка расширения, куда передаётся action, прежде, чем

попасть в reducers

• Функция, принимающая action, следующий middleware и Store:

60

Page 61: redux: the best for isomorphic apps

MiddlewareЭтот middleware позволяет диспатчить в качестве action обычный Promise

61

Page 62: redux: the best for isomorphic apps

View Provider

62

Page 63: redux: the best for isomorphic apps

react-redux

• connect()

• <Provider />

63

Page 64: redux: the best for isomorphic apps

react-redux: connect()

• Подключает к компоненту Store

• Возвращает новый компонент, который содержит переданный компонент, как вложенный

• Ему в свойствах будут переданы подключенный Store и функция dispatch

64

Page 65: redux: the best for isomorphic apps

react-redux: connect()

65

Page 66: redux: the best for isomorphic apps

react-redux: <Provider />• Главный компонент

• Делает доступным вызов connect() для всех дочерних элементов

66

Page 67: redux: the best for isomorphic apps

Схема архитектура

67

Page 68: redux: the best for isomorphic apps

Подводим итоги• Нет boilerplate кода, за счёт того, что мутации описываются функциями

• Как следствие - нет зависимости от API, его по сути нет

• При таком подходе легко сделать record/replay

• Нет диспетчера - нет проблемы его понимания

• Легкое повторное использование reducers, пример:https://github.com/rackt/redux/blob/master/examples/real-world/reducers/paginate.js

• За счёт middleware легко организовать асинхронную загрузку данных для компонент:https://github.com/DenisIzmaylov/redux-catch-promise

68

Page 69: redux: the best for isomorphic apps

69

Page 70: redux: the best for isomorphic apps

Как начать?Подробнейшая документация

(ссылка в конце)

70

Page 71: redux: the best for isomorphic apps

Экосистема

Page 72: redux: the best for isomorphic apps

Redux DevTools• Live Edit • Time-Travel

72

Page 73: redux: the best for isomorphic apps

Redux Slider Monitor• Time-Travel черезслайдер

73

Page 74: redux: the best for isomorphic apps

Redux GenTest Plugin

74

Page 75: redux: the best for isomorphic apps

И ещё море всего

https://github.com/xgrommx/awesome-redux

75

Page 76: redux: the best for isomorphic apps

Метрики в GitHubRedux

Flux

76

Page 77: redux: the best for isomorphic apps

Импортозамещение

Из России с любовью:

Даня Абрамов

Санкт-Петербург

77

Page 78: redux: the best for isomorphic apps

Отзывы• “Love what you’re doing with Redux”

Jing Chen, creator of Flux

• “I asked for comments on Redux in FB's internal JS discussion group, and it was universally praised. Really awesome work.”Bill Fisher, creator of Flux

Facebook в восторге

78

Page 79: redux: the best for isomorphic apps

redux - очередной Flux?

Нет

79

Page 80: redux: the best for isomorphic apps

redux - the best for isomorphic apps?

Да

80

Page 81: redux: the best for isomorphic apps

Полезные ссылки

• http://elm-lang.org/

• http://staltz.com/unidirectional-user-interface-architectures.html

• http://martinfowler.com/bliki/CQRS.html

81

Page 82: redux: the best for isomorphic apps

Документация

http://rackt.github.io/redux/

82

Page 83: redux: the best for isomorphic apps

Вопросы?

Twitter: @DenisIzmaylov GitHub: https://github.com/DenisIzmaylov Facebook: http://fb.com/denis.izmaylov

83