Async React components are only valid within React Server Components.
In TanStack Start, that means async components must only be used in server-component context, for example:
This rule helps you catch async components that have become "client" (directly or transitively), which would otherwise crash at runtime.
Examples of incorrect code for this rule:
/* eslint "@tanstack/start/no-async-client-component": "error" */
import { createFileRoute } from '@tanstack/react-router'
export async function Page() {
return <div />
}
export const Route = createFileRoute(undefined)({
component: Page,
})/* eslint "@tanstack/start/no-async-client-component": "error" */
import { createFileRoute } from '@tanstack/react-router'
export async function Page() {
return <div />
}
export const Route = createFileRoute(undefined)({
component: Page,
})Examples of correct code for this rule:
/* eslint "@tanstack/start/no-async-client-component": "error" */
import { createFileRoute } from '@tanstack/react-router'
export function Page() {
return <div />
}
export const Route = createFileRoute(undefined)({
component: Page,
})/* eslint "@tanstack/start/no-async-client-component": "error" */
import { createFileRoute } from '@tanstack/react-router'
export function Page() {
return <div />
}
export const Route = createFileRoute(undefined)({
component: Page,
})/* eslint "@tanstack/start/no-async-client-component": "error" */
import { createCompositeComponent } from '@tanstack/react-start/rsc'
export const ServerPage = createCompositeComponent(async () => {
const message = await Promise.resolve('hello')
return <div>{message}</div>
})/* eslint "@tanstack/start/no-async-client-component": "error" */
import { createCompositeComponent } from '@tanstack/react-start/rsc'
export const ServerPage = createCompositeComponent(async () => {
const message = await Promise.resolve('hello')
return <div>{message}</div>
})This rule can report in two ways: