SlideShare une entreprise Scribd logo
1  sur  28
APLIKACJE INTERNETOWE REAL-TIME
W OPARCIU O REACT / REDUX
REPOZYTORIUM GIT
git clone https://github.com/GrandParade/react-redux-workshops.git
cd react-redux-workshops
npm install
lub: http://bit.do/workshop-repo
ECMASCRIPT 6 (AKA 2015)
VIRTUAL DOM
WEB COMPONENTS
REACT
REDUX
DZISIEJSZE TEMATY
MAŁE, PRZYJEMNE RZECZY
ECMASCRIPT 6 (AKA 2015)
1 for (let i = 0; i < 10; i++) {
2 console.log(i) // 0...9
3 }
4 console.log(i) // ReferenceError
5
6 const c = 'xyz'
7 const x = {
8 a: 10,
9 b: 10,
10 [c]: 15
11 }
12 // x = { a: 10, b: 10, xyz: 15 }
13
14
15 const { a, b } = x
16 // a = 10, b = 20
17
18
19 let pow = (a) => a * a
// format.js
1 export function money(m) {
2 return parseFloat(m).toFixed(2)
3 }
4
5 export default function format(str, type) {
6 if (type === 'money') {
7 return money(str)
8 } else {
9 return str
10 }
11 }
// index.js
1 import format from './format'
2 console.log(format(30.5, 'money'))
3
4
5 import { money } from './format'
6 console.log(money(30))
7
8
9 import { money as formatMoney } from './format'
10 console.log(formatMoney(14.444))
MODUŁY ES6
ECMASCRIPT 6 (AKA 2015)
1 class Terrain {
2 constructor(types = []) {
3 this.types = types;
4 }
5
6 get avoidable() {
7 return this.types.includes('avoidable')
8 }
9
10 set avoidable(status) {
11 let index = this.types.indexOf('avoidable')
12
13 if (status && index === -1) {
14 this.types.push(status)
15 } else if (!status && index !== -1) {
16 this.types.splice(index, 1)
17 }
18 }
19
20 static water() {
21 return new Terrain([ 'avoidable' ])
22 }
23 }
24
25 class Water extends Terrain {
26 constructor() {
27 super([ 'avoidable' ])
28 }
KLASY
ECMASCRIPT 6 (AKA 2015)
GENERATORY
PROXY
REST / SPREAD OPERATOR
DEKORATORY
ASYNC / AWAIT
OBSERVABLE
BIND OPERATOR (STAGE 0)
POZOSTAŁE NOWOŚCI
ECMASCRIPT 6 (AKA 2015)
- Oszczędza zasobożerne operacje
na DOM
- Drzewo elementów może być
renderowane bez przeglądarki
- React
- Mithril
- virtual-dom (np. w Mercury)
VIRTUAL DOM
http://calendar.perfplanet.com/2013/diff/
VIRTUAL DOM
- Natywnie
- Shadow DOM
- Importy HTML
- Własne elementy
- Podejścia
- Polymer
- React
- Angular 2
www.webcomponents.org
WEB COMPONENTS
WEB COMPONENTS
- Tylko WIDOK
- Szybko rozwijana technologia
- Reużywalność komponentów
KILKA SŁÓW O REACT
REACT
- Korzystamy z realnych danych
- Nie zajmujemy się stylami
- Zaczniemy od widoków
- Przeniesiemy dane jako stan aplikacji
REZULTAT WARSZTATÓW
APLIKACJA
- Jak stworzyć komponent
- Podstawy JSX
- DX Reacta
- Jak przekazać propsy do komponentu
PIERWSZY KOMPONENT
APLIKACJA (REACT) - KROK 1
- Jak stworzyć komponent dla każdego elementu tablicy
- Jak React optymalizuje tablice obiektów
LISTA ELEMENTÓW, PSEUDO-PĘTLE
APLIKACJA (REACT) - KROK 2
- Jak działa stan komponentu
- Jak podpiąć interwały, zaktualizować DOM
- Cykl życia komponentu
DYNAMICZNY KOMPONENT - ZEGAR
APLIKACJA (REACT) - KROK 3
- Użyjemy React dla SVG
- Pokażemy incydenty na osi czasu
SVG TIMELINE
APLIKACJA (REACT) - KROK 4
- Nasłuchiwanie na zdarzenia DOMu w React
INTERAKCJA Z UŻYTKOWNIKIEM
APLIKACJA (REACT) - KROK 5
- Jak używać dodatku React Perf
- Cykl życia komponentu
OPTYMALIZACJA KOMPONENTÓW
APLIKACJA (REACT) - KROK 6
- Wysyłamy wiadomość (zwyczajny łańcuch znaków) i wyświetlamy listę wiadomości
- Są przygotowane style dla chatu:
- .chat - główny blok chatu
- .chat__messages - lista wiadomości
- .chat__messages > li - wiadomość
- .chat__messages > li > strong - nazwa użytkownika
- .chat__form - formularz do wysyłania wiadomości, a w środku button i input
ZADANIE - CHAT
APLIKACJA (REDUX) - KROK 7
- Jedna z implementacji Flux
- Uni-directional flow
- Jeden stan dla całej aplikacji
REDUX
REDUX
- Jednokierunkowy przepływ danych zapewnia kolejność działań
- Przy takim samym stanie aplikacji zadziała ona tak samo
UNI-DIRECTIONAL FLOW
REDUX
Actions Reducers Store View
subscribe
dispatch
Any other
data sources
dispatch
- Definiują informację która jest potrzebna do wykonania danej akcji
- Jedyną obowiązkową informacją jest type nazwa akcji
- Action creators budują akcję na podstawie parametrów
AKCJE
REDUX
Actions Reducers Store View
subscribe
dispatch
{
type: 'new incident',
incident: {
playtime: 6000,
name: 'goal',
team: 'home'
}
}
- Wykonują akcję zmieniając stan całej aplikacji
- Po zmianie stanu dobrą praktyką jest stworzenie nowego obiektu ze stanem aplikacji
REDUKTORY (REDUCERS)
REDUX
Actions Reducers Store View
subscribe
dispatch
function (state, action) {
if (action.type === 'add incident') {
return {
...state,
incidents: state.incidents.concat(action.incident)
}
}
return state
}
- Centralny punkt danych
- Pozwala na redukcję danych, subskrypcję do zmian i wykonywanie akcji
STORE
REDUX
Actions Reducers Store View
subscribe
dispatch
store = createStore(function (action, state) {
console.log('Action', action.type, 'executed')
return state
}, {})
store.dispatch({ type: 'match received' })
- Stworzyliśmy store w którym przechowamy incydenty
- Ręcznie wykonamy akcję i zobaczymy jak działa Redux DevTools
TWORZENIE STORE’A
APLIKACJA (REDUX) - KROK 8
Actions Reducers Store View
subscribe
dispatch
- Napisaliśmy kreator akcji i reduktor związane z incydentami
- Ręcznie wykonujemy akcję i sprawdzamy stan aplikacji
ACTION CREATOR I REDUCER
APLIKACJA (REDUX) - KROK 9
Actions Reducers Store View
subscribe
dispatch
- Korzystając z react-redux połączymy nasze komponenty z Reduxem
- Połączymy się z serwerem z danymi za pomocą WebSocketów
- Wyświetlimy informacje o meczu
POŁĄCZENIE Z WIDOKIEM!
APLIKACJA (REDUX) - KROK 10
Actions Reducers Store View
subscribe
dispatch
- Wysyłamy anonimową wiadomość do użytkowników i wyświetlamy odebrane
- Przez WebSocket jest udostępniony event message, który dostarcza wiadomość, a
emitować nowe wiadomości można tym samym eventem. Wiadomość jest zwyczajnym
łańcuchem znaków.
ZADANIE - CHAT MIĘDZY UŻYTKOWNIKAMI
APLIKACJA (REDUX) - KROK 11
Actions Reducers Store View
subscribe
dispatch
WWW.GRANDPARADE.PL
Dawid Rusnak
github.com/rangoo94
Lista mailingowa:
http://bit.do/react-workshop

Contenu connexe

Tendances

Apache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użyciaApache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użycia
Wojciech Lichota
 

Tendances (20)

Websockety w PHP
Websockety w PHPWebsockety w PHP
Websockety w PHP
 
Platforma Kontentowa
Platforma KontentowaPlatforma Kontentowa
Platforma Kontentowa
 
Swoole w PHP. Czy to ma sens?
Swoole w PHP. Czy to ma sens?Swoole w PHP. Czy to ma sens?
Swoole w PHP. Czy to ma sens?
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHP
 
Testowanie rozwiązań serverless z LocalStack
Testowanie rozwiązań serverless z LocalStackTestowanie rozwiązań serverless z LocalStack
Testowanie rozwiązań serverless z LocalStack
 
Infrastructure As Code
Infrastructure As CodeInfrastructure As Code
Infrastructure As Code
 
Technologia Xamarin i wprowadzenie do Windows IoT core
Technologia Xamarin i wprowadzenie do Windows IoT coreTechnologia Xamarin i wprowadzenie do Windows IoT core
Technologia Xamarin i wprowadzenie do Windows IoT core
 
Kubernetes (Canary) Deployments
Kubernetes (Canary) DeploymentsKubernetes (Canary) Deployments
Kubernetes (Canary) Deployments
 
Ansible w praktyce
Ansible w praktyceAnsible w praktyce
Ansible w praktyce
 
Torquebox
TorqueboxTorquebox
Torquebox
 
Monitoring sieci
Monitoring sieciMonitoring sieci
Monitoring sieci
 
Ansible - Automatyzacja zadań IT
Ansible - Automatyzacja zadań ITAnsible - Automatyzacja zadań IT
Ansible - Automatyzacja zadań IT
 
Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)
 
AADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptAADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScript
 
Service workers - bądź online, nawet kiedy jesteś offline!
Service workers - bądź online, nawet kiedy jesteś offline!Service workers - bądź online, nawet kiedy jesteś offline!
Service workers - bądź online, nawet kiedy jesteś offline!
 
Laravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelnianiaLaravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelniania
 
Rundeck & Ansible
Rundeck & AnsibleRundeck & Ansible
Rundeck & Ansible
 
GlusterFS
GlusterFSGlusterFS
GlusterFS
 
Apache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użyciaApache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użycia
 
Angular 4 pragmatycznie
Angular 4 pragmatycznieAngular 4 pragmatycznie
Angular 4 pragmatycznie
 

Similaire à Aplikacje internetowe real-time w oparciu o React/Redux

Poland - Dev Days 2005
Poland - Dev Days 2005Poland - Dev Days 2005
Poland - Dev Days 2005
Tomasz Cieplak
 
Functional widgets in Rails
Functional widgets in RailsFunctional widgets in Rails
Functional widgets in Rails
Sebastian Sito
 
Extjs & netzke
Extjs & netzkeExtjs & netzke
Extjs & netzke
GaldoMedia
 
AngularJS szkolenie wewnętrzne (into)
AngularJS szkolenie wewnętrzne (into)AngularJS szkolenie wewnętrzne (into)
AngularJS szkolenie wewnętrzne (into)
Marcin Baran
 
