WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

26
FRP + React, будуємо асинхронні інтерфейси Роман Якобчук

Transcript of WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

Page 1: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

FRP + React, будуємоасинхронні інтерфейси

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

Page 2: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

Що таке FRP“Functional reactive programming (FRP) is a programming paradigm for

reactive programming (asynchronous dataflow programming) using the

building blocks of functional programming (e.g.map, reduce, filter)"

Wikipedia

Серйозно?

“2

Page 3: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

Reactive programminghttp://www.reactivemanifesto.org/

b = c = 1

a = b + c # => 2

c = 4

a # ?

01.

02.

03.

04.

3

Page 4: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

Reactive programming

4

Page 5: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

Reactive programming• Imperative (Angular, Ember, Backbone)

• Functional (Bacon, Rx.js, Kefir)

• OOP # ?!

5

Page 6: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

Reactive programming• Imperative (Angular, Ember, Backbone)

• Functional (Bacon, Rx.js, Kefir)

• OOP # ?!

6

Page 7: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

Functional programming• Функція - об’єкт першого класу(first class citizen)

• Відсутність сайд-ефектів(використання чистих функцій)

• Іммутабельні данні

7

Page 8: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

Як виглядає FP кодvar topAds = tests

.map(...)

.reduce(...)

.filter(...)

.sort(...)

.slice(0,6)

01.

02.

03.

04.

05.

06.

8

Page 9: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

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

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

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

9

Page 10: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

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

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

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

10

Page 11: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

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

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

11

Page 12: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

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

• RxJS

• Kefir.js

• Scala.js

12

Page 13: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

Code Samplesvar targetText = Bacon

.fromEventTarget(document, 'mousemove')

.filter(targetContainsText)

.map(getTextFromEvent)

.skipDuplicates();

01.

02.

03.

04.

05.

13

Page 14: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

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

var responses = targetText

.flatMapLatest(postText);

responses.onValue(processResponse);

01.

02.

03.

14

Page 15: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

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

.asEventStream('click')

.map(processButtonClick);

var responses = targetText

.merge(buttonPresses)

.flatMapLatest(postText);

01.

02.

03.

04.

05.

06.

15

Page 16: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

Де результат?• Перетворили події в данні

• Налаштували потоки цих данних

• Що б не сталось, ми завжди маємо актуальний стан

• Як відобразити це в нашому UI?

16

Page 17: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

ReactProps State

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

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

app.”

Pete Hunt, Facebook

17

Page 18: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

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

• Сам плеєр

• Progress-bar

• Volume-bar

18

Page 19: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

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

• UI

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

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

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

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

19

Page 20: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

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.

20

Page 21: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

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

UI.player.setProps PLCollection: PLC

UI.progressbar.setProps currentTrack: ...

01.

02.

03.

21

Page 22: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

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

controls.plug(remoteActions)

01.

02.

22

Page 23: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

Це страшне слово "монада"monad

.map(...)

.reduce(...)

01.

02.

03.

23

Page 24: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

Підозріло схоже на масив?• Так, масив це теж монада

• Так, всі ці "потоки" це теж монади

• Так, саме тому ви можете уявити їх як простий масив, останній елемент

якого завжди зберігає актуальний стан

24

Page 25: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"
Page 26: WebCamp:Front-end Developers Day. Роман Якобчук "FRP + React, building async UIs"

Роман Якобчук• 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

26