Server Side Rendering with React
Gufran Mirza
Software Engineer @Continuum
Twitter: _imGufran
Agenda
-
Overview - React Client Side Rendering
-
Overview - React Server Side Rendering
-
Performance CSR vs SSR
-
Live Demo
-
Discussion
What?
Server-Side Rendering is the ability of a front-end framework to render markup while running on a back-end system.
Why?
- Performance benefit for our customers
-
Faster times for the initial page render
- Consistent SEO performance
How?
- Express-JS/Hapi-JS with NodeJS
- React - Supports both CSR / SSR
- ReactDOM - renderToString()
Overview - React Client Side Rendering
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="shortcut icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no" />
<title>React App</title>
<link href="/static/css/main.css" rel="stylesheet">
<script src="/static/js/main.js"></script>
</head>
<body>
<div id="root"></div>
</body>
</html>
Generated Markup (SPA)
Browser downloads the Javascript and then executes it to generate the Content
Overview - React Client Side Rendering
Let`s Understand CSR with Example Page
Overview - React Client Side Rendering
Pup vs. Pup - GET #1
GET - /
SERVER
index.html
<!DOCTYPE html>
<html>
<head>
<title>Pup vs Pup</title>
<link rel="stylesheet" href="/css/style.css">
<script src="public/bundle.js" defer></script>
</head>
<body>
<div id="app"></div>
</body>
</html>
Overview - React Client Side Rendering
Pup vs. Pup - View #1
User View
Overview - React Client Side Rendering
Pup vs. Pup - GET #2
GET - /public/bundle.js
SERVER
bundle.js
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
....
21,547 MORE LINES OF CODE
Overview - React Client Side Rendering
Pup vs. Pup - View #2
- 21,500 lines of javascript parsed
- Script execution begins, React.DOM renders!
But where are the pups???
Overview - React Client Side Rendering
PuppyDB
Pup vs. Pup - GET #3
GET - /api/puppies
Overview - React Client Side Rendering
Client Side React - Overview
GET - /
1
SERVER
GET - /bundle.js
2
React.DOM Render
3
React.DOM Render
5
GET - api/puppies
4
"First Meaningful Paint"
GET - /style.css
Overview - React Client Side Rendering
Overview - React Server Side Rendering
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="shortcut icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no" />
<title>React App</title>
<link href="/static/css/main.css" rel="stylesheet">
<script src="/static/js/main.js"></script>
</head>
<body>
<div id="root"></div>
<div id="root">
<div class="App" data-reactroot="">
<header class="App-header">
<img src="[object Object]" class="App-logo" alt="logo" />
<p>Edit <code>src/App.js</code> and save to reload.</p>
<a class="App-link" href="https://reactjs.org" target="_blank" rel="noopener noreferrer">Learn React</a>
</header>
</div>
</div>
</body>
</html>
Generated Markup (SSR)
Server (NodeJS) renders the App and generates the content at server-side and returns the generated content
Overview - React Server Side Rendering
Server Side React - Overview
GET - /
1
SERVER
React.DOM Render
2
- Server gets request
- Server GETs data from DB**
- Server renders HTML
-
React DOM renders again on client side
- Verifies state, adds click handlers
Downloads js
Overview - React Server Side Rendering
Performance - CSR vs SSR
Performance - CSR vs SSR
Performance - CSR vs SSR
Performance - CSR vs SSR
Light Hose Report - CSR
Performance - CSR vs SSR
Performance Report - CSR
Performance - CSR vs SSR
Light Hose Report - SSR
Performance - CSR vs SSR
Performance Report - SSR
Live Demo!
Discussion
Server Side Rendering with React
By Gufran Mirza
Server Side Rendering with React
- 278