30
Борис Могила RIA.com Isomorphic React apps in production

Борис Могила "Isomorphic React apps in production"

  • Upload
    fwdays

  • View
    848

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Борис Могила "Isomorphic React apps in production"

Борис Могила

RIA.com

Isomorphic React apps in production

Page 2: Борис Могила "Isomorphic React apps in production"

100%

ізоморфний код

2

Page 3: Борис Могила "Isomorphic React apps in production"

Клієнт

Сервер

Спільний кодСервер

для роботи

з даними

80% ізоморфного коду!3

Page 4: Борис Могила "Isomorphic React apps in production"

● Webpack - білдер скриптів

Стек технологій:

● Redux - модель роботи з даними

● React-router - універсальний роутінг

● React - логіка виводу даних

● React-helmet - робота з SEO

4

Page 5: Борис Могила "Isomorphic React apps in production"

Запит

Ініціалізація

store

Роутінг

(отримання

компонента)

Відпрацювання

всіх подій

(отримання даних)

Рендерінг

компонента

Відповідь

Логіка на сервері

5

Page 6: Борис Могила "Isomorphic React apps in production"

Ініціалізація

store

Роутінг

(отримання

компонента)

Підключення

віртуального

дому до HTML

Натиснення на

посилання

Логіка в браузері

зміна HTML

6

Page 7: Борис Могила "Isomorphic React apps in production"

7

Page 8: Борис Могила "Isomorphic React apps in production"

● синхронізація state та history API

Ініціалізація store

● метод конфігурації store реалізуємо з

можливістю передачі:

○ даних для ініціалізації стану

○ history API

○ middlewares

● передача state на клієнт

8

Page 9: Борис Могила "Isomorphic React apps in production"

9

Page 10: Борис Могила "Isomorphic React apps in production"

Роутінг

● для отримання компонента використовуємо

метод match, як на клієнті, так і на сервері

● реалізація перенаправлень (redirect-ів) на рівні

отримання даних з сервера

● react-router не працює з регулярними виразами

10

Page 11: Борис Могила "Isomorphic React apps in production"

● отримання компонента на клієнті:

match({routes, history}, (error, redirectLocation, renderProps) => {

render(

<Provider store={store}>

<Router {...renderProps}/>

</Provider>

, document.getElementById('content')

);

});

11

Page 12: Борис Могила "Isomorphic React apps in production"

● ліниве завантаження (lazy-loading) реалізовуємо

на рівні роутінга

● require.ensure не працює на сервері

12

Page 13: Борис Могила "Isomorphic React apps in production"

● ліниве завантаження (lazy-

loading):

const getMyComponent = (nextState, callback) =>

require.ensure(

[], (require) => {

callback(null,require("./MyComponent").default)

}

)

export default (

<Route path="/" component={Layout}>

<IndexRoute getComponent={getMyComponent}/>

</Route>

) 13

Page 14: Борис Могила "Isomorphic React apps in production"

14

Page 15: Борис Могила "Isomorphic React apps in production"

export default (seo) => (

<Helmet

title={seo.title}

meta={[

{"name": "description", "content": seo.text}

]}

/>

)

React не пристосований для роботи з тегом

head, тому доведеться використати додаткову

бібліотеку.

Робота з SEO:

15

Page 16: Борис Могила "Isomorphic React apps in production"

Вивід SEO на сервері:

const {component} = this.props,

content = component ?

ReactDOM.renderToString(component) :

'',

head = Helmet.rewind();

● отримання потрібних даних:

16

Page 17: Борис Могила "Isomorphic React apps in production"

● відображення в jsx:

return (

<html lang="en-us">

<head>

{head.title.toComponent()}

{head.meta.toComponent()}

</head>

<body>

// компонент і скрипти

</body>

</html>

);17

Page 18: Борис Могила "Isomorphic React apps in production"

Отримання даних:

18

Page 19: Борис Могила "Isomorphic React apps in production"

● використовуємо Promise.all для контролю

виконання всіх подій

● ізоморфний компонент повинен мати статичний

метод, в якому описано

○ виклик всіх подій для отримання даних

○ додаткова ізоморфна логіка

● повний url для отримання даних

19

Page 20: Борис Могила "Isomorphic React apps in production"

static fetchData(props){

const promiseArray = [

seoAsyncAction (props);

];

return Promise.all(promiseArray);

}

20

Page 21: Борис Могила "Isomorphic React apps in production"

export default const seoAsyncAction = ({dispatch}) => {

return superagent

.get(`https://dom.ria.com/getSeo/`)

.then((res) => {

return dispatch({

type: "GET_SEO",

payload: res.body

})

})

} 21

Page 22: Борис Могила "Isomorphic React apps in production"

● логіку в браузері реалізуємо в методах

○ componentDidMount

○ componentWillReceiveProps

(не відпрацьовують на сервері)

22

Page 23: Борис Могила "Isomorphic React apps in production"

● отримання даних при вставці компонента в DOM

componentDidMount(){

const {props} = this;

MyComponent.fetchData(props);

}

23

Page 24: Борис Могила "Isomorphic React apps in production"

● оновлення даних при зміні параметрів сторінки

componentWillReceiveProps(nextProps){

if (/*ваше рішення оновлення даних */) {

MyComponent.fetchData(nextProps);

}

}

24

Page 25: Борис Могила "Isomorphic React apps in production"

// ./fetchComponentData

export default (dispatch, props) => {

return Promise.all(

props.components

.filter(

component => typeof component.fetchData === 'function'

)

.map(component => component.fetchData(

{dispatch, ...props}

)));

}

● на сервері виконуємо статичний метод у всіх

потрібних компонентів

25

Page 26: Борис Могила "Isomorphic React apps in production"

● формування відповіді

match({history, routes, req.originalUrl}, function (error, redirectLocation, renderProps){

fetchComponentData(store.dispatch, renderProps).then(() => {

component = (

<Provider store={store}>

<RouterContext {...renderProps} />

</Provider>

);

res.body = '<!doctype html>\n' +

renderToString(

<Html component={component} store={store} />

);

});

}); 26

Page 27: Борис Могила "Isomorphic React apps in production"

Чому варто збирати серверний код?

27

Page 28: Борис Могила "Isomorphic React apps in production"

● перший контакт з сервером тривалий

● при використанні лінивого завантаження без збірки код не буде

працювати на сервері

● можливість перегляду і контролю зібраного коду

28

Page 29: Борис Могила "Isomorphic React apps in production"

Розширений і доповнений приклад

https://github.com/BoryaMogila/koa_react_redux

email: [email protected],

facebook: Boris Mogila

vk: Борис Могила

twitter: Borya Mogila

Контактні дані:

29

Page 30: Борис Могила "Isomorphic React apps in production"

Дякую за увагу!

30