mirror of
https://github.com/terribleplan/next.js.git
synced 2024-01-19 02:48:18 +00:00
Add an example with SSR caching. (#497)
* Add an example with SSR caching. * Update server.js * Update README.md * Use app.renderError to display errors in SSR example.
This commit is contained in:
parent
01da6f4761
commit
b9bee24787
31
examples/ssr-caching/README.md
Normal file
31
examples/ssr-caching/README.md
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
|
||||||
|
# Example app where it caches SSR'ed pages in the memory
|
||||||
|
|
||||||
|
## How to use
|
||||||
|
|
||||||
|
Download the example (or clone the repo)[https://github.com/zeit/next.js.git]:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl https://codeload.github.com/zeit/next.js/tar.gz/master | tar -xz --strip=2 next.js-master/examples/ssr-caching
|
||||||
|
cd ssr-caching
|
||||||
|
```
|
||||||
|
|
||||||
|
Install it and run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Deploy it to the cloud with [now](https://zeit.co/now) ([download](https://zeit.co/download))
|
||||||
|
|
||||||
|
```bash
|
||||||
|
now
|
||||||
|
```
|
||||||
|
|
||||||
|
## The idea behind the example
|
||||||
|
|
||||||
|
React Server Side rendering is very costly and takes a lot of server's CPU power for that. One of the best solutions for this problem is cache already rendered pages.
|
||||||
|
That's what this example demonstrate.
|
||||||
|
|
||||||
|
This app uses Next's [custom server and routing](https://github.com/zeit/next.js#custom-server-and-routing) mode. It also uses [express](https://expressjs.com/) to handle routing and page serving.
|
10
examples/ssr-caching/package.json
Normal file
10
examples/ssr-caching/package.json
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"scripts": {
|
||||||
|
"start": "node server.js"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"express": "^4.14.0",
|
||||||
|
"lru-cache": "^4.0.2",
|
||||||
|
"next": "^2.0.0-beta"
|
||||||
|
}
|
||||||
|
}
|
17
examples/ssr-caching/pages/blog.js
Normal file
17
examples/ssr-caching/pages/blog.js
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
import React from 'react'
|
||||||
|
|
||||||
|
export default class extends React.Component {
|
||||||
|
static getInitialProps ({ query: { id } }) {
|
||||||
|
return { id }
|
||||||
|
}
|
||||||
|
|
||||||
|
render () {
|
||||||
|
return <div>
|
||||||
|
<h1>My {this.props.id} blog post</h1>
|
||||||
|
<p>
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
|
||||||
|
tempor incididunt ut labore et dolore magna aliqua.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
9
examples/ssr-caching/pages/index.js
Normal file
9
examples/ssr-caching/pages/index.js
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
import Link from 'next/link'
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<ul>
|
||||||
|
<li><Link href='/blog?id=first' as='/blog/first'><a>My first blog post</a></Link></li>
|
||||||
|
<li><Link href='/blog?id=second' as='/blog/second'><a>My second blog post</a></Link></li>
|
||||||
|
<li><Link href='/blog?id=last' as='/blog/last'><a>My last blog post</a></Link></li>
|
||||||
|
</ul>
|
||||||
|
)
|
58
examples/ssr-caching/server.js
Normal file
58
examples/ssr-caching/server.js
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
const express = require('express')
|
||||||
|
const next = require('next')
|
||||||
|
const LRUCache = require('lru-cache')
|
||||||
|
|
||||||
|
const app = next({ dir: '.', dev: true })
|
||||||
|
const handle = app.getRequestHandler()
|
||||||
|
|
||||||
|
// This is where we cache our rendered HTML pages
|
||||||
|
const ssrCache = new LRUCache({
|
||||||
|
max: 100,
|
||||||
|
maxAge: 1000 * 60 * 60 // 1hour
|
||||||
|
})
|
||||||
|
|
||||||
|
app.prepare()
|
||||||
|
.then(() => {
|
||||||
|
const server = express()
|
||||||
|
|
||||||
|
// Use the `renderAndCache` utility defined below to serve pages
|
||||||
|
server.get('/', (req, res) => {
|
||||||
|
renderAndCache(req, res, '/')
|
||||||
|
})
|
||||||
|
|
||||||
|
server.get('/blog/:id', (req, res) => {
|
||||||
|
const queryParams = { id: req.paradms.id }
|
||||||
|
renderAndCache(req, res, '/blog', queryParams)
|
||||||
|
})
|
||||||
|
|
||||||
|
server.get('*', (req, res) => {
|
||||||
|
return handle(req, res)
|
||||||
|
})
|
||||||
|
|
||||||
|
server.listen(3000, (err) => {
|
||||||
|
if (err) throw err
|
||||||
|
console.log('> Ready on http://localhost:3000')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
function renderAndCache (req, res, pagePath, queryParams) {
|
||||||
|
// If we have a page in the cache, let's serve it
|
||||||
|
if (ssrCache.has(req.url)) {
|
||||||
|
console.log(`CACHE HIT: ${req.url}`)
|
||||||
|
res.send(ssrCache.get(req.url))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// If not let's render the page into HTML
|
||||||
|
app.renderToHTML(req, res, pagePath, queryParams)
|
||||||
|
.then((html) => {
|
||||||
|
// Let's cache this page
|
||||||
|
console.log(`CACHE MISS: ${req.url}`)
|
||||||
|
ssrCache.set(req.url, html)
|
||||||
|
|
||||||
|
res.send(html)
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
app.renderError(err, req, res, pagePath, queryParams)
|
||||||
|
})
|
||||||
|
}
|
Loading…
Reference in a new issue