Opinionated frontend development standards for modern React + TypeScript applications. Covers Suspense-first data fetching, lazy loading, feature-based architecture, MUI v7 styling, TanStack Router, performance optimization, and strict TypeScript practices.
67
67%
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Passed
No known issues
TanStack Router implementation with folder-based routing and lazy loading patterns.
TanStack Router with file-based routing:
routes/
__root.tsx # Root layout
index.tsx # Home route (/)
posts/
index.tsx # /posts
create/
index.tsx # /posts/create
$postId.tsx # /posts/:postId (dynamic)
comments/
index.tsx # /commentsPattern:
index.tsx = Route at that path$param.tsx = Dynamic parameter/**
* Posts route component
* Displays the main blog posts list
*/
import { createFileRoute } from '@tanstack/react-router';
import { lazy } from 'react';
// Lazy load the page component
const PostsList = lazy(() =>
import('@/features/posts/components/PostsList').then(
(module) => ({ default: module.PostsList }),
),
);
export const Route = createFileRoute('/posts/')({
component: PostsPage,
// Define breadcrumb data
loader: () => ({
crumb: 'Posts',
}),
});
function PostsPage() {
return (
<PostsList
title='All Posts'
showFilters={true}
/>
);
}
export default PostsPage;Key Points:
createFileRoute with route pathloader for breadcrumb dataimport { lazy } from 'react';
// For named exports, use .then() to map to default
const MyPage = lazy(() =>
import('@/features/my-feature/components/MyPage').then(
(module) => ({ default: module.MyPage })
)
);import { lazy } from 'react';
// For default exports, simpler syntax
const MyPage = lazy(() => import('@/features/my-feature/components/MyPage'));export const Route = createFileRoute('/my-route/')({
component: MyRoutePage,
});
function MyRoutePage() {
return <div>My Route Content</div>;
}export const Route = createFileRoute('/my-route/')({
component: MyRoutePage,
loader: () => ({
crumb: 'My Route Title',
}),
});Breadcrumb appears in navigation/app bar automatically.
export const Route = createFileRoute('/my-route/')({
component: MyRoutePage,
loader: async () => {
// Can prefetch data here
const data = await api.getData();
return { crumb: 'My Route', data };
},
});export const Route = createFileRoute('/search/')({
component: SearchPage,
validateSearch: (search: Record<string, unknown>) => {
return {
query: (search.query as string) || '',
page: Number(search.page) || 1,
};
},
});
function SearchPage() {
const { query, page } = Route.useSearch();
// Use query and page
}// routes/users/$userId.tsx
export const Route = createFileRoute('/users/$userId')({
component: UserPage,
});
function UserPage() {
const { userId } = Route.useParams();
return <UserProfile userId={userId} />;
}// routes/posts/$postId/comments/$commentId.tsx
export const Route = createFileRoute('/posts/$postId/comments/$commentId')({
component: CommentPage,
});
function CommentPage() {
const { postId, commentId } = Route.useParams();
return <CommentEditor postId={postId} commentId={commentId} />;
}import { useNavigate } from '@tanstack/react-router';
export const MyComponent: React.FC = () => {
const navigate = useNavigate();
const handleClick = () => {
navigate({ to: '/posts' });
};
return <Button onClick={handleClick}>View Posts</Button>;
};const handleNavigate = () => {
navigate({
to: '/users/$userId',
params: { userId: '123' },
});
};const handleSearch = () => {
navigate({
to: '/search',
search: { query: 'test', page: 1 },
});
};import { createRootRoute, Outlet } from '@tanstack/react-router';
import { Box } from '@mui/material';
import { CustomAppBar } from '~components/CustomAppBar';
export const Route = createRootRoute({
component: RootLayout,
});
function RootLayout() {
return (
<Box>
<CustomAppBar />
<Box sx={{ p: 2 }}>
<Outlet /> {/* Child routes render here */}
</Box>
</Box>
);
}// routes/dashboard/index.tsx
export const Route = createFileRoute('/dashboard/')({
component: DashboardLayout,
});
function DashboardLayout() {
return (
<Box>
<DashboardSidebar />
<Box sx={{ flex: 1 }}>
<Outlet /> {/* Nested routes */}
</Box>
</Box>
);
}/**
* User profile route
* Path: /users/:userId
*/
import { createFileRoute } from '@tanstack/react-router';
import { lazy } from 'react';
import { SuspenseLoader } from '~components/SuspenseLoader';
// Lazy load heavy component
const UserProfile = lazy(() =>
import('@/features/users/components/UserProfile').then(
(module) => ({ default: module.UserProfile })
)
);
export const Route = createFileRoute('/users/$userId')({
component: UserPage,
loader: () => ({
crumb: 'User Profile',
}),
});
function UserPage() {
const { userId } = Route.useParams();
return (
<SuspenseLoader>
<UserProfile userId={userId} />
</SuspenseLoader>
);
}
export default UserPage;Routing Checklist:
routes/my-route/index.tsxReact.lazy(() => import())createFileRoute with route pathloader functionSuspenseLoader for loading statesRoute.useParams() for dynamic paramsuseNavigate() for programmatic navigationSee Also: