SlideShare a Scribd company logo
Борис Могила
RIA.com
Isomorphic React apps in production
100%
ізоморфний код
2
Клієнт
Сервер
Спільний код
Сервер
для роботи
з даними
80% ізоморфного коду!
3
● Webpack - білдер скриптів
Стек технологій:
● Redux - модель роботи з даними
● React-router - універсальний роутінг
● React - логіка виводу даних
● React-helmet - робота з SEO
4
Запит
Ініціалізація
store
Роутінг
(отримання
компонента)
Відпрацювання
всіх подій
(отримання даних)
Рендерінг
компонента
Відповідь
Логіка на сервері
5
Ініціалізація
store
Роутінг
(отримання
компонента)
Підключення
віртуального
дому до HTML
Натиснення на
посилання
Логіка в браузері
зміна HTML
6
7
● синхронізація state та history API
Ініціалізація store
● метод конфігурації store реалізуємо з
можливістю передачі:
○ даних для ініціалізації стану
○ history API
○ middlewares
● передача state на клієнт
8
9
Роутінг
● для отримання компонента використовуємо
метод match, як на клієнті, так і на сервері
● реалізація перенаправлень (redirect-ів) на рівні
отримання даних з сервера
● react-router не працює з регулярними виразами
10
● отримання компонента на клієнті:
match({routes, history}, (error, redirectLocation, renderProps) => {
render(
<Provider store={store}>
<Router {...renderProps}/>
</Provider>
, document.getElementById('content')
);
});
11
● ліниве завантаження (lazy-loading) реалізовуємо
на рівні роутінга
● require.ensure не працює на сервері
12
● ліниве завантаження (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
14
export default (seo) => (
<Helmet
title={seo.title}
meta={[
{"name": "description", "content": seo.text}
]}
/>
)
React не пристосований для роботи з тегом
head, тому доведеться використати додаткову
бібліотеку.
Робота з SEO:
15
Вивід SEO на сервері:
const {component} = this.props,
content = component ?
ReactDOM.renderToString(component) :
'',
head = Helmet.rewind();
● отримання потрібних даних:
16
● відображення в jsx:
return (
<html lang="en-us">
<head>
{head.title.toComponent()}
{head.meta.toComponent()}
</head>
<body>
// компонент і скрипти
</body>
</html>
);
17
Отримання даних:
18
● використовуємо Promise.all для контролю
виконання всіх подій
● ізоморфний компонент повинен мати статичний
метод, в якому описано
○ виклик всіх подій для отримання даних
○ додаткова ізоморфна логіка
● повний url для отримання даних
19
static fetchData(props){
const promiseArray = [
seoAsyncAction (props);
];
return Promise.all(promiseArray);
}
20
export default const seoAsyncAction = ({dispatch}) => {
return superagent
.get(`https://dom.ria.com/getSeo/`)
.then((res) => {
return dispatch({
type: "GET_SEO",
payload: res.body
})
})
} 21
● логіку в браузері реалізуємо в методах
○ componentDidMount
○ componentWillReceiveProps
(не відпрацьовують на сервері)
22
● отримання даних при вставці компонента в DOM
componentDidMount(){
const {props} = this;
MyComponent.fetchData(props);
}
23
● оновлення даних при зміні параметрів сторінки
componentWillReceiveProps(nextProps){
if (/*ваше рішення оновлення даних */) {
MyComponent.fetchData(nextProps);
}
}
24
// ./fetchComponentData
export default (dispatch, props) => {
return Promise.all(
props.components
.filter(
component => typeof component.fetchData === 'function'
)
.map(component => component.fetchData(
{dispatch, ...props}
)));
}
● на сервері виконуємо статичний метод у всіх
потрібних компонентів
25
● формування відповіді
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
Чому варто збирати серверний код?
27
● перший контакт з сервером тривалий
● при використанні лінивого завантаження без збірки код не буде
працювати на сервері
● можливість перегляду і контролю зібраного коду
28
Розширений і доповнений приклад
https://github.com/BoryaMogila/koa_react_redux
email: bora.mog@gmail.com,
facebook: Boris Mogila
vk: Борис Могила
twitter: Borya Mogila
Контактні дані:
29
Дякую за увагу!
30

More Related Content

PDF
"Request Lifecycle at Prom.ua", Vitaliy Kharytonskiy
PPTX
'GOLANG USAGE IN DEVELOPMENT OF NODE.JS APPLICATIONS (NODE.JS: IN GO WE TRUST...
PPTX
ASP.Net part 2
PPTX
Сергей Калинец "Стероиды для Дотнетчика"
PPT
Владимир Никонов "Вызовы при разработке enterprise продукта"
PPTX
Стас Султанов "Assembling Solutions with Microsoft Azure"
PPTX
Сергей Радзыняк ".NET Microservices in Real Life"
PDF
Григорий Шехет "Treasure hunt in the land of Reactive frameworks"
"Request Lifecycle at Prom.ua", Vitaliy Kharytonskiy
'GOLANG USAGE IN DEVELOPMENT OF NODE.JS APPLICATIONS (NODE.JS: IN GO WE TRUST...
ASP.Net part 2
Сергей Калинец "Стероиды для Дотнетчика"
Владимир Никонов "Вызовы при разработке enterprise продукта"
Стас Султанов "Assembling Solutions with Microsoft Azure"
Сергей Радзыняк ".NET Microservices in Real Life"
Григорий Шехет "Treasure hunt in the land of Reactive frameworks"

Viewers also liked (20)

PPTX
Андрей Чебукин "Построение успешных API"
PPTX
Игорь Леонтьев "Azure Container Service: not only Docker"
PPTX
Сергей Поплавский "DeepDive в Bot платформу Microsoft. Технические аспекты ра...
PPTX
Евгений Остапчук "Tips&Tricks for ASP.NET MVC performance"
PDF
Юрий Лучанинов "Критерии выбора JS-фреймворков"
PDF
Антон Молдован "Type driven development with f#"
PPTX
Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"
PPTX
Евгений Напрягло ".NET Framework Hosting API Overview"
PPTX
Игорь Фесенко "What’s New in C# 7.0"
PDF
Юлия Пучнина "PhaserJS for advertisement: игры внутри баннеров"
PDF
Сергей Яковлев "Техническая сторона email-маркетинга"
PDF
Алексей Косинский "React Native vs. React+WebView"
PDF
Алексей Волков "Еще несколько слов об архитектуре"
PDF
Максим Климишин "Борьба с асинхронностью в JS"
PDF
Павел Тайкало: "Apple watch first steps"
PDF
Андрей Уманский и Дмитрий Горин "Нет скучным ретроспективам! Создаём эффектив...
PDF
Ruby w/o Rails (Олександр Сімонов)
PDF
"The Grail: React based Isomorph apps framework" Эльдар Джафаров
PDF
Анна Лаврова "When Fairy Tale meets Reality: Точность-надежность-дизайн"
PDF
Алексей Демедецкий | Unit testing in swift
Андрей Чебукин "Построение успешных API"
Игорь Леонтьев "Azure Container Service: not only Docker"
Сергей Поплавский "DeepDive в Bot платформу Microsoft. Технические аспекты ра...
Евгений Остапчук "Tips&Tricks for ASP.NET MVC performance"
Юрий Лучанинов "Критерии выбора JS-фреймворков"
Антон Молдован "Type driven development with f#"
Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"
Евгений Напрягло ".NET Framework Hosting API Overview"
Игорь Фесенко "What’s New in C# 7.0"
Юлия Пучнина "PhaserJS for advertisement: игры внутри баннеров"
Сергей Яковлев "Техническая сторона email-маркетинга"
Алексей Косинский "React Native vs. React+WebView"
Алексей Волков "Еще несколько слов об архитектуре"
Максим Климишин "Борьба с асинхронностью в JS"
Павел Тайкало: "Apple watch first steps"
Андрей Уманский и Дмитрий Горин "Нет скучным ретроспективам! Создаём эффектив...
Ruby w/o Rails (Олександр Сімонов)
"The Grail: React based Isomorph apps framework" Эльдар Джафаров
Анна Лаврова "When Fairy Tale meets Reality: Точность-надежность-дизайн"
Алексей Демедецкий | Unit testing in swift
Ad

Similar to Борис Могила "Isomorphic React apps in production" (20)

PPTX
ASP.Net basics
PPTX
PPT
Lec12 користувацькi елементи керування ed
PPTX
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
PPTX
O.Posyniak - UI Components
PPTX
10 asp.net
PPT
Lec11 користувацькi елементи керування
PPTX
"Effectful code", Illya Klymov
PDF
Joomla 3. Що нового для розробників у новій версії - Віталій Маренков
PPT
Lec10 11 ado-net
PDF
"How I don't need a state management library in React app", Tetiana Melnyk
PDF
07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
PPTX
ASP.Net Core Services
PPTX
Юрий Грузинский. Як самописні скрипти і методики допомагають в роботі по SEO:...
PPTX
Design patterns part 1
PDF
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
PDF
"Instant loading: Improving your website speed", Yozhef Hisem
PPTX
Роман Рогоза . Як ми зредіректили один SaaS продукт на інший і що це нам дало...
PPTX
Design patterns part 2
ASP.Net basics
Lec12 користувацькi елементи керування ed
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
O.Posyniak - UI Components
10 asp.net
Lec11 користувацькi елементи керування
"Effectful code", Illya Klymov
Joomla 3. Що нового для розробників у новій версії - Віталій Маренков
Lec10 11 ado-net
"How I don't need a state management library in React app", Tetiana Melnyk
07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
ASP.Net Core Services
Юрий Грузинский. Як самописні скрипти і методики допомагають в роботі по SEO:...
Design patterns part 1
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Instant loading: Improving your website speed", Yozhef Hisem
Роман Рогоза . Як ми зредіректили один SaaS продукт на інший і що це нам дало...
Design patterns part 2
Ad

More from Fwdays (20)

PDF
"Mastering UI Complexity: State Machines and Reactive Patterns at Grammarly",...
PDF
"Effect, Fiber & Schema: tactical and technical characteristics of Effect.ts"...
PPTX
"Computer Use Agents: From SFT to Classic RL", Maksym Shamrai
PPTX
"Як ми переписали Сільпо на Angular", Євген Русаков
PDF
"AI Transformation: Directions and Challenges", Pavlo Shaternik
PDF
"Validation and Observability of AI Agents", Oleksandr Denisyuk
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
PPTX
"Co-Authoring with a Machine: What I Learned from Writing a Book on Generativ...
PPTX
"Human-AI Collaboration Models for Better Decisions, Faster Workflows, and Cr...
PDF
"AI is already here. What will happen to your team (and your role) tomorrow?"...
PPTX
"Is it worth investing in AI in 2025?", Alexander Sharko
PDF
''Taming Explosive Growth: Building Resilience in a Hyper-Scaled Financial Pl...
PDF
"Scaling in space and time with Temporal", Andriy Lupa.pdf
PDF
"Database isolation: how we deal with hundreds of direct connections to the d...
PDF
"Scaling in space and time with Temporal", Andriy Lupa .pdf
PPTX
"Provisioning via DOT-Chain: from catering to drone marketplaces", Volodymyr ...
PPTX
" Observability with Elasticsearch: Best Practices for High-Load Platform", A...
PPTX
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
PPTX
"Istio Ambient Mesh in production: our way from Sidecar to Sidecar-less",Hlib...
"Mastering UI Complexity: State Machines and Reactive Patterns at Grammarly",...
"Effect, Fiber & Schema: tactical and technical characteristics of Effect.ts"...
"Computer Use Agents: From SFT to Classic RL", Maksym Shamrai
"Як ми переписали Сільпо на Angular", Євген Русаков
"AI Transformation: Directions and Challenges", Pavlo Shaternik
"Validation and Observability of AI Agents", Oleksandr Denisyuk
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
"Co-Authoring with a Machine: What I Learned from Writing a Book on Generativ...
"Human-AI Collaboration Models for Better Decisions, Faster Workflows, and Cr...
"AI is already here. What will happen to your team (and your role) tomorrow?"...
"Is it worth investing in AI in 2025?", Alexander Sharko
''Taming Explosive Growth: Building Resilience in a Hyper-Scaled Financial Pl...
"Scaling in space and time with Temporal", Andriy Lupa.pdf
"Database isolation: how we deal with hundreds of direct connections to the d...
"Scaling in space and time with Temporal", Andriy Lupa .pdf
"Provisioning via DOT-Chain: from catering to drone marketplaces", Volodymyr ...
" Observability with Elasticsearch: Best Practices for High-Load Platform", A...
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
"Istio Ambient Mesh in production: our way from Sidecar to Sidecar-less",Hlib...

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