| name | optimize-react-component |
| description | Optimize React components for performance following Next.js 15 and project best practices |
When optimizing React components in this Next.js 15 dashboard:
-
Choose the right component type:
- Default to Server Components (no "use client")
- Use Client Components only when needed:
- Using React hooks (useState, useEffect, useContext)
- Using browser APIs (localStorage, window)
- Using event handlers (onClick, onChange)
- Using libraries that require client-side execution
-
Minimize client-side JavaScript:
export default function StaticContent() {
return <div>Content</div>;
}
"use client";
export default function InteractiveContent() {
const [state, setState] = useState(false);
return <div onClick={() => setState(!state)}>Content</div>;
}
-
Optimize re-renders with React.memo and useMemo:
import { memo, useMemo } from "react";
const ExpensiveComponent = memo(function ExpensiveComponent({ data }) {
const processedData = useMemo(() => {
return data.map(item => expensiveOperation(item));
}, [data]);
return <div>{processedData}</div>;
});
-
Use dynamic imports for large components:
import dynamic from "next/dynamic";
const HeavyChart = dynamic(() => import("@/components/HeavyChart"), {
loading: () => <p>Loading chart...</p>,
ssr: false
});
-
Optimize images with next/image:
import Image from "next/image";
<Image
src="/image.png"
alt="Description"
width={500}
height={300}
priority // For above-the-fold images
/>
-
Prevent unnecessary effect executions:
useEffect(() => {
fetchData(id);
}, [id]);
useEffect(() => {
const subscription = subscribe();
return () => subscription.unsubscribe();
}, []);
-
Type safety for better performance:
- Use explicit TypeScript interfaces
- Avoid
any type
- Enable strict mode in tsconfig.json
-
Component splitting:
- Keep components focused on single responsibility
- Extract reusable logic to custom hooks
- Split large components into smaller ones
-
Leverage Turbopack (Next.js 15):
- Use
npm run dev which automatically uses Turbopack
- Faster builds and hot module replacement
Examples
Convert client component to server component
"use client";
export default function StaticCard() {
return <Card>Static Content</Card>;
}
export default function StaticCard() {
return <Card>Static Content</Card>;
}
Optimize chart rendering
"use client";
import { memo, useMemo } from "react";
import { LineChart, Line } from "recharts";
export const OptimizedChart = memo(function OptimizedChart({ data }) {
const colors = useChartColors();
const chartData = useMemo(() => {
return data.map(item => ({
name: item.label,
value: item.total
}));
}, [data]);
return (
<LineChart data={chartData}>
<Line dataKey="value" stroke={colors.chart1} />
</LineChart>
);
});
Split a large component
export default function Dashboard() {
return (
<div>
<Header />
<Stats />
<Charts />
<Footer />
</div>
);
}
export default function Dashboard() {
return (
<div>
<DashboardHeader />
<DashboardStats />
<DashboardCharts />
<DashboardFooter />
</div>
);
}
Related Files
next.config.ts
tsconfig.json
src/components/DashboardCharts.tsx
Related Skills
create-dashboard-page
add-chart