Server-side Rendered React
Tyler Graf
Web Dev
FamilySearch - Tree Team
What to expect
- What is SSR?
- Why SSR?
- Latest frameworks
- Progressive enhancement
Flavors of React Rendering

SSR
SSG
CSR
Server

<html>
<div id="root">
</html>
renderRoot(reactNode, domNode)
Request
HTML
Client-side Rendered (CSR)
res.send(html)
Server
renderToString(<App data={data}/>)

res.send(html)
hydrateRoot(reactNode, domNode)
Request
HTML
Server-side Rendered (SSR)
const data = await fetch()
Server
renderToString(<App/>)

res.send(html)
hydrateRoot(reactNode, domNode)
Request
HTML
Static Site Generation (SSG)
CDN
Build Server
uploadToS3(html)
file.html
getFileFromS3()

-
2015
-
Owned by Vercel
-
2021
-
Funded by Shopify







Getting Started
$ npx create-next-app@latest
$ npx create-remix@latest
Integrate into Express
import express from 'express'
import { createRequestHandler } from "@remix-run/express";
const app = express()
app.all("*", createRequestHandler());
Runtime Integrations
- node
- edge functions
- deno
- cloudflare
- etc

Build



Why?
Why SSR?
-
create-react-app is deprecated
-
SEO
-
Performance
- a11y
Performance
Australia - 3G - Moto G4




Server vs Client Components
Server Component | Client Component | |
---|---|---|
Rendered by Server | Yes | Yes, if passed data |
Rendered By Client | Yes if navigating | Yes |
export const loader = async () => {
const name = await fetch('/api/name').then(res=>res.json())
return json({name})
}
export default function Home(){
const {name} = useLoaderData()
return <div>
{name}
</div>
}
Remix Server Component
React Server Component
(next.js)
export default async function Home(){
const name = await fetch('/api/name').then(res=>res.json())
return <div>
{name}
</div>
}
useEffect
'use client'
export default function Home(){
const [name, setName] = useState()
useEffect(()=>{
fetch('/api/name')
.then(res=>res.json())
.then(data=>setName(data))
},[])
return <div>
{name}
</div>
}
Gretchen's Cookbook




~600
Recipes
PHP (2008)
PHP (2008)

Linux Server

- server admin
- linux
- php
- mysql
- queries
- url query params
- domain registration
- cname
- html
- css
- jquery
- ux

Rails (2009)
Rails (2009)

Linux Server
- ruby
- rails
- jquery
- social sharing
- pre-pwa
- media queries
- svn
- ssh


Angular (2012)

Angular (2012)

cookbook-api.herokuapp.com
- heroku
- git
- node
- express
- rest
- mongo
- mongoose
- angular 1
- xhr


gretchenscookbook.com
Polymer 1 (2015)

Polymer 1 (2015)

- nosql
- firebase
- pwa
- service worker
- real time db
- polymer 1
- performance

gretchenscookbook.com
Polymer 2 (2017)
PWA, node, mongo


Polymer 2 (2017)
cookbook-api.herokuapp.com
- Polymer 2
- offline
- performance
- ES Modules
- Auth

gretchenscookbook.com

Lit (2019)

Create React App (2021)

Remix/Next (2023)


Remix/Next (2023)
gretchenscookbook.com
- Remix
- Next
- SSR
- tailwind
- prisma
- sqlite



Demo
Takeaways


SSR - React
By Tyler Graf
SSR - React
- 253