Files
next.js/errors/next-prerender-sync-params.mdx
T
Wyatt JohnsonandGitHub 8abbb3dc2e refactor: rename experimental.dynamicIO to experimental.cacheComponents (#81562)
## What?

Rename `experimental.dynamicIO` to `experimental.cacheComponents` across
the Next.js codebase.

## Why?

We're going to be merging the functionality of the `ppr`, `dynamicIO`
and `useCache` experimental flags into the singular `cacheComponents`
flag to reduce complexity of the codebase and simplify adoption for
users wanting to experiment with experimental features.

## How?

- Renamed the configuration option from `experimental.dynamicIO` to
`experimental.cacheComponents`
- Added deprecation handling with automatic migration for the old option
name
- Updated all documentation, tests, and internal references
- Updated Rust code in SWC transforms and Turbopack
- Maintained backward compatibility with deprecation warnings

NAR-158
2025-07-17 19:30:28 -06:00

62 lines
2.7 KiB
Plaintext

---
title: Cannot access Request information synchronously with Page or Layout or Route `params` or Page `searchParams`
---
## Why This Error Occurred
In Next.js 15 `params` passed into Page and Layout components and `searchParams` passed into Page components are now Promises.
To support migrating to the async `params` and `searchParams` Next.js 15 still supports accessing param and searchParam values directly on the Promise object. However when `cacheComponents` is enabled it is an error to do so.
## Possible Ways to Fix It
If you haven't already followed the Next.js 15 upgrade guide which includes running a codemod to auto-convert to the necessary async form of `params` and `searchParams` start there.
[Next 15 Upgrade Guide](/docs/app/guides/upgrading/version-15#async-request-apis-breaking-change)
If you have already run the codemod on your project look for instances of the string `@next-codemod-error` to see where the codemod was unable to convert to the async form. You will have to refactor your code manually here to make it compatible with the new result type.
Before:
```jsx filename=".../some-file.js"
// This component ends up being the Page component even though it is defined outside of
// page.js due to how it is reexported in page.js
export default function ComponentThatWillBeExportedAsPage({ params, searchParams }) {
const { slug } = params;
const { page } = searchParams
return <RenderList slug={slug} page={page}>
}
```
```jsx filename="app/page.js"
// the codemod cannot find the actual Page component so the Page may still have remaining
// synchronous access to params and searchParams
// @next-codemod-error
export * from '.../some-file'
```
After:
```jsx filename=".../some-file.js"
// This component ends up being the Page component even though it is defined outside of
// page.js due to how it is reexported in page.js
export default async function ComponentThatWillBeExportedAsPage({ params, searchParams }) {
const { slug } = await params;
const { page } = await searchParams
return <RenderList slug={slug} page={page}>
}
```
```jsx filename="app/page.js"
export * from '.../some-file'
```
It is unexpected that you would run the codemod and not successfully convert all instances of `params` and `searchParams` to async or have a marker string to help you locate unconverted cases. If you do find yourself in this situation please report this to [Next.js on Github](https://github.com/vercel/next.js/issues).
## Useful Links
- [`page.js` file convention](/docs/app/api-reference/file-conventions/page)
- [`layout.js` file convention](/docs/app/api-reference/file-conventions/layout)
- [`route.js` file convention](/docs/app/api-reference/file-conventions/route)