
Kiến trúc phần mềm
Hướng dẫn chọn Server/Client Component trong Next.js với ví dụ thực tế, lỗi hydration mismatch thường gặp và cách đo bundle size trước/sau.
Trong Next.js 13+, việc phân biệt Server Components và Client Components ảnh hưởng trực tiếp đến hiệu suất, khả năng mở rộng và trải nghiệm người dùng. Một ứng dụng web chạy mượt mà với 150ms render đầu tiên thường bắt nguồn từ việc tối ưu hóa đúng loại component.
Trong ứng dụng quản lý booking, trang dashboard hiển thị hơn 30 metric thời gian thực. Tôi sử dụng Server Components để fetch dữ liệu từ API backend, sau đó truyền xuống Client Components để render giao diện. Kết quả: thời gian render đầu tiên giảm 40% so với cách dùng Client Components toàn bộ.
Khi tôi cố gắng dùng 'use client' cho một component hiển thị biểu đồ, xảy ra lỗi hydration mismatch do component server-rendered khác với client-rendered. Kết quả: UI bị render sai, người dùng thấy lỗi hiển thị.
Khi component server-rendered khác với client-rendered:
// Server Component
function Chart() {
return <div>Biểu đồ dữ liệu</div>;
}
// Client Component (sai cách dùng)
'use client';
function Chart() {
useEffect(() => {
fetch('/api/data');
}, []);
return <div>Biểu đồ dữ liệu</div>;
}Khi dùng 'use client' cho component không cần tương tác, bundle sẽ bao gồm toàn bộ React hooks và client-side logic:
'use client';
function StaticContent() {
return <div>Đây là nội dung tĩnh</div>;
}Khi nhiều component dùng 'use client' mà không cần thiết, codebase trở nên phức tạp:
'use client';
function UserProfile({ user }) {
const [isEditing, setIsEditing] = useState(false);
return (
<div>
{isEditing ? <EditForm /> : <DisplayInfo />}
</div>
);
}Dùng khi component cần tương tác với người dùng (form, button, animation) hoặc sử dụng hooks như useState/useEffect. Ví dụ: form đăng nhập, component hiển thị dữ liệu động.
Đảm bảo component server-rendered và client-rendered giống nhau, và tránh dùng hooks không cần thiết trong Server Components.
Không. Server Components không hỗ trợ hooks và tương tác người dùng. Dùng khi cần xử lý dữ liệu lớn hoặc render static content.
Sử dụng Webpack Bundle Analyzer để xem từng component chiếm bao nhiêu KB, kết hợp với Lighthouse để đánh giá hiệu suất tổng thể.
Không có công cụ tự động, nhưng có thể dùng Next.js App Router để tự động chia nhỏ bundle: mỗi page là một bundle riêng.
Việc lựa chọn giữa Server và Client Components không chỉ ảnh hưởng đến hiệu suất mà còn quyết định khả năng bảo trì và mở rộng ứng dụng. Bằng cách phân tích ví dụ thực tế và đo lường kích thước bundle, bạn có thể tối ưu ứng dụng một cách hiệu quả.
Tiếp tục khám phá các chủ đề cùng chuyên mục.

Thiết kế domain model, xác định aggregate boundary và triển khai repository interface trong NestJS qua module sản phẩm. Tránh lỗi nhồi logic vào service.
Đọc bài viết
Hiểu ranh giới Server và Client Components trong Next.js để giảm JavaScript phía browser mà vẫn giữ trải nghiệm tương tác.
Đọc bài viết