際際滷

際際滷Share a Scribd company logo
Rafa Filipek
Frontend & Platform Architect / Team Leader
Platforma Kontentowa
Jak chcemy wprowadzi hybrydowe aplikacje w 150 serwisach.
React, NodeJS i przyjaciele
Historia
Apetyt ronie
 Rewitalizacja 150 serwis坦w
 Szybko
 Wicej klik坦w, du甜szy czas wizyty
 Kr坦tszy development
 $$$
PLATFORMA
KONTENTOWA
Platforma Kontentowa
Platforma Kontentowa
stara wersja
nowa wersja
Platforma Kontentowa
Kilka fakt坦w
 10 tygodni
 dwie lokalizacje
 3 osoby od frontendu (2 x junior dev + ja)
 API tworzone od zera
 system do deploymentu in progress
Jak?
WP kobieta
NodeJS 6.xAPI
Backend
* w uproszczeniu
*
Elementy
f(s) = UI
f(s) = g(s1) + h(s2)  z(sx) = UI
f(s)
renderToString(
<Provider store={store}>
<RouterContext {...props} />
</Provider>
)
ReactDOM.render(
<Provider store={store}>
<Router routes={routes} history={browserHistory}
render={applyRouterMiddleware(useScroll())} />
</Provider>,
document.getElementById(id)
) client
server
classnames by Jed Watson
npm.im/classnames

CSS
CSS
import styes from './Teaser.css'
import cx from 'classnames'
const Teaser = ({ title, img, important, visited }) => (
<div className={cx(
{
[styles.visited]: visited,
[styles.hot]: important
},
styles.wrap
)}>
{ /* ... */}
</div>
)
<div
class="_3W-1w _37ZLm _2Anks"
style="background-color:#000;"
data-reactid=186"
>
stuff
</div>
import { createStore } from 'redux'
const counter = (state = 0, action) => {
if (action.type === 'INCREMENT') return state + 1
if (action.type === 'DECREMENT') return state - 1
return state
}
const store = createStore(counter)
store.dispatch({ type: 'INCREMENT' })
store.dispatch({ type: 'DECREMENT' })
state: {
teasers: { lists }
content: { items }
comments: {
comments, userComments, lists, replies,
votes, top, reports, scroll, counters,
info, settings
}
reactions: { votes, items, fb, instagram, twitter shoplov }
adv: { ima, rc }
ui: { menuVisible, headerFixed }
}
Platforma Kontentowa
// okeyish
export default connect((state) => {
return { a: state.foo.a, b: state.bar.b }
})(View)
// good
const selector = createSelector(
(state) => state.foo.a,
(state) => state.bar.b,
(a, b) => {
return { a, b }
}
)
export default connect(selector)(View)
npm.im/reselect
reselect by ReactJS
Dane i API
import { actions } from 'pkf-teasers'
import { trigger } from 'redial'
import { provideHooks } from 'redial'
/* ... */
export const hooks = {
fetch: ({ dispatch }) => (
Promise.all([
dispatch(actions.fetch('dla-ciebie')),
dispatch(actions.fetchSections())
])
),
defer: ({ dispatch }) => {
Promise.all([
dispatch(actions.fetch('dla-ciebie')),
dispatch(actions.fetchSections())
dispatch(actions.fetch('najnowsze')),
dispatch(actions.fetch('popularne', { count: 20 })),
])
}
}
/* ... */
const App = provideHooks(hooks)(View)
trigger('fetch', App).then(() => renderToString(<App />))
npm.im/redial
redial by Mark Dalgleish
Pakiety
 pkf-kobieta
 pkf-app
 pkf-comments
 pkf-commons
 pkf-content
 pkf-social-reactions
 pkf-teasers
Pakiety
"pkf-app":  pkf-app ,
"pkf-comments": " pkf-comments ,
"pkf-commons": " pkf-commons ,
"pkf-content": " pkf-content ,
"pkf-social-reactions": " pkf-social-reactions ,
"pkf-teasers": " pkf-teaser ,
pkf-kobieta
 config.js
 client.js
 server.js
 pliki statyczne
