getStaticPaths
When you export a function called getStaticPaths
(Static Site Generation) from a page that uses dynamic routes, Next.js will statically pre-render all the paths specified by getStaticPaths
.
The getStaticPaths API reference covers all parameters and props that can be used with getStaticPaths
.
- The data comes from a headless CMS
- The data comes from a database
- The data comes from the filesystem
- The data can be publicly cached (not user-specific)
- The page must be pre-rendered (for SEO) and be very fast —
getStaticProps
generatesHTML
andJSON
files, both of which can be cached by a CDN for performance
getStaticPaths
will only run during build in production, it will not be called during runtime. You can validate code written inside getStaticPaths
is removed from the client-side bundle with this tool.
getStaticProps
runs duringnext build
for anypaths
returned during buildgetStaticProps
runs in the background when usingfallback: true
getStaticProps
is called before initial render when usingfallback: blocking
- You cannot use
getStaticPaths
with - You can export
getStaticPaths
from a Dynamic Route that also usesgetStaticProps
- You cannot export
getStaticPaths
from non-page file (e.g. yourcomponents
folder) - You must export
getStaticPaths
as a standalone function, and not a property of the page component
Runs on every request in development
In development (next dev
), getStaticPaths
will be called on every request.
You can defer generating all pages on-demand by returning an empty array for paths
. This can be especially helpful when deploying your Next.js application to multiple environments. For example, you can have faster builds by generating all pages on-demand for previews (but not production builds). This is helpful for sites with hundreds/thousands of static pages.
// pages/posts/[id].js
export async function getStaticPaths() {
// When this is true (in preview environments) don't
// prerender any static pages
// (faster builds, but slower initial page load)
if (process.env.SKIP_BUILD_STATIC_GENERATION) {
paths: [],
fallback: 'blocking',
}
// Call an external API endpoint to get posts
const res = await fetch('https://.../posts')
const posts = await res.json()
// Get the paths we want to prerender based on posts
// In production environments, prerender all pages
// (slower builds, but faster initial page load)
const paths = posts.map((post) => ({
params: { id: post.id },
}))
// { fallback: false } means other routes should 404
}
For more information on what to do next, we recommend the following sections: