2. Денис Измайлов
• 15 лет опыта разработки ПО и web
• Последние 5 лет полностью Front-end,
Node.js и архитектуре
• Более 10 проектов, в т.ч. много SPA,
highload и React
• Коммиты в Redux, webpack и koa
• Спикер HighLoad++ 2015, MoscowJS
• Автор статей на Habrahabr и
англоязычных ресурсах
, CEO
32. Single Page Application
Минусы
• Долгая загрузка
• Сложность поддержки
• Пустая страница
для бизнеса
снижение UX
риски
проблемы SEO
32
33. Single Page Application
Минусы
• Долгая загрузка
• Сложность поддержки
• Пустая страница
• Один URL
для бизнеса
снижение UX
риски
проблемы SEO
проблемы SMM
33
34. Single Page Application
Минусы
• Долгая загрузка
• Сложность поддержки
• Пустая страница
• Один URL
• Legacy Browsers
для бизнеса
снижение UX
риски
проблемы SEO
проблемы SMM
потеря ЦА
34
35. Single Page Application
Минусы
• Долгая загрузка
• Сложность поддержки
• Пустая страница
• Один URL
• Legacy Browsers
для бизнеса
снижение UX
риски
проблемы SEO
проблемы SMM
потеря ЦА
Расходы
40. Изоморфные приложения
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
50. Server-Side Rendering
• Сборка HTML на Front-end сервере
• Моментальное отображение в
браузере, ещё до загрузки JS
• Когда JS загрузится, React только
добавит обработчики событий
• А это очень быстро
50
51. Server-Side Rendering
Код на сервере выглядит очень просто:
import ReactDOMServer from 'react-dom/server';
import Application from './components/application';
const body = ReactDOMServer.renderToString(
<Application />
);
51
52. Server-Side Rendering
1. Пользователь видит страницу
мгновенно
2. Отсутствие дополнительных запросов
на получение данных
3. Страница может работать даже без JS
4. Полноценная URL-навигация и мета-
тэги
5. Сохранение всех возможностей
современного JavaScript 52
57. Server-Side Rendering
Всё супер, когда данные есть:
import ReactDOMServer from 'react-dom/server';
import Application from './components/application';
const initialState = { siteName: ‘Startup Makers' };
const body = ReactDOMServer.renderToString(
<Application state={initialState} />
);
57
58. Server-Side Rendering
Всё супер, когда данные есть:
import ReactDOMServer from 'react-dom/server';
import Application from './components/application';
const initialState = { siteName: ‘Startup Makers' };
const body = ReactDOMServer.renderToString(
<Application state={initialState} />
);
Но если их надо
получать извне?
58
60. Асинхронный State
Вручную для каждой страницы:
• Получить State, необходимый для
страницы
• ReactDOMServer.renderToString()
60
61. Асинхронный State
Facebook Relay:
1. The framework for building data-driven
React applications
2. Declarative. Colocation. Mutations.
3. https://github.com/facebook/relay/
issues/136
4. 1Q2016
61
62. Асинхронный State
redux-catch-promise:
• Redux - state container для React
• Redux: the best for isomorphic apps,
MoscowJS 25
https://youtu.be/Uyk_8WWna6s
• redux-catch-promise - это middleware
для Redux
62
63. Асинхронный State
redux-catch-promise:
1. callback для захвата Promise-экшнов
2. Делаем рендер компонент
3. Из компонент - запрос к БД, отдавая
Promise
4. Собираем все эти промисы, ожидаем их
завершения
5. Повторный рендер, с данными
63
91. Производительность
Server rendering is slower with npm react
react/dist/react.min.js
Запускаем…
Time per request: 38.253 ms
(vs 37.943 ms)
0.08% more
91
92. Производительность
Server rendering is slower with npm react
react/dist/react.min.js
Запускаем…
Time per request: 38.253 ms
(vs 37.943 ms)
0.08% more
FAILED
92
101. Progressive Rendering
• 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”
• Target - 108KB page on Heroku
• Time To First Byte (TTFB) - 55% faster
• https://github.com/aickin/react-dom-stream
101
102. Facebook BigPipe
• Сборка страницы в процессе загрузки
• Загружается параллельно
• Устойчивость к ошибкам
103. Facebook BigPipe
• Сборка страницы в процессе загрузки
• Загружается параллельно
• Устойчивость к ошибкам
104. Facebook BigPipe
• Сборка страницы в процессе загрузки
• Загружается параллельно
• Устойчивость к ошибкам
108. Рекомендации
• Присоединяйтесь
к сообществу MoscowJS
http://moscowjs.ru/
• Улучшайте английский, не читайте
советских газет
• Читайте оригиналы и технические блоги
• Активно внедряйте в свою жизнь Twitter
и GitHub 108
109. Полезные материалы
1. Supercharging page load (100 Days of Google Dev)
https://youtu.be/d5_6yHixpsQ
2. 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/
109
110. Полезные материалы
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/
10. Extract and inline Critical Path CSS in HTML pages
https://github.com/addyosmani/critical
110