UNPKG

agent-rules-kit

Version:

CLI tool to bootstrap AI agent rules for multiple IDEs and frameworks. Generates optimized rules for Cursor, VS Code, Claude, and 6+ other AI coding assistants.

135 lines (92 loc) 5.53 kB
--- description: State management concepts and approaches in Next.js applications globs: <root>/src/**/*.{ts,tsx,js,jsx}, <root>/app/**/*.{ts,tsx,js,jsx}, <root>/pages/**/*.{ts,tsx,js,jsx} alwaysApply: true --- # State Management in Next.js Applications This document outlines common conceptual approaches to state management in Next.js applications in {projectPath}. Next.js provides unique considerations for state management due to its server-side rendering capabilities. ## Next.js Specific Considerations ### 1. Server-Side Rendering (SSR) Impact - **Hydration**: State must be serializable and match between server and client. - **Initial State**: Can be populated from server-side data fetching methods. - **Client-Server Sync**: Ensure state consistency during hydration process. ### 2. Data Fetching Integration - **getServerSideProps**: Fetch data on each request, good for dynamic content. - **getStaticProps**: Fetch data at build time, good for static content. - **App Router**: Use Server Components and Client Components appropriately. - **API Routes**: Built-in API endpoints for data mutations. ## State Management Approaches ### 1. React Built-in State - **useState**: For component-local state that doesn't need to persist. - **useReducer**: For complex state logic within components. - **useContext**: For sharing state across component tree without prop drilling. - **Pros**: No additional dependencies, works seamlessly with SSR. - **Cons**: Limited to component scope, no persistence across navigation. ### 2. Zustand - **Concept**: Lightweight state management with minimal boilerplate. - **Next.js Integration**: Excellent SSR support, works with both App and Pages Router. - **Features**: Simple API, TypeScript support, middleware support. - **Use When**: You need simple global state without complex requirements. ### 3. Redux Toolkit (RTK) - **Concept**: Modern Redux with less boilerplate and better DevTools. - **Next.js Integration**: Requires careful setup for SSR, use next-redux-wrapper. - **Features**: Powerful DevTools, time-travel debugging, extensive ecosystem. - **Use When**: Complex state logic, need for debugging tools, large team. ### 4. Jotai - **Concept**: Atomic state management with bottom-up approach. - **Next.js Integration**: Good SSR support, works well with React Suspense. - **Features**: Fine-grained reactivity, composable atoms. - **Use When**: You prefer atomic state management over global stores. ### 5. Valtio - **Concept**: Proxy-based state management with mutation-based API. - **Next.js Integration**: Works well with SSR when used correctly. - **Features**: Mutable API, automatic optimization. - **Use When**: You prefer mutable state updates over immutable patterns. ## Server State Management ### 1. SWR - **Concept**: Data fetching library with caching, revalidation, and error handling. - **Next.js Integration**: Excellent integration, built by Vercel team. - **Features**: Automatic revalidation, optimistic updates, offline support. - **Use When**: You need robust data fetching with caching. ### 2. React Query (TanStack Query) - **Concept**: Powerful data fetching and caching library. - **Next.js Integration**: Requires hydration setup for SSR. - **Features**: Advanced caching strategies, background refetching, optimistic updates. - **Use When**: Complex data fetching requirements, need advanced caching. ### 3. Apollo Client - **Concept**: GraphQL client with integrated state management. - **Next.js Integration**: Good SSR support with proper setup. - **Features**: GraphQL integration, normalized caching, real-time subscriptions. - **Use When**: Using GraphQL, need normalized caching. ## Best Practices ### SSR Considerations - **Serializable State**: Ensure all state can be serialized for SSR. - **Hydration Mismatch**: Avoid state that differs between server and client. - **Initial State**: Use data fetching methods to populate initial state. ### App Router vs Pages Router - **App Router**: Prefer Server Components for data fetching, use Client Components for interactivity. - **Pages Router**: Use getServerSideProps/getStaticProps for initial data. - **State Persistence**: Consider different approaches for each router type. ### Performance Optimization - **Code Splitting**: Split state management code when possible. - **Selective Updates**: Use fine-grained state updates to minimize re-renders. - **Memoization**: Use React.memo, useMemo, and useCallback appropriately. ## Recommendations ### For Simple Applications - Use **React built-in state** (useState, useContext) - Use **SWR** for server state management - Keep state close to where it's used ### For Medium Applications - Use **Zustand** for client state management - Use **SWR** or **React Query** for server state - Implement proper error boundaries ### For Complex Applications - Use **Redux Toolkit** for complex client state - Use **React Query** for advanced server state management - Implement proper state persistence strategies - Consider state machines for complex workflows ### For Real-time Applications - Use **Apollo Client** with GraphQL subscriptions - Consider **Zustand** with WebSocket integration - Implement optimistic updates for better UX Remember that the choice of state management should align with your application's complexity, team expertise, and performance requirements.