Jak skonfigurować projekt Next.js z TypeScript i Tailwind od zera
Praktyczny przewodnik konfiguracji Next.js 16 z TypeScript i Tailwind CSS v4. Struktura folderów, aliasy, linting i sensowne ustawienia startowe bez zbędnego balastu.
Zaczynasz nowy projekt i chcesz użyć Next.js z TypeScript i Tailwind CSS? Dobry wybór — to stack, który sam stosuję w większości projektów komercyjnych. Szybki, typowany, z doskonałym developer experience.
W tym tutorialu przeprowadzę Cię przez konfigurację od zera. Nie tylko uruchomienie create-next-app, ale też sensowna struktura folderów, aliasy importów, formatowanie kodu i kilka ustawień, które oszczędzą Ci problemów w przyszłości.
Krótka odpowiedź: Stwórz projekt przez create-next-app z TypeScript, ESLint, Tailwind CSS, katalogiem src/ i App Routerem, a następnie dodaj alias @/*, skonfiguruj Prettier z pluginem do sortowania klas Tailwind oraz przemyślaną strukturę folderów (components/ui, components/features, lib, hooks, types, utils). Kluczowe narzędzia to helper cn() łączący clsx i tailwind-merge oraz next/font do optymalnego ładowania fontów. Taki setup daje solidną bazę pod projekty komercyjne bez zbędnego balastu.
Wymagania wstępne
Zanim zaczniemy, upewnij się, że masz:
Node.js 20.9 lub nowszy (sprawdź: node -v)
npm, yarn lub pnpm
Edytor kodu (polecam VS Code z rozszerzeniami Tailwind CSS IntelliSense i ES7+ React)
Krok 1: Tworzenie projektu
Najszybszy sposób to oficjalne CLI Next.js:
Code
npx create-next-app@latest moj-projekt
Kreator zada kilka pytań. Oto moje rekomendowane odpowiedzi:
Code
✔ Would you like to use TypeScript? Yes
✔ Would you like to use ESLint? Yes
✔ Would you like to use Tailwind CSS? Yes
✔ Would you like to use `src/` directory? Yes
✔ Would you like to use App Router? Yes
✔ Would you like to customize the default import alias? Yes
What import alias would you like configured? @/*
Dlaczego te wybory?
TypeScript — bezpieczeństwo typów, lepsze autouzupełnianie, mniej bugów
ESLint — wyłapuje błędy i wymusza spójny styl
Tailwind CSS — szybkie stylowanie bez pisania CSS
src/ directory — oddziela kod źródłowy od plików konfiguracyjnych
components/features/ — złożone komponenty specyficzne dla projektu
lib/ — konfiguracje zewnętrznych bibliotek, klienty API, czyli Application Programming Interface, definiuje sposób komunikacji między aplikacjami lub modułami.
utils/ — czyste funkcje (formatowanie dat, walidacja, cn() dla Tailwinda)
Krok 3: Konfiguracja TypeScript
Plik tsconfig.json jest już skonfigurowany, ale warto dodać kilka opcji:
strict: true — włącza wszystkie ścisłe sprawdzenia TypeScript
paths — alias @/* mapuje na folder src/
Teraz zamiast:
Code
import { Button } from '../../../components/ui/Button'
Piszesz:
Code
import { Button } from '@/components/ui/Button'
Krok 4: Konfiguracja Tailwind CSS
Tailwind CSS v4 przenosi sporą część konfiguracji z tailwind.config.ts do CSS. W prostych projektach plik konfiguracyjny nie jest już potrzebny, a cała konfiguracja trafia do src/app/globals.css:
Klasy niestandardowe (np. bg-brand-600, font-sans) działają od razu po zdefiniowaniu zmiennych w @theme. Tailwind v4 automatycznie wykrywa pliki do skanowania — nie trzeba konfigurować tablicy content.
Jeśli używasz Tailwind CSS v4, upewnij się też, że PostCSS jest skonfigurowany pod nowy plugin:
import { clsx, type ClassValue } from 'clsx'import { twMerge } from 'tailwind-merge'export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs))}
Plugin prettier-plugin-tailwindcss automatycznie sortuje klasy Tailwind w zalecanej kolejności. Więcej o Tailwind znajdziesz w artykule 10 trików, które przyspieszą Twoją pracę.
W nowych projektach Next.js używa flat config. Zamiast starego .eslintrc.json edytujesz eslint.config.mjs:
Code
// eslint.config.mjsimport { defineConfig, globalIgnores } from 'eslint/config'import nextVitals from 'eslint-config-next/core-web-vitals'import prettierConfig from 'eslint-config-prettier'export default defineConfig([ ...nextVitals, prettierConfig, { rules: { 'react/no-unescaped-entities': 'off', }, }, globalIgnores(['.next/**', 'out/**', 'build/**', 'next-env.d.ts']),])
Next.js ma wbudowaną optymalizację fontów. Skonfiguruj w głównym layoucie:
Code
// src/app/layout.tsximport type { Metadata } from 'next'import { Inter } from 'next/font/google'import './globals.css'const inter = Inter({ subsets: ['latin', 'latin-ext'], variable: '--font-inter',})export const metadata: Metadata = { title: { default: 'Mój Projekt', template: '%s | Mój Projekt', }, description: 'Opis projektu dla wyszukiwarek',}export default function RootLayout({ children,}: { children: React.ReactNode}) { return ( <html lang="pl" className={inter.variable}> <body className="font-sans">{children}</body> </html> )}
Font jest ładowany optymalnie, bez CLS, czyli Cumulative Layout Shift, mierzy nieoczekiwane przesunięcia elementów podczas ładowania strony. i z automatycznym preloadem.
Krok 8: Przykładowy komponent
Stwórzmy prosty komponent Button, żeby sprawdzić, czy wszystko działa:
Otwórz http://localhost:3000. Powinieneś zobaczyć stronę z trzema przyciskami w różnych wariantach.
Sprawdź też:
Code
npm run lint # ESLintnpm run format # Prettiernpm run build # Produkcyjny build
Jeśli wszystko przechodzi bez błędów, projekt jest gotowy do rozwoju.
FAQ
Czy muszę używać katalogu src/ w Next.js?
Nie jest to obowiązkowe, ale bardzo zalecane. Katalog src/ oddziela kod źródłowy od plików konfiguracyjnych (package.json, tsconfig.json, postcss.config.mjs) w katalogu głównym, co sprawia, że projekt jest czytelniejszy i łatwiejszy w nawigacji, szczególnie gdy rośnie.
Jaka jest różnica między Tailwind CSS v3 a v4?
Tailwind CSS v4 przenosi konfigurację z pliku tailwind.config.ts do CSS — cała konfiguracja niestandardowych kolorów, fontów i animacji trafia do bloku @theme w pliku globals.css. Nie trzeba też konfigurować tablicy content, bo v4 automatycznie skanuje pliki projektu. PostCSS wymaga nowego pluginu @tailwindcss/postcss zamiast starszego tailwindcss.
Do czego służy helper cn() i dlaczego jest potrzebny?
Helper cn() łączy dwie biblioteki: clsx (do warunkowego łączenia klas) i tailwind-merge (do eliminacji konfliktujących klas Tailwinda, np. p-4 i p-8). Bez tailwind-merge Tailwind nie usuwa automatycznie nadpisanych klas — obie trafiają do DOM, co może powodować nieprzewidywalne style.
Czy strict: true w TypeScript jest konieczne?
Nie jest obowiązkowe, ale zdecydowanie zalecane od początku projektu. Włącza zestaw ścisłych sprawdzeń, takich jak noImplicitAny, strictNullChecks i strictFunctionTypes, które wymuszają precyzyjniejsze typowanie. Włączenie strict po tym, jak projekt już urósł, jest znacznie trudniejsze niż ustawienie go na starcie.
Jak działa alias @/* w importach?
Alias @/* jest konfigurowany w tsconfig.json i mapuje na katalog src/. Dzięki temu zamiast pisać import { Button } from '../../../components/ui/Button' możesz pisać import { Button } from '@/components/ui/Button'. Next.js automatycznie przekazuje tę konfigurację do Webpacka i TypeScript rozumie go w IDE.
Czy plugin prettier-plugin-tailwindcss działa z Tailwind v4?
Tak, plugin obsługuje Tailwind v4, ale upewnij się, że używasz aktualnej wersji pluginu (0.6.x lub nowszej). Plugin automatycznie sortuje klasy Tailwind w zalecanej kolejności podczas formatowania, co eliminuje ręczną pracę i sprawia, że diff w pull requestach jest czytelniejszy.
Kiedy warto dodać Storybook do projektu Next.js z tym setupem?
Storybook warto dodać, gdy projekt ma rosnącą bibliotekę komponentów UI, czyli User Interface, to wizualna i interakcyjna warstwa produktu. i potrzebuje ich izolowanego dokumentowania oraz testowania wizualnego. Przy strukturze components/ui/ opisanej w tym artykule Storybook integruje się naturalnie. Dla małych projektów i MVP narzut konfiguracyjny Storybooka może być zbyt duży — lepiej dodać go, gdy potrzeba jest realna.
Podsumowanie
Masz teraz solidną bazę do budowy aplikacji:
Next.js 16 z App Router i Server Components
TypeScript ze ścisłym typowaniem
Tailwind CSS z custom design system
ESLint + Prettier z automatycznym sortowaniem klas
Aliasy importów dla czystego kodu
Przemyślana struktura folderów gotowa na rozbudowę
Od tego punktu możesz dodawać kolejne elementy: autentykację, bazę danych z Prisma, CMS, czyli Content Management System, to system do zarządzania treścią bez ręcznej edycji kodu., testy. Fundament jest solidny.
Jeśli chcesz przełożyć ten temat na lepszą architekturę frontendu, uporządkować React lub Next.js i podnieść jakość pracy zespołu, skontaktuj się ze mną. Pomagam zamieniać wiedzę z artykułów w praktyczne decyzje technologiczne.
Maciej Sala — project manager i frontendowiec z doświadczeniem w marketingu internetowym. Na co dzień pracuję z Reactem, Next.js i TypeScriptem, łącząc perspektywę produktową z praktycznym podejściem do kodu. Przez kilka lat związany z branżą gier wideo jako project manager i game designer.
Absolwent historii na Uniwersytecie Jagiellońskim i studiów podyplomowych z marketingu internetowego na Akademii Górniczo-Hutniczej w Krakowie. Poza pracą trenuje na siłowni, maluje figurki i realizuje własne projekty.
Astro.js vs Next.js — które narzędzie wybrać w 2026 roku?
Fachowe porównanie Astro.js i Next.js z perspektywy developera pracującego na co dzień w Next.js. Architektura, wydajność, SEO, DX, koszty i konkretne use case — z benchmarkami i przykładami kodu.
WordPress → Next.js — migracja treści, redirecty 301 i zachowanie pozycji SEO
Jak przenieść stronę z WordPress na Next.js bez utraty pozycji w Google? Eksport treści, mapowanie URL, redirecty 301, migracja obrazów i weryfikacja indeksacji.
Google Search Console + Next.js — indeksacja, błędy, performance i co z nimi robić
Jak korzystać z Google Search Console dla strony Next.js? Weryfikacja, sitemap, indeksacja, Core Web Vitals, crawl budget i najczęstsze problemy — praktyczny poradnik.