TRANG CHỦ
DỰ ÁN
Dự án nổi bậtKho dự án
BÀI VIẾT
Tất cả bài viết

Danh mục

Kỹ thuật AIKiến trúc phần mềmSEO kỹ thuậtTiếp thị Web
CÔNG CỤ
Tạo mã QR
VIEN

Có ý tưởng cần hiện thực hoá?

Mình nhận làm website, web app và giải pháp AI. Trao đổi miễn phí, phản hồi trong 24 giờ.

Liên hệ ngayĐặt lịch gọi

Nguyễn Sinh Nhật

Software Engineer

Software Engineer — Fullstack Developer & AI Engineer, tập trung vào web app có khả năng mở rộng và giải pháp AI thực tế.

Khám phá

  • Trang chủ
  • Dự án
  • Bài viết
  • Công cụ

Công cụ

  • Tạo mã QR
  • RSS feed

Liên hệ

  • nhatnguyendev251@gmail.com
  • 0328 398 467
  • Phường Ngũ Hành Sơn, Đà Nẵng, Việt Nam

© 2026 Nguyễn Sinh Nhật. Xây bằng Next.js & Sanity.

Đang nhận dự án mới
Loading blog post
Quay lại danh sách bài viết
Lập trình viên làm việc với ứng dụng Next.js, màn hình chia đôi hiển thị server và client component cùng số liệu hiệu năng.

Kiến trúc phần mềm

Cách chọn Server hay Client Component trong Next.js với ví dụ thực tế

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.

Bởi Nguyễn Sinh Nhật•Đăng ngày 25 thg 9, 2026•5 phút đọc

Mục lục

  • Tại sao lựa chọn Server hay Client Component lại quan trọng?
  • Phân biệt cơ bản
  • Ví dụ thực tế từ ứng dụng web đang chạy
  • Trường hợp 1: Tối ưu render cho trang dashboard
  • Đo bundle size trước/sau
  • Trường hợp 2: Lỗi khi lạm dụng 'use client'
  • Lỗi hay gặp khi lạm dụng 'use client'
  • 1. Hydration mismatch
  • 2. Tăng bundle size không cần thiết
  • 3. Khó bảo trì
  • Cách đo bundle size trước/sau
  • Công cụ hỗ trợ
  • Ví dụ đo lường
  • Câu hỏi thường gặp
  • Khi nào nên dùng 'use client'?
  • Làm thế nào để tránh lỗi hydration mismatch?
  • Có nên dùng Server Components cho tất cả?
  • Làm sao đo kích thước bundle hiệu quả?
  • Có công cụ nào tự động tối ưu bundle size không?
  • Kết luận
Bài viết này cũng có bằng Tiếng Anh

Tại sao lựa chọn Server hay Client Component lại quan trọng?

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.

Phân biệt cơ bản

  • Server Components: Chạy trên server, không có DOM, không hỗ trợ hooks như useState/useEffect. Phù hợp với logic xử lý dữ liệu, API call, và render static content.
  • Client Components: Chạy trên browser, hỗ trợ hooks, phù hợp với giao diện tương tác, form, và logic client-side.

Ví dụ thực tế từ ứng dụng web đang chạy

Trường hợp 1: Tối ưu render cho trang dashboard

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ộ.

Đo bundle size trước/sau

  • Trước: 2.1MB (bao gồm cả logic xử lý dữ liệu trong Client Components)
  • Sau: 1.3MB (tách logic xử lý sang Server Components)

Trường hợp 2: Lỗi khi lạm dụng 'use client'

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ị.

Lỗi hay gặp khi lạm dụng 'use client'

1. Hydration mismatch

Khi component server-rendered khác với client-rendered:

Chart.jsxjavascript
// 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>;
}

2. Tăng bundle size không cần thiết

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:

StaticContent.jsxjavascript
'use client';
function StaticContent() {
  return <div>Đây là nội dung tĩnh</div>;
}

3. Khó bảo trì

Khi nhiều component dùng 'use client' mà không cần thiết, codebase trở nên phức tạp:

UserProfile.jsxjavascript
'use client';
function UserProfile({ user }) {
  const [isEditing, setIsEditing] = useState(false);
  return (
    <div>
      {isEditing ? <EditForm /> : <DisplayInfo />}
    </div>
  );
}

Cách đo bundle size trước/sau

Công cụ hỗ trợ

  • Webpack Bundle Analyzer: phân tích từng component trong bundle.
  • Next.js built-in: chạy build với analyzer để xem báo cáo.
  • Lighthouse: đo hiệu suất và kích thước bundle.

Ví dụ đo lường

  • Trang dashboard — Trước: 2.1MB (bao gồm 0.8MB logic xử lý dữ liệu). Sau: 1.3MB (tách 0.8MB sang Server Components).
  • Trang chi tiết sản phẩm — Trước: 1.8MB (bao gồm 0.5MB hooks và client-side logic). Sau: 1.2MB (chỉ giữ lại 0.2MB hooks cần thiết).

Câu hỏi thường gặp

Khi nào nên dùng 'use client'?

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.

Làm thế nào để tránh lỗi hydration mismatch?

Đả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.

Có nên dùng Server Components cho tất cả?

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.

Làm sao đo kích thước bundle hiệu quả?

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ể.

Có công cụ nào tự động tối ưu bundle size không?

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.

Kết luận

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ả.

Câu hỏi thường gặp

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. 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. Ví dụ: mỗi page là một bundle riêng.

Bài viết liên quan

Tiếp tục khám phá các chủ đề cùng chuyên mục.

Lập trình viên viết code NestJS với giao diện sạch, bàn làm việc tối giản.
Kiến trúc phần mềm28 thg 9, 20266 phút đọc

Giải thích domain model, aggregate và repository trong NestJS

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
Minh họa Next.js về cách sử dụng use client đúng cách với Server Components và Client Components.
Kiến trúc phần mềm02 thg 8, 20267 phút đọc

Một dòng use client đặt sai chỗ có thể làm Next.js nặng hơn

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