Migracja I Integracja Bazy
Migracja I Integracja BazyMigracja I Integracja Bazy
Migracja I Integracja Bazy
Przemysław ...
 

Similaire à Aplikacje internetowe real-time w oparciu o React/Redux (20)

Programowanie aplikacji dla Windows 8 (WinRT)
Programowanie aplikacji dla Windows 8 (WinRT)Programowanie aplikacji dla Windows 8 (WinRT)
Programowanie aplikacji dla Windows 8 (WinRT)
 
ASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założeniaASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założenia
 
Introduction to ReactJS - Comparison to AngularJS 2 - Robert Piękoś (pl)
Introduction to ReactJS - Comparison to AngularJS 2 - Robert Piękoś (pl)Introduction to ReactJS - Comparison to AngularJS 2 - Robert Piękoś (pl)
Introduction to ReactJS - Comparison to AngularJS 2 - Robert Piękoś (pl)
 
Architektura ngrx w angular 2+
Architektura ngrx w angular 2+Architektura ngrx w angular 2+
Architektura ngrx w angular 2+
 
Joomla Day Poland 15 - Docker
Joomla Day Poland 15 - DockerJoomla Day Poland 15 - Docker
Joomla Day Poland 15 - Docker
 
AngularJS - podstawy
AngularJS - podstawyAngularJS - podstawy
AngularJS - podstawy
 
Dlaczego Twoja kolejna aplikacja powinna bazować na platformie Drupal?
Dlaczego Twoja kolejna aplikacja powinna bazować na platformie Drupal?Dlaczego Twoja kolejna aplikacja powinna bazować na platformie Drupal?
Dlaczego Twoja kolejna aplikacja powinna bazować na platformie Drupal?
 
Magento Meetup Wrocław 6. "Venia Storefront Concept", Piotr Makowski VIRTUA
Magento Meetup Wrocław 6. "Venia Storefront Concept", Piotr Makowski VIRTUAMagento Meetup Wrocław 6. "Venia Storefront Concept", Piotr Makowski VIRTUA
Magento Meetup Wrocław 6. "Venia Storefront Concept", Piotr Makowski VIRTUA
 
Patronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 WarsztatyPatronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 Warsztaty
 
Poland - Dev Days 2005
Poland - Dev Days 2005Poland - Dev Days 2005
Poland - Dev Days 2005
 
Pure MVC - Mediovski
Pure MVC - MediovskiPure MVC - Mediovski
Pure MVC - Mediovski
 
