111
Изоморфные React- приложения: производительность и масштабирование Денис Измайлов

Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

  • Upload
    ontico

  • View
    1.007

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Изоморфные React-приложения:производительность и масштабированиеДенис Измайлов

Page 2: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Почему от классическогоSingle Page Application

необходимо отказаться?

Page 3: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Как изоморфные приложенияотразятся на Вашей зарплате?

Page 4: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Что вы будете делатьна этих выходных?

Page 5: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Идеально1. React 142. webpack3. ES64. Node.js5. Express / koa6. Isomorphic (Universal) apps

Page 6: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Часть 1

Page 7: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Web стал оченьбольшим

Page 8: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Искусство

Разработка под Web

Наука

Page 9: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Раньше было просто• Создал страницу• Добавил пару скриптов• Отправил в Production

Page 10: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Раньше было просто

Сервер

Браузер

Page 11: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Раньше было просто

Сервер

Браузер

Делал всё

Page 12: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Раньше было просто

Сервер

Браузер- HTML- [CSS, JavaScript]

Делал всё

Page 13: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Это работало

Page 14: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Single PageApplications

(SPA)

Page 15: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Single Page Application

Сервер

Браузер

Page 16: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Single Page Application

Сервер

Браузер

Страница существует?Авторизация нужна?Доступ есть?

Page 17: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Single Page Application

Сервер

Браузер

Страница существует?Авторизация нужна?Доступ есть?

- Tiny HTML, [CSS]- JavaScript bundle

Page 18: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Single Page ApplicationПлюсы• Легко начать

• webpack• <div id=“root” />• React, Redux• build

Page 19: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Single Page ApplicationПлюсы• Легко начать

• Богатый функционалwebpack, <div id=“root” />, React, Redux

Page 20: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Single Page ApplicationПлюсы• Легко начать

• Богатый функционал• Быстро дорабатывать

webpack, <div id=“root” />, React, Redux

Page 21: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Single Page ApplicationПлюсы• Легко начать

• Богатый функционал• Быстро дорабатывать• Отзывчивый UI

webpack, <div id=“root” />, React, Redux

Page 22: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Single Page ApplicationПлюсы• Легко начать

• Богатый функционал• Быстро дорабатывать• Отзывчивый UI• Удобно кэшировать

webpack, <div id=“root” />, React, Redux

Page 23: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

- Wow. И не одного минуса?

Page 24: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Single Page ApplicationМинусы• Долгая загрузка

• JavaScript bundle up to 3-5 Mb • первое обращение• исполнение• память

Page 25: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Single Page ApplicationМинусы• Долгая загрузка

• Сложность поддержки• side-эффекты• memory leak

1st request, CPU, mem

Page 26: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Single Page ApplicationМинусы• Долгая загрузка

• Сложность поддержки

• Пустая страница, один URL

1st request, CPU, mem

side-эффекты, memory leaks

Page 27: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Single Page ApplicationМинусы• Долгая загрузка

• Сложность поддержки

• Пустая страница, один URL• Legacy Browsers

1st request, CPU, mem

side-эффекты, memory leaks

Page 28: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

- Разве это минусы?

Page 29: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Single Page ApplicationМинусы• Долгая загрузка

для бизнеса

снижение UX

Page 30: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Single Page ApplicationМинусы• Долгая загрузка• Сложность поддержки

для бизнеса

снижение UXриски

Page 31: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Single Page ApplicationМинусы• Долгая загрузка• Сложность поддержки• Пустая страница

для бизнеса

снижение UXриски

проблемы SEO

Page 32: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Single Page ApplicationМинусы• Долгая загрузка• Сложность поддержки• Пустая страница• Один URL

для бизнеса

снижение UXриски

проблемы SEOпроблемы SMM

Page 33: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Single Page ApplicationМинусы• Долгая загрузка• Сложность поддержки• Пустая страница• Один URL• Legacy Browsers

для бизнеса

снижение UXриски

проблемы SEOпроблемы SMM

потеря ЦА

Page 34: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Single Page ApplicationМинусы• Долгая загрузка• Сложность поддержки• Пустая страница• Один URL• Legacy Browsers

для бизнеса

снижение UXриски

проблемы SEOпроблемы SMM

потеря ЦА

Расходы

Page 35: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Single Page ApplicationМинусы

для бизнеса

снижение UXриски

проблемы SEOпроблемы SMM

потеря ЦА

Расходы

Page 36: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

- WAT? Что делать?

Page 37: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Взять лучшее из обоих миров

Page 38: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Изоморфныеприложения

Page 39: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Изоморфные приложения

By isomorphic we mean that any given line of code (with notable exceptions) can execute both on the client and the server.

Charlie Robbins,18 Oct 2011

Page 40: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

ШаблоныСтилиЛокализацияКонфигурацияRoutes

Права доступаМоделиСхемыВалидацияСервисы

Изоморфные приложения

server.jsNode.js

worker.js

client.jsBrowser

admin.js

Бизнес-логикаКомпонентыAPI-интерфейсыActions, ReducersStatic Files

Page 41: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Браузер

