Some checks failed
Test examples / Test Examples (20) (push) Has been cancelled
Test examples / Test Examples (22) (push) Has been cancelled
Lock Threads / action (push) Has been cancelled
Trigger Release / start (push) Has been cancelled
Stale issue handler / stale (push) Has been cancelled
Update Font Data / create-pull-request (push) Has been cancelled
build-and-deploy / deploy-target (push) Has been cancelled
build-and-deploy / build (push) Has been cancelled
build-and-deploy / stable - aarch64-unknown-linux-musl - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-unknown-linux-musl - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-unknown-linux-gnu - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-unknown-linux-gnu - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-pc-windows-msvc - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-pc-windows-msvc - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-apple-darwin - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-apple-darwin - node@16 (push) Has been cancelled
build-and-deploy / build-wasm (nodejs) (push) Has been cancelled
build-and-deploy / build-wasm (web) (push) Has been cancelled
build-and-deploy / Deploy preview tarball (push) Has been cancelled
build-and-deploy / Potentially publish release (push) Has been cancelled
build-and-deploy / publish-turbopack-npm-packages (push) Has been cancelled
build-and-deploy / Deploy examples (push) Has been cancelled
build-and-deploy / thank you, build (push) Has been cancelled
build-and-deploy / Upload Turbopack Bytesize metrics to Datadog (push) Has been cancelled
Rspack Next.js development integration tests / Rspack integration tests (push) Has been cancelled
Rspack Next.js production integration tests / Rspack integration tests (push) Has been cancelled
Turbopack Next.js development integration tests / Next.js integration tests (push) Has been cancelled
Turbopack Next.js production integration tests / Next.js integration tests (push) Has been cancelled
Update Rspack test manifest / Update and upload Rspack development test manifest (push) Has been cancelled
Update Rspack test manifest / Update and upload Rspack production test manifest (push) Has been cancelled
Upload bundler test manifests to areweturboyet.com / Upload test results (push) Has been cancelled
Update React / create-pull-request (push) Has been cancelled
test-e2e-project-reset-cron / reset-test-project (push) Has been cancelled
Notify about the top 15 issues/PRs/feature requests (most reacted) in the last 90 days / run (push) Has been cancelled
79 lines
3.2 KiB
Plaintext
79 lines
3.2 KiB
Plaintext
---
|
|
title: Empty generateStaticParams with Cache Components
|
|
---
|
|
|
|
## Why This Error Occurred
|
|
|
|
You're using [Cache Components](https://nextjs.org/docs/app/getting-started/caching) in your Next.js application, and one of your `generateStaticParams` functions returned an empty array, which causes a build error.
|
|
|
|
When Cache Components is enabled, Next.js performs build-time validation to ensure your routes can be properly prerendered without runtime dynamic access errors. If `generateStaticParams` returns an empty array, Next.js cannot validate that your route won't access dynamic values (like `await cookies()`, `await headers()`, or `await searchParams`) at runtime, which would cause errors.
|
|
|
|
This strict requirement ensures:
|
|
|
|
- Build-time validation catches potential runtime errors early
|
|
- All routes using Cache Components have at least one static variant to validate against
|
|
- You don't accidentally deploy routes that will fail at runtime
|
|
|
|
## Possible Ways to Fix It
|
|
|
|
### Option 1: Return at least one static param
|
|
|
|
Modify your `generateStaticParams` function to return at least one set of parameters. This is the most common fix and allows build-time validation to work properly.
|
|
|
|
```tsx filename="app/blog/[slug]/page.tsx"
|
|
// This will cause an error with Cache Components
|
|
export async function generateStaticParams() {
|
|
return [] // Empty array not allowed
|
|
}
|
|
|
|
// Return at least one sample param
|
|
export async function generateStaticParams() {
|
|
return [{ slug: 'hello-world' }, { slug: 'getting-started' }]
|
|
}
|
|
```
|
|
|
|
These samples serve dual purposes:
|
|
|
|
1. **Build-time validation**: Verify your route structure is safe
|
|
2. **Prerendering**: Generate instant-loading pages for popular routes
|
|
|
|
The build process only validates code paths that execute with your sample params. If runtime parameters trigger conditional logic that renders branches accessing runtime APIs (like `cookies()`) without Suspense, or dynamic content without Suspense or `use cache`, those will cause runtime errors.
|
|
|
|
### Option 2: Use a placeholder param
|
|
|
|
If you don't know actual values at build time, you can use a placeholder for validation. However, this defeats the purpose of build-time validation and should be avoided:
|
|
|
|
```tsx filename="app/blog/[slug]/page.tsx"
|
|
export async function generateStaticParams() {
|
|
// Placeholder only validates one code path
|
|
return [{ slug: '__placeholder__' }]
|
|
}
|
|
|
|
export default async function Page({
|
|
params,
|
|
}: {
|
|
params: Promise<{ slug: string }>
|
|
}) {
|
|
const { slug } = await params
|
|
|
|
// Handle placeholder case
|
|
if (slug === '__placeholder__') {
|
|
notFound()
|
|
}
|
|
|
|
// Real params may trigger code paths
|
|
// that access dynamic APIs incorrectly, causing
|
|
// runtime errors that cannot be caught by error boundaries
|
|
const post = await getPost(slug)
|
|
return <div>{post.title}</div>
|
|
}
|
|
```
|
|
|
|
Using placeholders provides minimal build-time validation and increases the risk of runtime errors for actual parameter values.
|
|
|
|
## Useful Links
|
|
|
|
- [Cache Components Documentation](https://nextjs.org/docs/app/getting-started/caching)
|
|
- [generateStaticParams API Reference](https://nextjs.org/docs/app/api-reference/functions/generate-static-params)
|
|
- [Dynamic Routes with Cache Components](/docs/app/api-reference/file-conventions/dynamic-routes#with-cache-components)
|