Functional widgets in Rails
Functional widgets in RailsFunctional widgets in Rails
Functional widgets in Rails
 
Google App Engine i Google Play Services w Twoich aplikacjach
Google App Engine i Google Play Services w Twoich aplikacjachGoogle App Engine i Google Play Services w Twoich aplikacjach
Google App Engine i Google Play Services w Twoich aplikacjach
 
Extjs & netzke
Extjs & netzkeExtjs & netzke
Extjs & netzke
 
AngularJS szkolenie wewnętrzne (into)
AngularJS szkolenie wewnętrzne (into)AngularJS szkolenie wewnętrzne (into)
AngularJS szkolenie wewnętrzne (into)
 
Wprowadzenie do React
Wprowadzenie do ReactWprowadzenie do React
Wprowadzenie do React
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
 
Asynchroniczne testy JavaScript aplikacji webowych
Asynchroniczne testy JavaScript aplikacji webowychAsynchroniczne testy JavaScript aplikacji webowych
Asynchroniczne testy JavaScript aplikacji webowych
 
Kickoff to Node.js
Kickoff to Node.jsKickoff to Node.js
Kickoff to Node.js
 
Migracja I Integracja Bazy
Migracja I Integracja BazyMigracja I Integracja Bazy
Migracja I Integracja Bazy
 

