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

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

Jan 23, 2018

Download

Technology

fwdays
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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