import './styles.css'
import './config.js'
import { runClient } from 'pkf-app/lib/run-client.js'
import './config-analytics.js'
if (process.env.NODE_ENV !== 'production') {
const Perf = window.Perf = require('react-addons-perf')
Perf.start()
}
runClient()
import './styles.css'
import { runServer } from 'pkf-app/lib/run-server.js'
import { setConfig } from 'pkf-app/lib/config.js'
import { configs } from './config.js'
setConfig(configs)
runServer(process.env['APP_SERVER_PORT'] || 3000)
Biblioteki
Biblioteki
Hammer.js i WPJSLib
npm.im/hammerjs
hammerjs by Alexander Schmitz
Biblioteki
export class Video extends React.Component {
// ...
componentDidMount() {
this.player = WP.player({ url: this.props.url, target: this.el })
window.wp_player_osadzony = 1 // Przepraszamy internet za nazw
}
shouldComponentUpdate() { return false }
componentWillUnmount() {
if (this.player) {
this.player.destroy()
this.player = null
window.wp_player_osadzony = 0 // Jeszcze raz sorry
}
}
render() {
return <div ref={(ref) => { this.el = ref }} id={this.getId()}></div>
}
}
SEO
Dostpno
 Statycznie renderowany html
 Dodatkowe czci serwisu renderowane po stronie
serwera tylko dla bot坦w
 Stron mo甜na przeglda bez JS
SEO
og:image
twitter:image
article:published_time
al:ios:url
og:url
og:type
og:title
og:description
twitter:url
canonical
twitter:card
SEO
<Helmet
title="My Title"
meta={[
{"name": "description", "content": "Helmet application"},
{"property": "og:type", "content": "article"}
]}
link={[
{"rel": "canonical", "href": "http://mysite.com/example"}
]}
script={[
{"src": "http://include.com/pathtojs.js", "type": "text/javascript"},
{"type": "application/ld+json", innerHTML: `{ "@context": "http://schema.org" }`}
]}
onChangeClientState={(newState) => console.log(newState)}
/>
npm.im/react-helmet
react-helmet
Responsywno
 ~80% komponent坦w jest wsp坦dzielona przez desktop i mobile
 100% logiki w innych warstwach jest wsp坦dzielone
Statystyki
reklamy
analyticsEventDispatcher({
action: 'page:view',
dot: /* ... */,
gfk: /* ... */,
gemius: /* ... */
})
advertisementEventDispatcher({
action: 'bunch:load',
dot: {
bunch: 'index'
}
})
Na co uwa甜a
 Trzeba powici czas na budow rodowiska
developerskiego
 HTML + CSS != React + css
 warstwa danych (kontrola)
 mietnik w widoku
Co si zmienio
 Jako
 Czas developmentu
 Obszary zainteresowania programist坦w frontend /
backend
 Zbli甜enie do aplikacji mobilnych
 Morale :)
Dalszy rozw坦j
 nowe funkcjonalnoci
 zmiana podejcia do CSS
 optymalizacje
 service workers
禽噛庄一庄

More Related Content

What's hot (20)

