-
Notifications
You must be signed in to change notification settings - Fork 27.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Page.tsx with default and named export fails on build (esLint) #53940
Comments
This is pretty major - makes it impossible to test such functions without moving them out of their context |
Would love to see an option to disable or configure this TypeScript plugin feature. My use case: In order to make it easier to render the interface portion of async server components in tests and Storybook, I would like to follow a pattern like below, but this is prevented by this named export issue: export default async function Controller() {
const claim = await getExampleData()
return <View claim={claim} />
}
export function View(props) {
return <div>{props.claim.id}</div>
}
Example test that this pattern would support: import { View } from "src/app/example/page"
it("passes accessibility scan", () => {
const { container } = render(<View claim={{ id: "123" }} />)
const a11y = await axe(container)
expect(a11y).toHaveNoViolations()
}) Example Storybook story: import { View } from "src/app/example/page"
const story = {
component: View,
args: {
claim: { id: "123" }
}
} |
## Ticket Resolves #66 ## Changes This is purely an architecture migration and nothing functionally should have changed. **Pages Router → App Router**: - `pages/_app.tsx` → `app/[locale]/layout.tsx` - `pages/index.tsx` → `app/[locale]/page.tsx` - `pages/health.tsx` → `app/[locale]/health/page.tsx` - `pages/api/hello.ts` → `app/api/hello/route.tsx` **Internationalized routing and locale detection**: App Router doesn't include built-in support for internationalized routing and locale detection like Pages Router. - Added Next.js Middleware (`src/middleware.ts`) to detect and store the user's preferred language, and routing them to `/es-US/*` when their preferred language is Spanish - Added `i18n/server.ts` to contain server-side configuration for the `next-intl` plugin. This makes locale strings available to all server components ## Context for reviewers - [See the related ADR](https://github.com/navapbc/template-application-nextjs/blob/main/docs/decisions/app/0008-app-router.md) for why we're moving towards App Router. - A page file is restricted in what it can export, hence why `view.tsx` exists instead of that component being colocated in the `page.tsx` file. [More context on this Next.js issue](vercel/next.js#53940 (comment)).
Hello. Also experiencing this. Is there any update? Thanks |
Also affected... could you guys have made a more inscrutable error... seriously... |
This comment has been minimized.
This comment has been minimized.
I'm so close to losing my sh*t with Nextjs |
export default function Page() {
// ...
} Splitting the non default export from the As for why, it doesn’t seem to be mentioned in the docs. https://nextjs.org/docs/app/building-your-application/routing/pages |
Based on the issues you're encountering with Next.js during your build process, it seems you're running into a common problem with Next.js's stricter validation of page exports in version 14. This validation aims to ensure that page files only export React components that are intended to be used as pages, not utility functions or other named exports. You need to tackle this with a precise refactor to align with best practices and address the compilation errors effectively Understanding the Issue Solution: Restructure Exports and Component Organization Separate Utility Functions and Shared Components: |
see also: #56825 |
If this is really the reason, and not a technical requirement, I would strongly encourage that this requirement is removed. It is not 'best practices' that is literally just an opinion. An equally valid opinion is to prefer locality of behavior, which this rule impairs. React itself pushed back against 'best practices' when it was built, and now think of components as concerns, not technologies. Locality of behavior underlies this concept. You may disagree, but it's all opinions. If this export restriction is not a technical requirement, I would prefer to see this error removed. |
I'm observing this in an unexpected setting: the project has |
I was also experiencing this kind of error showing
Then I found out it was due to exporting another function inside page.tsx like that
So, I tried to move that CommentsPage into another file like you did and build then everything fine.
|
Well, there's more. |
same situation. I fixed by using |
Verify canary release
Provide environment information
Operating System: Platform: darwin Arch: arm64 Version: Darwin Kernel Version 22.1.0: Sun Oct 9 20:15:09 PDT 2022; root:xnu-8792.41.9~2/RELEASE_ARM64_T6000 Binaries: Node: 18.14.0 npm: 9.3.1 Yarn: N/A pnpm: N/A Relevant Packages: next: 13.4.14-canary.2 eslint-config-next: 13.4.13 react: 18.2.0 react-dom: 18.2.0 typescript: 5.1.6 Next.js Config: output: N/A
Which area(s) of Next.js are affected? (leave empty if unsure)
App Router, ESLint (eslint-config-next), TypeScript (plugin, built-in types)
Link to the code that reproduces this issue or a replay of the bug
N/a
To Reproduce
Create a page.tsx file in the app dir with a default export for the page, and a named export to represent any util function.
Describe the Bug
Previously I have been able to have named exports in addition to a default export in my page.tsx files.
All of a sudden the above configuration of a page.tsx file now fails on build with the error:
"Type error: Page "pathtopage/page.tsx" does not match the required types of a Next.js Page.
"utilHelper" is not a valid Page export field."
As far as the current build of the site running on vercel suggests, and as the docs state, one should be able to export in this way from any file, including page.tsx.
Expected Behavior
no erros when exporting a named function with a default export from a file
Which browser are you using? (if relevant)
No response
How are you deploying your application? (if relevant)
vercel
The text was updated successfully, but these errors were encountered: