Styling in Next.js – Tailwind, CSS Modules, Global Styles, and CSS Ordering

Next.js offers multiple ways to style your application, including Tailwind CSS, CSS Modules, global stylesheets, external packages, Sass, and CSS-in-JS. This article walks through how to set up each method, manage stylesheet ordering, and understand the differences between development and production behavior.

Tailwind CSSCSS ModulesGlobal CSScssChunking

~2 دقیقه مطالعه · آخرین به‌روزرسانی ۳ آبان ۱۴۰۴

Tailwind CSS


Tailwind is a utility-first CSS framework offering low-level classes for custom design.


Install it:

pnpm add -D tailwindcss @tailwindcss/postcss

Configure postcss.config.mjs:

export default {
  plugins: {
    '@tailwindcss/postcss': {},
  },
}

Import Tailwind in app/globals.css:

@import 'tailwindcss';

Then import globals.css in your root layout:

import './globals.css'

Now you can use Tailwind classes:

<h1 className="text-4xl font-bold">Welcome to Next.js!</h1>

CSS Modules


CSS Modules scope styles locally to avoid naming conflicts. Create a file with .module.css:

// app/blog/blog.module.css
.blog {
  padding: 24px;
}

// app/blog/page.tsx
import styles from './blog.module.css'
<main className={styles.blog}></main>

Global CSS


Use global styles for base layout and typography. Create app/global.css and import it in your layout:

// app/global.css
body {
  padding: 20px 20px 60px;
  max-width: 680px;
  margin: 0 auto;
}

// app/layout.tsx
import './global.css'

Tip: Use global styles only for truly global rules. Use Tailwind or CSS Modules for component-specific styling.


External Stylesheets


You can import styles from external packages like Bootstrap:

import 'bootstrap/dist/css/bootstrap.css'

In React 19, you can also use <link rel="stylesheet" />.


Ordering and Merging


Next.js merges and chunks CSS during production builds. The order of imports determines the final CSS order:

// page.tsx
import { BaseButton } from './base-button'
import styles from './page.module.css'

base-button.module.css will be loaded before page.module.css.


Best Practices


  • Keep CSS imports in a single entry file
  • Import global and Tailwind styles in the root layout
  • Use Tailwind for most styling needs
  • Use CSS Modules for scoped component styles
  • Use consistent naming like name.module.css
  • Extract shared styles into reusable components
  • Disable auto-sorting of imports in linters like ESLint

Development vs Production


  • Development: Fast Refresh applies CSS instantly
  • Production: CSS is minified and code-split for optimal loading
  • CSS loads even if JavaScript is disabled in production
  • CSS order may differ in dev vs build — always test with next build

نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

Advanced Client-Side Routing and Performance Hooks in Next.js

Next.js provides a rich set of client-side hooks and caching utilities that empower developers to build dynamic, responsive, and secure applications. From reading route parameters to tracking navigation state and reporting performance metrics, this guide walks you through the most important tools available in the App Router.

ادامه

Handling Authorization and Caching in Next.js: A Developer’s Guide

Next.js introduces powerful experimental features for access control and smart caching. This guide covers the unauthorized() function for custom 401 handling, unstable_cache for persistent memoization, updateTag for instant cache invalidation, and useLinkStatus for inline navigation feedback. Learn how to use these tools to build secure, performant, and responsive applications.

ادامه

redirect and refresh in Next.js — Smart Redirects and Client Refreshing via Server Actions

The redirect function in Next.js allows you to navigate users to a new route, returning either a 307 or 303 HTTP response depending on context. It works in Server Components, Client Components, Route Handlers, and Server Actions. The refresh function is used exclusively within Server Actions to refresh the client router. This article explains how both functions work, with practical examples and key considerations.

ادامه

NextRequest and NextResponse in Next.js — Managing Cookies, Headers, Redirects, and Rewrites

Next.js extends the native Web Request and Response APIs with NextRequest and NextResponse, offering powerful tools for managing cookies, headers, redirects, rewrites, and JSON responses. These utilities simplify server-side logic and improve control over routing, personalization, and security. This guide walks through their capabilities with practical examples and best practices.

ادامه

headers, ImageResponse, notFound, and permanentRedirect in Next.js — Request Handling, Dynamic Images, Errors, and Redirects

Next.js offers powerful tools for handling HTTP requests and responses in Server Components. The headers function lets you read incoming request headers. ImageResponse allows you to generate dynamic images using JSX and CSS. The notFound function renders a custom 404 page, and permanentRedirect enables permanent redirection to another route. This article explains how to use each feature with practical examples.

ادامه

A Complete Guide to Using metadata and generateMetadata in Next.js

In modern versions of Next.js, managing page metadata is more powerful and intuitive than ever. Metadata is automatically injected into the <head> of your pages and plays a vital role in SEO, social sharing, and user experience. This guide explains the two main ways to define metadata: using the static metadata object and the dynamic generateMetadata function.

ادامه