FamilySearch - Tree Team
Server
<html>
<div id="root">
</html>
renderRoot(reactNode, domNode)
Request
HTML
res.send(html)
Server
renderToString(<App data={data}/>)
res.send(html)
hydrateRoot(reactNode, domNode)
Request
HTML
const data = await fetch()
Server
renderToString(<App/>)
res.send(html)
hydrateRoot(reactNode, domNode)
Request
HTML
CDN
Build Server
uploadToS3(html)
file.html
getFileFromS3()
$ npx create-next-app@latest
$ npx create-remix@latest
import express from 'express'
import { createRequestHandler } from "@remix-run/express";
const app = express()
app.all("*", createRequestHandler());
Australia - 3G - Moto G4
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>
}
(next.js)
export default async function Home(){
const name = await fetch('/api/name').then(res=>res.json())
return <div>
{name}
</div>
}
'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>
}
Linux Server
Linux Server
cookbook-api.herokuapp.com
gretchenscookbook.com
gretchenscookbook.com
PWA, node, mongo
cookbook-api.herokuapp.com
gretchenscookbook.com
gretchenscookbook.com