# nextjs-project-initialization-and-best-practices > This skill provides guidance for initializing and structuring Next.js projects with modern best practices. It covers project setup, component organization, API integration, and development patterns following the specified architecture. - Author: Neha - Repository: neha-haneef115/spec-driven-todo-system - Version: 20260207024541 - Stars: 0 - Forks: 0 - Last Updated: 2026-02-07 - Source: https://github.com/neha-haneef115/spec-driven-todo-system - Web: https://mule.run/skillshub/@@neha-haneef115/spec-driven-todo-system~nextjs-project-initialization-and-best-practices:20260207024541 --- --- name: nextjs-project-initialization-and-best-practices description: This skill provides guidance for initializing and structuring Next.js projects with modern best practices. It covers project setup, component organization, API integration, and development patterns following the specified architecture. --- # Next.js Project Initialization and Best Practices ## Overview This skill provides guidance for initializing and structuring Next.js projects with modern best practices. It covers project setup, component organization, API integration, and development patterns following the specified architecture. ## Project Initialization ### Create Next.js Project Initialize a new Next.js project with the recommended configuration: ```bash npx create-next-app@latest project-name --yes --typescript --tailwind --app --src-dir --turbopack --eslint ``` **Parameters Explanation:** - `--yes`: Skip prompts and use default options - `--typescript`: Include TypeScript support - `--tailwind`: Add Tailwind CSS for styling - `--app`: Use the App Router (app directory) - `--src-dir`: Create a `src` directory - `--turbopack`: Use Turbopack for faster builds (optional) - `--eslint`: Include ESLint for linting ### Important Note on Tailwind CSS v4 With Tailwind CSS v4, there's no need to create a `tailwind.config.ts` file. The configuration is handled automatically. ## ShadCN UI Setup ### Initialize ShadCN After creating the project, initialize ShadCN UI components: ```bash npx shadcn@latest init . ``` ### Add ShadCN Components Add specific components as needed: ```bash npx shadcn@latest add button card formand wha input label textarea select checkbox radio-group ``` ## Component Naming and Organization ### File Naming Convention - All component file names MUST be in kebab-case (e.g., `user-profile.tsx`, not `UserProfile.tsx`) - Use descriptive names that reflect the component's purpose ### Folder Structure - All components MUST be organized in folders - Maintain consistent hierarchy for easy navigation - Group related components together ### Export Convention - All components MUST use named exports using arrow functions (not default exports) - Example: ```tsx // ✅ Correct export const UserProfile = () => { return
Profile Component
; } // ❌ Incorrect export default function UserProfile() { return
Profile Component
; } ``` ## Icon Usage ### Lucide React Icons - All icons MUST be used from `lucide-react` library - Import icons with "Icon" postfix - Example: ```tsx // ✅ Correct import { ChatIcon, UserIcon, HomeIcon } from "lucide-react"; // ❌ Incorrect import { Chat, User, Home } from "lucide-react"; ``` ## State Management and Mutations ### React TanStack Query - All mutations MUST be done using React TanStack Query (React Query) - Use `useMutation` for data modification operations - Use `useQuery` for data fetching operations ### Hook Creation - All hooks MUST be created independently without providers - Hooks should encapsulate specific functionality - Follow the naming convention: `use[FeatureName]` ## Form Handling ### Form Location - Every form MUST be placed in `src/components/forms` folder - Organize forms by feature or purpose - Keep form components separate from UI components ### Form Creation - Forms MUST be created through ShadCN form components - Use Zod schema validation for all forms - Combine ShadCN form components with Zod for robust validation ## Project Structure ### Library Folder (`src/lib`) - All external libraries clients (supabase, stripe, better-auth, etc.) MUST be placed here - Create individual files for each service - Example structure: ``` src/lib/ ├── supabase/ │ ├── client.ts │ └── server.ts ├── stripe/ │ ├── client.ts │ └── server.ts └── better-auth/ ├── client.ts └── server.ts ``` ### Utilities Folder (`src/utils`) - All utility functions (date, time, price, formatting) MUST be placed here - Create specific files for different utility categories - Example structure: ``` src/utils/ ├── shadcn.ts ├── date.ts ├── price.ts ├── format.ts └── validation.ts ``` ### Features Folder (`src/features`) - All business logic (including API calls) MUST be placed here - Organize by feature with consistent structure #### Feature Structure ``` src/features/ ├── auth/ │ ├── hooks.tsx │ ├── queries.ts │ ├── types.ts │ └── schema.ts └── feature-name/ ├── hooks.tsx # Mutation hooks ├── queries.ts # GET queries ├── types.ts # TypeScript interfaces/types └── schema.ts # Zod schemas ``` ## Implementation Patterns ### Minimize Prop Drilling - Components should use hooks directly to access data rather than receiving functions through props - Dialogs and forms should use `use[Feature]` hooks directly instead of receiving callback functions - This reduces prop chains and makes components more self-contained ### Centralized Configurations - Define shared configuration objects (options, display configs) in a central file like `src/features/[feature-name]/config.ts` - Import configurations in components instead of defining them locally to avoid duplication - This ensures consistency and easier maintenance across the application ### Hooks Pattern (`hooks.tsx`) ```tsx import { useMutation, useQuery } from "@tanstack/react-query"; export const useFeature = () => { const addFeature = useMutation({ mutationFn: (data: any) => { // API call implementation }, onSuccess: () => {}, onError: () => {}, }); const updateFeature = useMutation({ mutationFn: (data: any) => {}, onSuccess: () => {}, onError: (error) => {}, }); const deleteFeature = useMutation({ mutationFn: (data: any) => {}, onSuccess: () => {}, onError: (error) => {}, }); const getFeatures = useQuery({ queryKey: ['features'], queryFn: () => { // API call implementation } }); return { addFeature, updateFeature, deleteFeature, getFeatures }; }; ``` ### Schema Pattern (`schema.ts`) ```tsx import { z } from "zod"; export const featureFormSchema = z.object({ id: z.string().optional(), name: z.string().min(1, "Name is required"), description: z.string().optional(), // Add more fields as needed }); export type FeatureFormData = z.infer; ``` ### Types Pattern (`types.ts`) ```tsx export interface Feature { id: string; name: string; description?: string; createdAt: string; updatedAt: string; } ``` ### Queries Pattern (`queries.ts`) ```tsx import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { Feature } from "./types"; const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:3000/api"; export const fetchFeatures = async (): Promise => { const response = await fetch(`${API_BASE_URL}/features`); if (!response.ok) throw new Error("Failed to fetch features"); return response.json(); }; export const createFeature = async (data: Partial) => { const response = await fetch(`${API_BASE_URL}/features`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(data), }); if (!response.ok) throw new Error("Failed to create feature"); return response.json(); }; ``` ## Development Workflow ### File Creation Guidelines - No need to create every file, just create what is needed - Follow the folder structure when adding new features - Maintain consistency across the codebase ### Component Development 1. Create components in appropriate folders 2. Use kebab-case for file names 3. Use named exports for all components 4. Import icons with "Icon" postfix from lucide-react 5. Use ShadCN components for UI elements ### Form Development 1. Place forms in `src/components/forms` folder 2. Use ShadCN form components 3. Apply Zod schema validation 4. Follow the established patterns for form handling ## Common Commands ### Project Setup ```bash # Initialize Next.js project npx create-next-app@latest project-name --yes --typescript --tailwind --app --src-dir --turbopack --eslint # Initialize ShadCN npx shadcn@latest init . # Add specific components npx shadcn@latest add button card form input label textarea ``` ### Development ```bash # Start development server npm run dev # Build for production npm run build # Run linting npm run lint ``` This skill provides a complete guide for setting up and maintaining Next.js projects following the specified architecture and best practices.