21
Flux в стилі FRP: єднаємо React і Bacon Роман Якобчук

JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

Embed Size (px)

Citation preview

Page 1: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

Flux в стилі FRP: єднаємоReact і Bacon

Роман Якобчук

Page 2: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

React1. Модна, трендова технологія

2. Абстрагує від роботи з DOM

3. Неймовірно швидка

4. Легка в розумінні

5. Але це лише View

2

Page 3: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

Flux

View

Action Store

Dispatcher

3

Page 4: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

Що використаємо?MVC FRP

Популярно + -

Зручна робота з данними + -

Масштабуємо + +

Асинхронність - +

Автоматичне оновлення залежностей - +

4

Page 5: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

View

Action StoreMVC

DispatcherFRP

5

Page 6: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

Коли НЕ використовувати FRP• ви працюєте з данними що рідко змінюються

• в команді не нема кому підтримувати

• це явний оверхед

6

Page 7: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

Коли використовувати FRP• багато залежних станів

• є декілька джерел надходження сигналів

• є жорстка асинхронність

7

Page 8: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

Що треба пам'ятати про FRP• Все зберігається в стрімах

• Все іммутабельно

8

Page 9: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

Бібліотеки JS• Bacon.js

• RxJS

• Kefir.js

• Scala.js

9

Page 10: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

Code Samplesvar targetText = Bacon

.fromEventTarget(document, 'mousemove')

.filter(targetContainsText)

.map(getTextFromEvent)

.skipDuplicates();

01.

02.

03.

04.

05.

10

Page 11: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

АсинхронністьЧи відноситься остання відповідь до останнього запиту?

var responses = targetText

.flatMapLatest(postText);

responses.onValue(processResponse);

01.

02.

03.

11

Page 12: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

Додаємо джерело подійvar buttonPresses = buttons

.asEventStream('click')

.map(processButtonClick);

var responses = targetText

.merge(buttonPresses)

.flatMapLatest(postText);

01.

02.

03.

04.

05.

06.

12

Page 13: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

ReactProps State

поточний стан компонента

“Every time your data changes, it’s like hitting refresh in a server rendered

app.”

Pete Hunt, Facebook

13

Page 14: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

Data Flow• Проблеми старого плеєра

• Неаявний стан

• Вибір технології

14

Page 15: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

Архітектура БандуриView

• Сам плеєр

• Progress-bar

• Volume-bar

15

Page 16: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

Архітектура БандуриAction

• UI

• Внутрішні івенти(елементи логіки)

• Обогртка для розробників

• Дистанційне керуваня(веб-сокет)

• Пряме підключення до стрімів

16

Page 17: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

Dispatcher/StoredispatcherAPI =

collections : new Bacon.Bus()

...

#-------------

playlistsCollection = collections

.scan(new PLCollection(), (collection, ev) ->

collection[ev.action](ev.playlist)

...

01.

02.

03.

04.

05.

06.

07.

08.

17

Page 18: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

Оновлюємо ViewplaylistsCollection.onValue (PLC) ->

UI.player.setProps PLCollection: PLC

UI.progressbar.setProps currentTrack: ...

01.

02.

03.

18

Page 19: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

Додамо джерело сигналуremoteActions = Bacon.fromEventTarget ws , 'message', ...

controls.plug(remoteActions)

01.

02.

19

Page 20: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"
Page 21: JSLab. Роман Якобчук. "Flux в стиле FRP: связываем React и Bacon"

Роман Якобчук• http://roma.if.ua

• Skype: r.iakobchuk

• Email: [email protected]

Links

https://github.com/romabelka/jsLab

https://github.com/romabelka/bandura.js

http://www.reactivemanifesto.org

21