Изоморфные приложения

Front-endсервер

Back-endсервер

DatabaseJavaetc

Page 42: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Браузер

Изоморфные приложения

Front-endсервер

Back-endсервер

DatabaseJavaetc

Page 43: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Браузер

Изоморфные приложения

Front-endсервер

Back-endсервер

DatabaseJavaetc

- HTML- [critical CSS]- …

Page 44: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Front-endклиент

Изоморфные приложения

Front-endсервер

Back-endсервер

DatabaseJavaetc

- HTML- [critical CSS]- JS Bundle

Page 45: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Front-endклиент

Изоморфные приложения

Front-endсервер

Back-endсервер

DatabaseJavaetc

- HTML- [critical CSS]- JS Bundle

Page 46: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Front-endклиент

Изоморфные приложения

Front-endсервер

• Единая среда исполнения

• Общая кодовая база

• Полный контроль

• Экосистема

Page 47: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

- Но как?

Page 48: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Server-Side Rendering(SSR)

Page 49: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Server-Side Rendering• Сборка React-приложения в HTML-

код на Front-end сервере• Моментальное отображение в

браузере, ещё до загрузки JS• Когда JS загрузится, React только

добавит обработчики событий• А это очень быстро

Page 50: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Server-Side RenderingКод на сервере выглядит очень просто:

import ReactDOMServer from 'react-dom/server';import Application from './components/application';

const body = ReactDOMServer.renderToString( <Application />);

Page 51: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Server-Side Rendering1. Пользователь видит страницу

мгновенно2. Отсутствие дополнительных запросов

на получение данных3. Страница может работать даже без JS4. Полноценная URL-навигация и мета-

тэги5. Сохранение всех возможностей

современного JavaScript

Page 52: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Часть 2

Page 53: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Производительностьи масштабирование

Page 54: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Масштабирование

Page 55: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Масштабированиефункциональное

Page 56: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Server-Side RenderingВсё супер, когда данные есть:import ReactDOMServer from 'react-dom/server';import Application from './components/application';

const initialState = { siteName: 'HighLoad++ 2015' };const body = ReactDOMServer.renderToString( <Application state={initialState} />);

Page 57: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Server-Side RenderingВсё супер, когда данные есть:import ReactDOMServer from 'react-dom/server';import Application from './components/application';

const initialState = { siteName: 'HighLoad++ 2015' };const body = ReactDOMServer.renderToString( <Application state={initialState} />);

Но если их надо получать извне?

Page 58: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Server-Side RenderingКак получить асинхронный State:

1. Вручную для каждой страницы2. Facebook Relay3. redux-catch-promise

Page 59: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Асинхронный StateВручную для каждой страницы:

• Получить State, необходимый для страницы

• ReactDOMServer.renderToString()

Page 60: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Асинхронный StateFacebook Relay:1. The framework for building data-

driven React applications2. Declarative. Colocation. Mutations.3. https://github.com/facebook/relay/issu

es/1364. 1Q2016

Page 61: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Асинхронный Stateredux-catch-promise:• Redux - state container для React• Redux: the best for isomorphic apps,

MoscowJS 25https://youtu.be/Uyk_8WWna6s

• redux-catch-promise - это middleware для Redux

Page 62: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Асинхронный Stateredux-catch-promise:1. Вешаем callback для захвата Promise-

экшнов2. Делаем рендер приложения3. Делаем запрос к БД, диспатчим Promise4. После рендера - имеем все эти

промисы, ожидаем их завершения5. Повторный рендер, с данными

Page 63: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Асинхронный Stateredux-catch-promise:1. Примеры и исходный код:

https://github.com/DenisIzmaylov/redux-catch-promise

2. Установка:npm install redux-catch-promise

Page 64: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Производительность

Page 65: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Производительность

Тестовый стенд:

MacBook Pro 15” Retina (Early 2013)2.4 GHz Intel Core i7

Page 66: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

ПроизводительностьРазмер страницы: 56 238 байт

Page 67: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

ПроизводительностьРазмер страницы: 56 238 байт

Page 68: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

ПроизводительностьРазмер страницы: 56 238 байт

Page 69: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

ПроизводительностьРазмер страницы: 56 238 байт

Page 70: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

ПроизводительностьРазмер страницы: 56 238 байт

Page 71: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

ПроизводительностьРазмер страницы: 56 238 байт

Page 72: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Производительность

Для теста используем:ab -n 100 http://localhost:3000/profile

Page 73: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Производительность

Для теста используем:ab -n 100 http://localhost:3000/profile

Запускаем…

Page 74: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Производительность

Для теста используем:ab -n 100 http://localhost:3000/profile

Запускаем…Time per request: 61.850 ms

Page 75: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Производительность

61.850 ms

Это много или мало?

Page 76: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Производительность

61.850 ms

Тот же шаблон в Handlebars:

8.385 ms

86% less

Page 77: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Производительность1. Идём в Google - ничего полезного.2. Пробуем спросить Twitter - тишина:

Page 78: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Производительность

Ок, а что если?NODE_ENV=production

