Static Site Generation (SSG)
Examples
- WordPress Example(Demo)
- Blog Starter using markdown files (Demo)
- DatoCMS Example (Demo)
- TakeShape Example (Demo)
- Sanity Example (Demo)
- Prismic Example (Demo)
- Contentful Example (Demo)
- Strapi Example (Demo)
- Prepr Example (Demo)
- Agility CMS Example (Demo)
- Cosmic Example (Demo)
- ButterCMS Example (Demo)
- Storyblok Example (Demo)
- GraphCMS Example (Demo)
- Kontent Example (Demo)
- Builder.io Example (Demo)
- TinaCMS Example (Demo)
- Static Tweet (Demo)
- Enterspeed Example (Demo)
If a page uses Static Generation, the page HTML is generated at build time. That means in production, the page HTML is generated when you run next build
. This HTML will then be reused on each request. It can be cached by a CDN.
In Next.js, you can statically generate pages with or without data. Let's take a look at each case.
Static Generation without data
By default, Next.js pre-renders pages using Static Generation without fetching data. Here's an example:
Note that this page does not need to fetch any external data to be pre-rendered. In cases like this, Next.js generates a single HTML file per page during build time.
Static Generation with data
Some pages require fetching external data for pre-rendering. There are two scenarios, and one or both might apply. In each case, you can use these functions that Next.js provides:
- Your page content depends on external data: Use
getStaticProps
. - Your page paths depend on external data: Use
getStaticPaths
(usually in addition togetStaticProps
).
Scenario 1: Your page content depends on external data
Example: Your blog page might need to fetch the list of blog posts from a CMS (content management system).
To fetch this data on pre-render, Next.js allows you to export
an async
function called getStaticProps
from the same file. This function gets called at build time and lets you pass fetched data to the page's props
on pre-render.
To learn more about how getStaticProps
works, check out the Data Fetching documentation.
Scenario 2: Your page paths depend on external data
Next.js allows you to create pages with dynamic routes. For example, you can create a file called pages/posts/[id].js
to show a single blog post based on id
. This will allow you to show a blog post with id: 1
when you access posts/1
.
To learn more about dynamic routing, check the Dynamic Routing documentation.
However, which id
you want to pre-render at build time might depend on external data.
Example: suppose that you've only added one blog post (with id: 1
) to the database. In this case, you'd only want to pre-render posts/1
at build time.
Later, you might add the second post with id: 2
. Then you'd want to pre-render posts/2
as well.
So your page paths that are pre-rendered depend on external data. To handle this, Next.js lets you export
an async
function called getStaticPaths
from a dynamic page (pages/posts/[id].js
in this case). This function gets called at build time and lets you specify which paths you want to pre-render.
Also in pages/posts/[id].js
, you need to export getStaticProps
so that you can fetch the data about the post with this id
and use it to pre-render the page:
To learn more about how getStaticPaths
works, check out the Data Fetching documentation.
When should I use Static Generation?
We recommend using Static Generation (with and without data) whenever possible because your page can be built once and served by CDN, which makes it much faster than having a server render the page on every request.
You can use Static Generation for many types of pages, including:
- Marketing pages
- Blog posts and portfolios
- E-commerce product listings
- Help and documentation
You should ask yourself: "Can I pre-render this page ahead of a user's request?" If the answer is yes, then you should choose Static Generation.
On the other hand, Static Generation is not a good idea if you cannot pre-render a page ahead of a user's request. Maybe your page shows frequently updated data, and the page content changes on every request.
In cases like this, you can do one of the following:
- Use Static Generation with Client-side data fetching: You can skip pre-rendering some parts of a page and then use client-side JavaScript to populate them. To learn more about this approach, check out the Data Fetching documentation.
- Use Server-Side Rendering: Next.js pre-renders a page on each request. It will be slower because the page cannot be cached by a CDN, but the pre-rendered page will always be up-to-date. We'll talk about this approach below.