1. Làm quen với “file-based routing”: tạo route bằng folder
Với React Router, bạn phải khai báo route bằng code. Next.js làm điều đó theo cách khác: cấu trúc thư mục chính là routing.page.js bên trong.
2. Hai “reserved files” quan trọng nhất: page.js và layout.js
Next.js có một hệ thống reserved filenames — những tên file đặc biệt mà framework nhận ra và xử lý theo cách riêng.
page.js— định nghĩa nội dung của một trang, đây là file bắt buộc để một route được render.layout.js— định nghĩa “khung” bao quanh trang, ví dụ header, footer, sidebar. Layout lồng nhau (nested layout) cũng được hỗ trợ —layout.jstrong thư mục con chỉ áp dụng cho trang đó và các trang con của nó.
layout.js thường có metadata, thẻ <html> và <body>, và {children} — placeholder để render các trang con.
3. Các reserved filenames khác cần biết
Next.js còn nhiều tên file đặc biệt khác:
Chi tiết đầy đủ tại tài liệu chính thức của Next.js.
4. Component <Link> — navigate thông minh hơn
Thay vì dùng thẻ <a> thông thường, Next.js cung cấp component <Link>:
5. Dynamic Routes — route với tham số động
Để xử lý các URL dạng/blog/post-1, /blog/post-2… bạn có thể dùng dynamic segment bằng cách đặt tên thư mục trong dấu ngoặc vuông:
params được truyền vào như một prop mặc định:
6. Tổ chức file — /components nên đặt ngoài /app
Thư mục /app chỉ nên chứa các routing files. Custom components nên đặt bên ngoài thư mục /app:
/app mà không có page.js sẽ không tạo ra route — nhưng để tránh nhầm lẫn, tốt hơn là tách biệt hoàn toàn.
Để import cho gọn, dùng path alias @ bằng cách cấu hình jsconfig.json:
import Header from '@/components/header'.
7. CSS Modules — tránh xung đột class name
Bên cạnhglobal.css như mọi app, Next.js hỗ trợ sẵn CSS Modules. Mỗi component có file CSS riêng:
8. Component <Image> — tối ưu hình ảnh tự động
Đừng dùng thẻ <img> thông thường trong Next.js. Hãy dùng <Image> từ next/image:
srcset cho responsive…
Thêm prop priority cho những ảnh quan trọng (hiển thị ngay khi load trang, không lazy load).
Lưu ý quan trọng: Chỉ những ảnh được import tĩnh (xử lý lúc build time) mới tận dụng được đầy đủ tính năng này.
Ảnh lấy từ database lúc runtime sẽ không có sẵn metadatawidth,height— bạn cần truyền thủ công hoặc dùng propfill.
9. Server Components và Client Components
Đây là khái niệm khác biệt lớn nhất so với React thuần.- Với
create-react-app, tất cả component đều là Client Components — chạy trên browser. - Với Next.js, tất cả component mặc định là React Server Components (RSC) — render phía server.
console.log trong một component Next.js — bạn sẽ thấy log xuất hiện ở terminal của dev server, không phải trong DevTools của browser.
Sử dụng 'use client' để khai báo Client Component
Do đó, khi bạn cần dùng các React hook như useState, useEffect, usePathname… bạn bắt buộc phải khai báo component đó là Client Component:
'use client', Next.js sẽ báo lỗi ngay:
Quy tắc: Đặt 'use client' đúng chỗ, càng sâu càng tốt
Một sai lầm phổ biến: đặt 'use client' ở component cha, kéo theo toàn bộ cây component bên dưới trở thành Client Component — mất đi lợi ích của SSR.
Best practice: tách logic cần client-side ra thành component con riêng, đặt 'use client' ở đó, và dùng nó trong Server Component:
Tổng kết
Sau buổi đầu tiên với Next.js, bạn đã nắm được những nền tảng quan trọng:- Routing dựa trên cấu trúc thư mục, với các reserved files như
page.js,layout.js,error.js… <Link>để navigate thông minh giữa SSR và CSR- Dynamic routes với
[slug] - Tổ chức dự án với
/componentsbên ngoài/app, dùng@alias - CSS Modules để scope style theo component
<Image>để tối ưu hình ảnh tự động- Server vs Client Components — mặc định là Server, dùng
'use client'khi cần hook, và đặt càng sâu càng tốt