DEV Community

Bismark
Bismark

Posted on • Edited on

G-Client (Course Management APP) Journal

PART 1

A journey through overcoming compatibility issues, tool setup struggles, and implementing dark mode in a Next.js project.

Navigating the Challenges of Next.js Development

Even though I'm not new to Next.js, setting up some essential tools for my development process was trickier than expected.

Struggles with Shadcn Setup

Shadcn is my favorite component library, but I faced issues when integrating it into my project. My project was using Next.js 15, which is not fully supported by Shadcn yet. During installation, I encountered errors and compatibility warnings.

How I Fixed It:

  • I downgraded my project’s Next.js version to 14 by updating package.json.

  • Reinstalled dependencies using npm install.

  • After that, everything worked smoothly.

Implementing Light and Dark Mode in Next.js
Initially, I struggled with setting up light and dark mode because I wanted a clean and scalable solution. Eventually, I figured it out.

Steps to Implement Dark Mode in Next.js:

  • Create a Theme Provider – This provider will manage the theme state and persist user preferences.

  • Wrap the Provider in Layout – Ensuring it covers the entire application.

  • Suppress Hydration Errors – Using useEffect and suppressHydrationWarning to handle hydration mismatches.

  • Update Tailwind Configuration – Add darkMode: 'class' in tailwind.config.js to allow theme manipulation via CSS classes.

After implementing these steps, the theme switching worked seamlessly across my project.

Final Thoughts

Starting a new project always comes with its set of challenges. However, once the setup hurdles are crossed, the development process becomes much smoother.

If you’re working with Next.js 15 and facing issues with Shadcn or dark mode implementation, I hope my experience helps you!

PART 2

Understanding Request and NextRequest in Next.js API Routes

Introduction

In Next.js API routes, the NextRequest object extends the default Request object, providing enhanced capabilities for handling incoming requests. With NextRequest, you gain easier access to cookies, request metadata, and a structured nextUrl object for parsing URLs efficiently.

*Differences Between Request and NextRequest
*

The standard Request object is suitable for handling basic HTTP requests, while NextRequest offers additional utilities tailored for Next.js middleware and API routes.

Example: Using Request

export async function GET(req: Request) {
    const body = await req.json();
    return new Response(JSON.stringify({ message: 'Request received' }), {
        status: 200,
        headers: { 'Content-Type': 'application/json' },
    });
}
Enter fullscreen mode Exit fullscreen mode

Example: Using NextRequest

import { NextRequest, NextResponse } from 'next/server';

export async function GET(req: NextRequest) {
    const body = await req.json();
    const pathname = req.nextUrl.pathname;
    const searchParams = req.nextUrl.searchParams;
    const clientIp = req.ip;
    const cookies = req.cookies.getAll();

    return NextResponse.json({ 
        message: `Received data: ${JSON.stringify(body)}`,
        path: pathname,
        query: Object.fromEntries(searchParams),
        ip: clientIp,
        cookies: cookies,
    });
}
Enter fullscreen mode Exit fullscreen mode

When to Use Each

  • Use Request for basic API handling when additional Next.js-specific utilities are not needed.

  • Use NextRequest when working with middleware, edge functions, or when you need structured URL parsing and request metadata.

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more