Podstawy AngularJS
Podstawy AngularJSPodstawy AngularJS
Podstawy AngularJS
Sages
Webpack - Czym jest webpack i dlaczego chcesz go u甜ywa? - wersja kr坦tka
Webpack - Czym jest webpack i dlaczego chcesz go u甜ywa? - wersja kr坦tkaWebpack - Czym jest webpack i dlaczego chcesz go u甜ywa? - wersja kr坦tka
Webpack - Czym jest webpack i dlaczego chcesz go u甜ywa? - wersja kr坦tka
Marcin Gajda
Automatyzacja utrzymania jakoci w rodowisku PHP
Automatyzacja utrzymania jakoci w rodowisku PHPAutomatyzacja utrzymania jakoci w rodowisku PHP
Automatyzacja utrzymania jakoci w rodowisku PHP
Laravel Poland MeetUp
[BDD] Introduction to Behat (PL)
[BDD] Introduction to Behat (PL)[BDD] Introduction to Behat (PL)
[BDD] Introduction to Behat (PL)
Piotr Pelczar
NSOperation(Queue)
NSOperation(Queue) NSOperation(Queue)
NSOperation(Queue)
Krzysztof Profic
Jak zosta mobile deweloperem w 1 dzie
Jak zosta mobile deweloperem w 1 dzieJak zosta mobile deweloperem w 1 dzie
Jak zosta mobile deweloperem w 1 dzie
Pawe Kondraciuk
PHP-PM. Hit czy kit?
PHP-PM. Hit czy kit?PHP-PM. Hit czy kit?
PHP-PM. Hit czy kit?
The Software House
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
Jacek Okrojek
Infrastructure As Code
Infrastructure As CodeInfrastructure As Code
Infrastructure As Code
Kamil Grabowski
Dziesi serwer坦w poprosz!, czyli co mo甜e Ci zaoferowa definiowanie infra...
Dziesi serwer坦w poprosz!, czyli co mo甜e Ci zaoferowa definiowanie infra...Dziesi serwer坦w poprosz!, czyli co mo甜e Ci zaoferowa definiowanie infra...
Dziesi serwer坦w poprosz!, czyli co mo甜e Ci zaoferowa definiowanie infra...
The Software House
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
Sages
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?
The Software House
Deployment kodu z Capistrano
Deployment kodu z CapistranoDeployment kodu z Capistrano
Deployment kodu z Capistrano
Micha Szajbe
AngularJS - podstawy
AngularJS - podstawyAngularJS - podstawy
AngularJS - podstawy
Apptension
Testowanie rozwiza serverless z LocalStack
Testowanie rozwiza serverless z LocalStackTestowanie rozwiza serverless z LocalStack
Testowanie rozwiza serverless z LocalStack
The Software House
Jak dziaa CPython
Jak dziaa CPythonJak dziaa CPython
Jak dziaa CPython
Wojciech Lichota
Xdebug debugowanie i profilowanie aplikacji PHP
Xdebug  debugowanie i profilowanie aplikacji PHPXdebug  debugowanie i profilowanie aplikacji PHP
Xdebug debugowanie i profilowanie aplikacji PHP
3camp
Angular 4 pragmatycznie
Angular 4 pragmatycznieAngular 4 pragmatycznie
Angular 4 pragmatycznie
Sages
Ansible w praktyce
Ansible w praktyceAnsible w praktyce
Ansible w praktyce
Kamil Grabowski
Jakub Mrowiec (Grand Parade Poland) - Monumentum Case Study
Jakub Mrowiec (Grand Parade Poland) - Monumentum Case StudyJakub Mrowiec (Grand Parade Poland) - Monumentum Case Study
Jakub Mrowiec (Grand Parade Poland) - Monumentum Case Study
Business Link Krakow
Podstawy AngularJS
Podstawy AngularJSPodstawy AngularJS
Podstawy AngularJS
Sages
Webpack - Czym jest webpack i dlaczego chcesz go u甜ywa? - wersja kr坦tka
Webpack - Czym jest webpack i dlaczego chcesz go u甜ywa? - wersja kr坦tkaWebpack - Czym jest webpack i dlaczego chcesz go u甜ywa? - wersja kr坦tka
Webpack - Czym jest webpack i dlaczego chcesz go u甜ywa? - wersja kr坦tka
Marcin Gajda
Automatyzacja utrzymania jakoci w rodowisku PHP
Automatyzacja utrzymania jakoci w rodowisku PHPAutomatyzacja utrzymania jakoci w rodowisku PHP
Automatyzacja utrzymania jakoci w rodowisku PHP
Laravel Poland MeetUp
[BDD] Introduction to Behat (PL)
[BDD] Introduction to Behat (PL)[BDD] Introduction to Behat (PL)
[BDD] Introduction to Behat (PL)
Piotr Pelczar
Jak zosta mobile deweloperem w 1 dzie
Jak zosta mobile deweloperem w 1 dzieJak zosta mobile deweloperem w 1 dzie
Jak zosta mobile deweloperem w 1 dzie
Pawe Kondraciuk
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
Jacek Okrojek
Infrastructure As Code
Infrastructure As CodeInfrastructure As Code
Infrastructure As Code
Kamil Grabowski
Dziesi serwer坦w poprosz!, czyli co mo甜e Ci zaoferowa definiowanie infra...
Dziesi serwer坦w poprosz!, czyli co mo甜e Ci zaoferowa definiowanie infra...Dziesi serwer坦w poprosz!, czyli co mo甜e Ci zaoferowa definiowanie infra...
Dziesi serwer坦w poprosz!, czyli co mo甜e Ci zaoferowa definiowanie infra...
The Software House
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
Sages
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?
The Software House
Deployment kodu z Capistrano
Deployment kodu z CapistranoDeployment kodu z Capistrano
Deployment kodu z Capistrano
Micha Szajbe
AngularJS - podstawy
AngularJS - podstawyAngularJS - podstawy
AngularJS - podstawy
Apptension
Testowanie rozwiza serverless z LocalStack
Testowanie rozwiza serverless z LocalStackTestowanie rozwiza serverless z LocalStack
Testowanie rozwiza serverless z LocalStack
The Software House
Xdebug debugowanie i profilowanie aplikacji PHP
Xdebug  debugowanie i profilowanie aplikacji PHPXdebug  debugowanie i profilowanie aplikacji PHP
Xdebug debugowanie i profilowanie aplikacji PHP
3camp
Angular 4 pragmatycznie
Angular 4 pragmatycznieAngular 4 pragmatycznie
Angular 4 pragmatycznie
Sages
Jakub Mrowiec (Grand Parade Poland) - Monumentum Case Study
Jakub Mrowiec (Grand Parade Poland) - Monumentum Case StudyJakub Mrowiec (Grand Parade Poland) - Monumentum Case Study
Jakub Mrowiec (Grand Parade Poland) - Monumentum Case Study
Business Link Krakow