Запускаем…

Page 79: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Производительность

Ок, а что если?NODE_ENV=production

Запускаем…Time per request: 37.943 ms

(vs 61.850 ms)39% less

Page 80: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Производительность

Вроде лучше.

Page 81: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Производительность

Вроде лучше.

Но всё ещё не торт.

Page 82: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Ищем дальше

Page 83: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

GitHub issues

Page 84: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Производительность• “Server rendering is slower with npm

react”

https://github.com/facebook/react/issues/812

Page 85: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Производительность• “Server rendering is slower with npm

react”

https://github.com/facebook/react/issues/812

Решение:явно подключать react/dist/react.min.js

Page 86: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

ПроизводительностьСоздаём node_modules/react.js:

if (process.env.NODE_ENV === 'production') {module.exports =

require('react/dist/react.min.js');} else { module.exports = require('react/dist/react.js');}

Page 87: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

ПроизводительностьСоздаём node_modules/react.js:

if (process.env.NODE_ENV === 'production') {module.exports =

require('react/dist/react.min.js');} else { module.exports = require('react/dist/react.js');}

Page 88: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Как это изменило результат?

Page 89: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Производительность

Server rendering is slower with npm react

react/dist/react.min.js

Запускаем…

Page 90: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Производительность

Server rendering is slower with npm reactreact/dist/react.min.js

Запускаем…Time per request: 38.253 ms

(vs 37.943 ms)0.08% more

Page 91: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Производительность

Server rendering is slower with npm reactreact/dist/react.min.js

Запускаем…Time per request: 38.253 ms

(vs 37.943 ms)0.08% more

Page 92: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Series10

17.5

35

52.5

7062

8

38 38

React SSR Handlebars production react.js.min

Результаты

Page 93: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Series10

17.5

35

52.5

7062

8

38 38

React SSR Handlebars production react.js.min

Результаты39% less

Page 94: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Часть 3

Page 95: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Продвинутые решения

Page 96: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Продвинутые решения

1.Precompilation + Cache2.Rendering Separation3.React DOM Stream 4.Facebook BigPipe 5.HAProxy

Page 97: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Precompilation + Cache• UI = f(state)• f = React Component• state = path + ...

Простое решение: redisFirst render: redis + kue + workers

Page 98: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Rendering Separation

Page 99: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

React DOM Stream• Flushing the Document Early• “Streams make this library as much as

47% faster in sending down a full page than ReactDOM.renderToString, and user perceived performance gains can be even greater.”

• Target - 108KB page on Heroku• Time To First Byte (TTFB) - 65% less• Time To Last Byte (TTLB) - 37% less• https://github.com/aickin/react-dom-strea

m

Page 100: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Facebook BigPipe• Сборка страницы в процессе загрузки• Загружается параллельно• Устойчивость к ошибкам

Page 101: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Facebook BigPipe• Сборка страницы на в процессе загрузки• Всё, что необходимо - загружается параллельно• Устойчивость к ошибкам

Page 102: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Facebook BigPipe

Page 103: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

HAProxy• Обратитесь к DevOps• Несколько экземпляров

Page 104: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Заключение

Page 105: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Полезные материалы1. Supercharging page load (100 Days of Google

Dev) https://youtu.be/d5_6yHixpsQ2. Making Netflix.com Faster

http://techblog.netflix.com/2015/08/making-netflixcom-faster.html

3. New technologies for the new LinkedIn home page https://engineering.linkedin.com/frontend/new-technologies-new-linkedin-home-page

4. Improving performance on Twitter.com https://blog.twitter.com/2012/improving-performance-on-twittercom

5. Scaling Isomorphic Javascript Code http://blog.nodejitsu.com/scaling-isomorphic-javascript-code/

Page 106: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Полезные материалы6. From AngularJS to React: The Isomorphic Way

https://blog.risingstack.com/from-angularjs-to-react-the-isomorphic-way/

7. Isomorphic JavaScript: The Future of Web Apps http://nerds.airbnb.com/isomorphic-javascript-future-web-apps/

8. React server side rendering performance http://www.slideshare.net/nickdreckshage/react-meetup

9. The Lost Art of Progressive HTML Rendering http://blog.codinghorror.com/the-lost-art-of-progressive-html-rendering/

Page 107: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Рекомендации• Присоединяйтесь

к сообществу MoscowJShttp://moscowjs.ru/

• Улучшайте английский, не читайте советских газет

• Читайте оригиналы и технические блоги

• Активно внедряйте в свою жизнь Twitter и GitHub

Page 108: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Послесловие«Большинство проблем

алгоритмов можно решить сменой структуры

данных», Андрей Ситник

“Changes is our work”,Jake Archibald, Google

Page 109: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Почему от классическогоSingle Page Application

необходимо отказаться?

Page 110: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Спасибо за вниманиеДенис Измайлов

@DenisIzmaylov

https://github.com/DenisIzmaylovhttps://fb.com/denis.izmaylov

Page 111: Изоморфные React-приложения производительность и масштабирование / Денис Измайлов (Startup Makers)

Приложение 1