Aplikacje internetowe real-time w oparciu o React/Redux

  • 1. APLIKACJE INTERNETOWE REAL-TIME W OPARCIU O REACT / REDUX
  • 2. REPOZYTORIUM GIT git clone https://github.com/GrandParade/react-redux-workshops.git cd react-redux-workshops npm install lub: http://bit.do/workshop-repo
  • 3. ECMASCRIPT 6 (AKA 2015) VIRTUAL DOM WEB COMPONENTS REACT REDUX DZISIEJSZE TEMATY
  • 4. MAŁE, PRZYJEMNE RZECZY ECMASCRIPT 6 (AKA 2015) 1 for (let i = 0; i < 10; i++) { 2 console.log(i) // 0...9 3 } 4 console.log(i) // ReferenceError 5 6 const c = 'xyz' 7 const x = { 8 a: 10, 9 b: 10, 10 [c]: 15 11 } 12 // x = { a: 10, b: 10, xyz: 15 } 13 14 15 const { a, b } = x 16 // a = 10, b = 20 17 18 19 let pow = (a) => a * a
  • 5. // format.js 1 export function money(m) { 2 return parseFloat(m).toFixed(2) 3 } 4 5 export default function format(str, type) { 6 if (type === 'money') { 7 return money(str) 8 } else { 9 return str 10 } 11 } // index.js 1 import format from './format' 2 console.log(format(30.5, 'money')) 3 4 5 import { money } from './format' 6 console.log(money(30)) 7 8 9 import { money as formatMoney } from './format' 10 console.log(formatMoney(14.444)) MODUŁY ES6 ECMASCRIPT 6 (AKA 2015)
  • 6. 1 class Terrain { 2 constructor(types = []) { 3 this.types = types; 4 } 5 6 get avoidable() { 7 return this.types.includes('avoidable') 8 } 9 10 set avoidable(status) { 11 let index = this.types.indexOf('avoidable') 12 13 if (status && index === -1) { 14 this.types.push(status) 15 } else if (!status && index !== -1) { 16 this.types.splice(index, 1) 17 } 18 } 19 20 static water() { 21 return new Terrain([ 'avoidable' ]) 22 } 23 } 24 25 class Water extends Terrain { 26 constructor() { 27 super([ 'avoidable' ]) 28 } KLASY ECMASCRIPT 6 (AKA 2015)
  • 7. GENERATORY PROXY REST / SPREAD OPERATOR DEKORATORY ASYNC / AWAIT OBSERVABLE BIND OPERATOR (STAGE 0) POZOSTAŁE NOWOŚCI ECMASCRIPT 6 (AKA 2015)
  • 8. - Oszczędza zasobożerne operacje na DOM - Drzewo elementów może być renderowane bez przeglądarki - React - Mithril - virtual-dom (np. w Mercury) VIRTUAL DOM http://calendar.perfplanet.com/2013/diff/ VIRTUAL DOM
  • 9. - Natywnie - Shadow DOM - Importy HTML - Własne elementy - Podejścia - Polymer - React - Angular 2 www.webcomponents.org WEB COMPONENTS WEB COMPONENTS
  • 10. - Tylko WIDOK - Szybko rozwijana technologia - Reużywalność komponentów KILKA SŁÓW O REACT REACT
  • 11. - Korzystamy z realnych danych - Nie zajmujemy się stylami - Zaczniemy od widoków - Przeniesiemy dane jako stan aplikacji REZULTAT WARSZTATÓW APLIKACJA
  • 12. - Jak stworzyć komponent - Podstawy JSX - DX Reacta - Jak przekazać propsy do komponentu PIERWSZY KOMPONENT APLIKACJA (REACT) - KROK 1
  • 13. - Jak stworzyć komponent dla każdego elementu tablicy - Jak React optymalizuje tablice obiektów LISTA ELEMENTÓW, PSEUDO-PĘTLE APLIKACJA (REACT) - KROK 2
  • 14. - Jak działa stan komponentu - Jak podpiąć interwały, zaktualizować DOM - Cykl życia komponentu DYNAMICZNY KOMPONENT - ZEGAR APLIKACJA (REACT) - KROK 3
  • 15. - Użyjemy React dla SVG - Pokażemy incydenty na osi czasu SVG TIMELINE APLIKACJA (REACT) - KROK 4
  • 16. - Nasłuchiwanie na zdarzenia DOMu w React INTERAKCJA Z UŻYTKOWNIKIEM APLIKACJA (REACT) - KROK 5
  • 17. - Jak używać dodatku React Perf - Cykl życia komponentu OPTYMALIZACJA KOMPONENTÓW APLIKACJA (REACT) - KROK 6
  • 18. - Wysyłamy wiadomość (zwyczajny łańcuch znaków) i wyświetlamy listę wiadomości - Są przygotowane style dla chatu: - .chat - główny blok chatu - .chat__messages - lista wiadomości - .chat__messages > li - wiadomość - .chat__messages > li > strong - nazwa użytkownika - .chat__form - formularz do wysyłania wiadomości, a w środku button i input ZADANIE - CHAT APLIKACJA (REDUX) - KROK 7
  • 19. - Jedna z implementacji Flux - Uni-directional flow - Jeden stan dla całej aplikacji REDUX REDUX
  • 20. - Jednokierunkowy przepływ danych zapewnia kolejność działań - Przy takim samym stanie aplikacji zadziała ona tak samo UNI-DIRECTIONAL FLOW REDUX Actions Reducers Store View subscribe dispatch Any other data sources dispatch
  • 21. - Definiują informację która jest potrzebna do wykonania danej akcji - Jedyną obowiązkową informacją jest type nazwa akcji - Action creators budują akcję na podstawie parametrów AKCJE REDUX Actions Reducers Store View subscribe dispatch { type: 'new incident', incident: { playtime: 6000, name: 'goal', team: 'home' } }
  • 22. - Wykonują akcję zmieniając stan całej aplikacji - Po zmianie stanu dobrą praktyką jest stworzenie nowego obiektu ze stanem aplikacji REDUKTORY (REDUCERS) REDUX Actions Reducers Store View subscribe dispatch function (state, action) { if (action.type === 'add incident') { return { ...state, incidents: state.incidents.concat(action.incident) } } return state }
  • 23. - Centralny punkt danych - Pozwala na redukcję danych, subskrypcję do zmian i wykonywanie akcji STORE REDUX Actions Reducers Store View subscribe dispatch store = createStore(function (action, state) { console.log('Action', action.type, 'executed') return state }, {}) store.dispatch({ type: 'match received' })
  • 24. - Stworzyliśmy store w którym przechowamy incydenty - Ręcznie wykonamy akcję i zobaczymy jak działa Redux DevTools TWORZENIE STORE’A APLIKACJA (REDUX) - KROK 8 Actions Reducers Store View subscribe dispatch
  • 25. - Napisaliśmy kreator akcji i reduktor związane z incydentami - Ręcznie wykonujemy akcję i sprawdzamy stan aplikacji ACTION CREATOR I REDUCER APLIKACJA (REDUX) - KROK 9 Actions Reducers Store View subscribe dispatch
  • 26. - Korzystając z react-redux połączymy nasze komponenty z Reduxem - Połączymy się z serwerem z danymi za pomocą WebSocketów - Wyświetlimy informacje o meczu POŁĄCZENIE Z WIDOKIEM! APLIKACJA (REDUX) - KROK 10 Actions Reducers Store View subscribe dispatch
  • 27. - Wysyłamy anonimową wiadomość do użytkowników i wyświetlamy odebrane - Przez WebSocket jest udostępniony event message, który dostarcza wiadomość, a emitować nowe wiadomości można tym samym eventem. Wiadomość jest zwyczajnym łańcuchem znaków. ZADANIE - CHAT MIĘDZY UŻYTKOWNIKAMI APLIKACJA (REDUX) - KROK 11 Actions Reducers Store View subscribe dispatch