Similar to Platforma Kontentowa (20)

Android i REST
Android i RESTAndroid i REST
Android i REST
Roman Wo添niak
JavaScript, Moduy
JavaScript, ModuyJavaScript, Moduy
JavaScript, Moduy
Mariusz Nowak
Magento Meetup Wrocaw 6. "Venia Storefront Concept", Piotr Makowski VIRTUA
Magento Meetup Wrocaw 6. "Venia Storefront Concept", Piotr Makowski VIRTUAMagento Meetup Wrocaw 6. "Venia Storefront Concept", Piotr Makowski VIRTUA
Magento Meetup Wrocaw 6. "Venia Storefront Concept", Piotr Makowski VIRTUA
Magento Meetup Wrocaw
SphinxSearch
SphinxSearchSphinxSearch
SphinxSearch
Przemyslaw Wroblewski
Prostota i mozliwosci symfony2
Prostota i mozliwosci symfony2Prostota i mozliwosci symfony2
Prostota i mozliwosci symfony2
Natalia Stanko
Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]
Droptica
PLNOG 22 - Krzysztof Zaski - Praktyczne zastosowanie narzdzi NetDevOps
PLNOG 22 - Krzysztof Zaski - Praktyczne zastosowanie narzdzi NetDevOpsPLNOG 22 - Krzysztof Zaski - Praktyczne zastosowanie narzdzi NetDevOps
PLNOG 22 - Krzysztof Zaski - Praktyczne zastosowanie narzdzi NetDevOps
PROIDEA
university day 1
university day 1university day 1
university day 1
Sawomir Borowiec
PLNOG22 - Piotr Stolarek - Bezpieczestwo u甜ytkowania platform usugowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczestwo u甜ytkowania platform usugowych Tel...PLNOG22 - Piotr Stolarek - Bezpieczestwo u甜ytkowania platform usugowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczestwo u甜ytkowania platform usugowych Tel...
PROIDEA
ASP.NET MVC - najwa甜niejsze zao甜enia
ASP.NET MVC - najwa甜niejsze zao甜eniaASP.NET MVC - najwa甜niejsze zao甜enia
ASP.NET MVC - najwa甜niejsze zao甜enia
Bartlomiej Zass
Mongodb with Rails
Mongodb with RailsMongodb with Rails
Mongodb with Rails
Sebastian Nowak
Daj si wyrczy - Joomla Day Polska 2014
Daj si wyrczy - Joomla Day Polska 2014Daj si wyrczy - Joomla Day Polska 2014
Daj si wyrczy - Joomla Day Polska 2014
Tomasz Dziuda
4Developers 2015: Orleans - aplikacje, kt坦re skaluj i dystrybuuj si same -...
4Developers 2015: Orleans - aplikacje, kt坦re skaluj i dystrybuuj si same -...4Developers 2015: Orleans - aplikacje, kt坦re skaluj i dystrybuuj si same -...
4Developers 2015: Orleans - aplikacje, kt坦re skaluj i dystrybuuj si same -...
PROIDEA
Reactive programming
Reactive programmingReactive programming
Reactive programming
Sunscrapers
tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?
Brainhub
Service workers - bd添 online, nawet kiedy jeste offline!
Service workers - bd添 online, nawet kiedy jeste offline!Service workers - bd添 online, nawet kiedy jeste offline!
Service workers - bd添 online, nawet kiedy jeste offline!
The Software House
rodowisko testowe pod REST-a
rodowisko testowe pod REST-arodowisko testowe pod REST-a
rodowisko testowe pod REST-a
Future Processing
REST API - teoria i praktyka - WordUp Tr坦jmiasto
REST API - teoria i praktyka - WordUp Tr坦jmiastoREST API - teoria i praktyka - WordUp Tr坦jmiasto
REST API - teoria i praktyka - WordUp Tr坦jmiasto
Tomasz Dziuda
OSGi, deklaratywnie
OSGi, deklaratywnieOSGi, deklaratywnie
OSGi, deklaratywnie
Code-House
Micha Dec - Quality in Clouds
Micha Dec - Quality in CloudsMicha Dec - Quality in Clouds
Micha Dec - Quality in Clouds
kraqa
JavaScript, Moduy
JavaScript, ModuyJavaScript, Moduy
JavaScript, Moduy
Mariusz Nowak
Magento Meetup Wrocaw 6. "Venia Storefront Concept", Piotr Makowski VIRTUA
Magento Meetup Wrocaw 6. "Venia Storefront Concept", Piotr Makowski VIRTUAMagento Meetup Wrocaw 6. "Venia Storefront Concept", Piotr Makowski VIRTUA
Magento Meetup Wrocaw 6. "Venia Storefront Concept", Piotr Makowski VIRTUA
Magento Meetup Wrocaw
Prostota i mozliwosci symfony2
Prostota i mozliwosci symfony2Prostota i mozliwosci symfony2
Prostota i mozliwosci symfony2
Natalia Stanko
Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]
Droptica
PLNOG 22 - Krzysztof Zaski - Praktyczne zastosowanie narzdzi NetDevOps
PLNOG 22 - Krzysztof Zaski - Praktyczne zastosowanie narzdzi NetDevOpsPLNOG 22 - Krzysztof Zaski - Praktyczne zastosowanie narzdzi NetDevOps
PLNOG 22 - Krzysztof Zaski - Praktyczne zastosowanie narzdzi NetDevOps
PROIDEA
PLNOG22 - Piotr Stolarek - Bezpieczestwo u甜ytkowania platform usugowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczestwo u甜ytkowania platform usugowych Tel...PLNOG22 - Piotr Stolarek - Bezpieczestwo u甜ytkowania platform usugowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczestwo u甜ytkowania platform usugowych Tel...
PROIDEA
ASP.NET MVC - najwa甜niejsze zao甜enia
ASP.NET MVC - najwa甜niejsze zao甜eniaASP.NET MVC - najwa甜niejsze zao甜enia
ASP.NET MVC - najwa甜niejsze zao甜enia
Bartlomiej Zass
Daj si wyrczy - Joomla Day Polska 2014
Daj si wyrczy - Joomla Day Polska 2014Daj si wyrczy - Joomla Day Polska 2014
Daj si wyrczy - Joomla Day Polska 2014
Tomasz Dziuda
4Developers 2015: Orleans - aplikacje, kt坦re skaluj i dystrybuuj si same -...
4Developers 2015: Orleans - aplikacje, kt坦re skaluj i dystrybuuj si same -...4Developers 2015: Orleans - aplikacje, kt坦re skaluj i dystrybuuj si same -...
4Developers 2015: Orleans - aplikacje, kt坦re skaluj i dystrybuuj si same -...
PROIDEA
Reactive programming
Reactive programmingReactive programming
Reactive programming
Sunscrapers
tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?
Brainhub
Service workers - bd添 online, nawet kiedy jeste offline!
Service workers - bd添 online, nawet kiedy jeste offline!Service workers - bd添 online, nawet kiedy jeste offline!
Service workers - bd添 online, nawet kiedy jeste offline!
The Software House
rodowisko testowe pod REST-a
rodowisko testowe pod REST-arodowisko testowe pod REST-a
rodowisko testowe pod REST-a
Future Processing
REST API - teoria i praktyka - WordUp Tr坦jmiasto
REST API - teoria i praktyka - WordUp Tr坦jmiastoREST API - teoria i praktyka - WordUp Tr坦jmiasto
REST API - teoria i praktyka - WordUp Tr坦jmiasto
Tomasz Dziuda
OSGi, deklaratywnie
OSGi, deklaratywnieOSGi, deklaratywnie
OSGi, deklaratywnie
Code-House
Micha Dec - Quality in Clouds
Micha Dec - Quality in CloudsMicha Dec - Quality in Clouds
Micha Dec - Quality in Clouds
kraqa

Platforma Kontentowa

  • 1. Rafa Filipek Frontend & Platform Architect / Team Leader
  • 2. Platforma Kontentowa Jak chcemy wprowadzi hybrydowe aplikacje w 150 serwisach. React, NodeJS i przyjaciele
  • 4. Apetyt ronie Rewitalizacja 150 serwis坦w Szybko Wicej klik坦w, du甜szy czas wizyty Kr坦tszy development $$$
  • 10. Kilka fakt坦w 10 tygodni dwie lokalizacje 3 osoby od frontendu (2 x junior dev + ja) API tworzone od zera system do deploymentu in progress
  • 13. f(s) = UI f(s) = g(s1) + h(s2) z(sx) = UI
  • 14. f(s)
  • 15. renderToString( <Provider store={store}> <RouterContext {...props} /> </Provider> ) ReactDOM.render( <Provider store={store}> <Router routes={routes} history={browserHistory} render={applyRouterMiddleware(useScroll())} /> </Provider>, document.getElementById(id) ) client server
  • 16. classnames by Jed Watson npm.im/classnames CSS
  • 17. CSS import styes from './Teaser.css' import cx from 'classnames' const Teaser = ({ title, img, important, visited }) => ( <div className={cx( { [styles.visited]: visited, [styles.hot]: important }, styles.wrap )}> { /* ... */} </div> ) <div class="_3W-1w _37ZLm _2Anks" style="background-color:#000;" data-reactid=186" > stuff </div>
  • 18. import { createStore } from 'redux' const counter = (state = 0, action) => { if (action.type === 'INCREMENT') return state + 1 if (action.type === 'DECREMENT') return state - 1 return state } const store = createStore(counter) store.dispatch({ type: 'INCREMENT' }) store.dispatch({ type: 'DECREMENT' })
  • 19. state: { teasers: { lists } content: { items } comments: { comments, userComments, lists, replies, votes, top, reports, scroll, counters, info, settings } reactions: { votes, items, fb, instagram, twitter shoplov } adv: { ima, rc } ui: { menuVisible, headerFixed } }
  • 21. // okeyish export default connect((state) => { return { a: state.foo.a, b: state.bar.b } })(View) // good const selector = createSelector( (state) => state.foo.a, (state) => state.bar.b, (a, b) => { return { a, b } } ) export default connect(selector)(View) npm.im/reselect reselect by ReactJS
  • 22. Dane i API import { actions } from 'pkf-teasers' import { trigger } from 'redial' import { provideHooks } from 'redial' /* ... */ export const hooks = { fetch: ({ dispatch }) => ( Promise.all([ dispatch(actions.fetch('dla-ciebie')), dispatch(actions.fetchSections()) ]) ), defer: ({ dispatch }) => { Promise.all([ dispatch(actions.fetch('dla-ciebie')), dispatch(actions.fetchSections()) dispatch(actions.fetch('najnowsze')), dispatch(actions.fetch('popularne', { count: 20 })), ]) } } /* ... */ const App = provideHooks(hooks)(View) trigger('fetch', App).then(() => renderToString(<App />)) npm.im/redial redial by Mark Dalgleish
  • 24. pkf-kobieta pkf-app pkf-comments pkf-commons pkf-content pkf-social-reactions pkf-teasers Pakiety "pkf-app": pkf-app , "pkf-comments": " pkf-comments , "pkf-commons": " pkf-commons , "pkf-content": " pkf-content , "pkf-social-reactions": " pkf-social-reactions , "pkf-teasers": " pkf-teaser ,
  • 25. pkf-kobieta config.js client.js server.js pliki statyczne import './styles.css' import './config.js' import { runClient } from 'pkf-app/lib/run-client.js' import './config-analytics.js' if (process.env.NODE_ENV !== 'production') { const Perf = window.Perf = require('react-addons-perf') Perf.start() } runClient() import './styles.css' import { runServer } from 'pkf-app/lib/run-server.js' import { setConfig } from 'pkf-app/lib/config.js' import { configs } from './config.js' setConfig(configs) runServer(process.env['APP_SERVER_PORT'] || 3000)
  • 28. Biblioteki export class Video extends React.Component { // ... componentDidMount() { this.player = WP.player({ url: this.props.url, target: this.el }) window.wp_player_osadzony = 1 // Przepraszamy internet za nazw } shouldComponentUpdate() { return false } componentWillUnmount() { if (this.player) { this.player.destroy() this.player = null window.wp_player_osadzony = 0 // Jeszcze raz sorry } } render() { return <div ref={(ref) => { this.el = ref }} id={this.getId()}></div> } }
  • 29. SEO Dostpno Statycznie renderowany html Dodatkowe czci serwisu renderowane po stronie serwera tylko dla bot坦w Stron mo甜na przeglda bez JS
  • 31. SEO <Helmet title="My Title" meta={[ {"name": "description", "content": "Helmet application"}, {"property": "og:type", "content": "article"} ]} link={[ {"rel": "canonical", "href": "http://mysite.com/example"} ]} script={[ {"src": "http://include.com/pathtojs.js", "type": "text/javascript"}, {"type": "application/ld+json", innerHTML: `{ "@context": "http://schema.org" }`} ]} onChangeClientState={(newState) => console.log(newState)} /> npm.im/react-helmet react-helmet
  • 32. Responsywno ~80% komponent坦w jest wsp坦dzielona przez desktop i mobile 100% logiki w innych warstwach jest wsp坦dzielone
  • 33. Statystyki reklamy analyticsEventDispatcher({ action: 'page:view', dot: /* ... */, gfk: /* ... */, gemius: /* ... */ }) advertisementEventDispatcher({ action: 'bunch:load', dot: { bunch: 'index' } })
  • 34. Na co uwa甜a Trzeba powici czas na budow rodowiska developerskiego HTML + CSS != React + css warstwa danych (kontrola) mietnik w widoku
  • 35. Co si zmienio Jako Czas developmentu Obszary zainteresowania programist坦w frontend / backend Zbli甜enie do aplikacji mobilnych Morale :)
  • 36. Dalszy rozw坦j nowe funkcjonalnoci zmiana podejcia do CSS optymalizacje service workers

Editor's Notes

  • #4: 2015 React 100% client side Tv, Radio, Quizy Pierwsza strona portalowa, kt坦ra nie jest jedynie miejscem przekliku do innych serwis坦w.
  • #13: Webpack
  • #15: Fakt u甜ycia Reacta nie zwalnia z koniecznoci mylenia o zo甜onoci aplikacji oraz o cigej optymalizacji budowy i ukadu komponent坦w.