0
0
Lập trình
Thaycacac
Thaycacac thaycacac

CSR, SSG và SSR: So sánh và Ứng dụng với React & Next.js

Đăng vào 7 tháng trước

• 8 phút đọc

Giới thiệu

Chào mừng bạn đến với bài viết này! Nếu bạn mới bắt đầu tìm hiểu về phát triển web, có thể bạn đã nghe qua các thuật ngữ như CSR, SSG, và SSR. Đây là những khái niệm quan trọng trong lập trình web hiện đại, đặc biệt khi sử dụng React và Next.js. Trong bài viết này, chúng ta sẽ khám phá ý nghĩa của những thuật ngữ này, cách chúng hoạt động và tại sao Next.js lại được coi là một lựa chọn tuyệt vời cho SEO.

Mục lục

  1. HTML thuần túy
  2. React và Client-Side Rendering (CSR)
  3. Next.js và Pre-Rendering
  4. Static Site Generation (SSG)
  5. Server-Side Rendering (SSR)
  6. Tóm tắt nhanh
  7. Câu hỏi thường gặp

HTML thuần túy

Câu chuyện của Trình duyệt

Trình duyệt: Chào bạn, tôi là trình duyệt, có thể là Chrome, Firefox, hoặc bất kỳ trình duyệt nào bạn đang sử dụng. Khi ai đó truy cập một trang web, họ gửi cho tôi một yêu cầu HTTP và tôi lấy một tệp HTML từ máy chủ. Công việc của tôi rất đơn giản:

  • Tôi phân tích HTML để xây dựng cấu trúc của trang.
  • Nếu có CSS, tôi sử dụng nó để làm cho mọi thứ trở nên đẹp đẽ hơn.
  • Nếu có JavaScript, tôi chạy nó để thêm tính tương tác.

HTML: Tôi là xương sống! Đối với một trang web cơ bản, tôi chỉ là một tệp tĩnh với một số thẻ. Ví dụ:

html Copy
<!DOCTYPE html>
<html lang="vi">
  <head>
    <title>Trang cơ bản</title>
  </head>
  <body>
    <h1>Chào mừng đến với trang của tôi!</h1>
    <p>Tôi chỉ là nội dung tĩnh, sẵn sàng để đi.</p>
  </body>
</html>

Trình duyệt: Khi tôi nhận được HTML này, tôi hiển thị ngay lập tức. Không có sự chờ đợi, không có rắc rối. Các công cụ tìm kiếm như Google rất thích tôi vì tôi đơn giản, và họ có thể đọc nội dung của tôi ngay lập tức. Nhưng nếu bạn muốn một trang đẹp hơn, tương tác hơn, tôi cần một chút sự giúp đỡ từ JavaScript.

React và Client-Side Rendering (CSR)

JavaScript bước vào sân khấu

JavaScript: Xin chào, tôi là JavaScript, và tôi làm cho mọi thứ trở nên động! Với React, tôi có thể xây dựng các giao diện người dùng phức tạp, tương tác mà không cần tải lại toàn bộ trang. Nhưng đây là cách nó hoạt động trong một thiết lập Client-Side Rendering (CSR):

HTML: Trong một ứng dụng React, tôi rất tối giản lúc đầu. Tôi có thể trông như thế này:

html Copy
<!DOCTYPE html>
<html lang="vi">
  <head>
    <title>Ví dụ React CSR</title>
  </head>
  <body>
    <div id="root"></div>
    <script src="main.js"></script>
  </body>
</html>

Trình duyệt: Khi tôi nhận được HTML này, nó gần như trống rỗng, chỉ có một <div id="root">. Tôi tự hỏi, “Ủa, nội dung đâu hết rồi?” Tôi phải chờ JavaScript tải lên và chạy.

JavaScript: Đó là lúc tôi xuất hiện! Tôi sử dụng React để lấp đầy div trống đó với nội dung tuyệt vời. Xem thử:

javascript Copy
// main.js
import React from "react";
import ReactDOM from "react-dom/client";

function App() {
  return <h1>Xin chào từ React CSR!</h1>;
}

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<App />);

Trình duyệt: Khi JavaScript chạy, tôi cuối cùng thấy được <h1>Xin chào từ React CSR!</h1> và hiển thị nó. Thật tuyệt, nhưng có một điều...

Công cụ tìm kiếm: Chào, tôi là crawler của Google. Tôi ghé thăm các trang để lập chỉ mục cho kết quả tìm kiếm. Khi tôi thấy <div id="root"> trống rỗng, tôi có thể không chờ JavaScript tải lên. Vì vậy, tôi có thể bỏ lỡ nội dung, điều này không tốt cho SEO.

Nhược điểm của CSR

JavaScript: Đúng vậy, đó là nhược điểm của CSR. Tôi rất tuyệt vời cho các ứng dụng tương tác, nhưng các công cụ tìm kiếm có thể không thấy toàn bộ trang ngay lập tức vì tôi làm tất cả việc kết xuất trong trình duyệt.

Next.js và Pre-Rendering

Máy chủ bước vào

Máy chủ: Chào, tôi là máy chủ, và Next.js là bạn của tôi. Khác với React thuần, tôi có thể trước khi kết xuất HTML trước khi gửi đến trình duyệt. Điều này có nghĩa là trình duyệt và các công cụ tìm kiếm nhận được một trang đã được tải đầy đủ ngay từ đầu.

Trình duyệt: Ồ, tuyệt vời! Vậy khi tôi nhận được một trang từ Next.js, nó đã được lấp đầy nội dung rồi sao? Không cần chờ JavaScript?

Máy chủ: Chính xác! Với App Router của Next.js, tôi kết xuất JSX trên máy chủ và gửi một tài liệu HTML hoàn chỉnh. Các công cụ tìm kiếm yêu thích điều này vì họ thấy nội dung ngay lập tức.

Công cụ tìm kiếm: Đúng vậy! Tôi có thể lập chỉ mục HTML đã được kết xuất trước ngay lập tức. Đó là lý do tại sao người ta nói Next.js thân thiện với SEO; giống như phục vụ cho tôi một trang đã sẵn sàng để đọc.

Static Site Generation (SSG)

Bánh kem đã nướng sẵn

Máy chủ: Giả sử bạn có một trang với nội dung không thay đổi thường xuyên, như trang chính của blog hoặc trang tiếp thị. Với Static Site Generation (SSG), tôi tạo HTML tại thời điểm xây dựng, giống như nướng một chiếc bánh trước khi bữa tiệc bắt đầu.

Trình duyệt: Vậy khi tôi yêu cầu trang, bạn chỉ cần đưa cho tôi HTML đã nướng sẵn?

Máy chủ: Đúng vậy, nó rất nhanh vì công việc đã hoàn thành. Dưới đây là một ví dụ trong Next.js:

javascript Copy
// app/page.js
export default function Home() {
  return <h1>Xin chào từ Next.js SSG!</h1>;
}

Máy chủ: Tôi xây dựng HTML này một lần trong quá trình xây dựng, và sau đó tôi phục vụ nó cho mọi người dùng khi họ truy cập. Nó cực kỳ nhanh và tuyệt vời cho nội dung tĩnh.

Công cụ tìm kiếm: Thích quá! Tôi nhận được full HTML ngay lập tức, vì vậy việc lập chỉ mục thật dễ dàng.

JavaScript: Tôi có cần làm gì ở đây không?

Máy chủ: Không nhiều! Trình duyệt vẫn có thể chạy JavaScript cho sự tương tác, nhưng công việc nặng đã được tôi thực hiện trong quá trình xây dựng.

Server-Side Rendering (SSR)

Nội dung mới mỗi lần

Máy chủ: Bây giờ, nếu dữ liệu của bạn thay đổi thường xuyên? Như danh sách các người nổi tiếng cập nhật mỗi giờ? Đó là lúc Server-Side Rendering (SSR) xuất hiện. Tôi lấy dữ liệu mới nhất cho mỗi yêu cầu, tạo HTML mới và gửi nó đến trình duyệt.

Trình duyệt: Vậy tôi nhận được một trang đã được kết xuất mới mỗi lần?

Máy chủ: Chính xác. Đây là cách nó hoạt động trong Next.js:

javascript Copy
// app/celebrities/page.js
async function getCelebrities() {
  const res = await fetch("https://api.example.com/celebrities", {
    cache: "no-store", // đảm bảo dữ liệu mới trên mỗi yêu cầu
  });
  return res.json();
}

export default async function CelebritiesPage() {
  const celebrities = await getCelebrities();

  return (
    <div>
      <h1>Danh sách Người Nổi Tiếng</h1>
      <ul>
        {celebrities.map((c) => (
          <li key={c.id}>{c.name}</li>
        ))}
      </ul>
    </div>
  );
}

Máy chủ: Với mỗi yêu cầu, tôi gọi getCelebrities(), xây dựng HTML với dữ liệu mới nhất và gửi nó đến trình duyệt. Nó luôn mới mẻ mỗi lần.

Công cụ tìm kiếm: Tuyệt vời! Tôi luôn thấy nội dung mới nhất, vì vậy tôi có thể lập chỉ mục chính xác.

Trình duyệt: Và tôi hiển thị nó ngay lập tức mà không cần chờ JavaScript lấp đầy chỗ trống.

JavaScript: Tôi vẫn có thể thêm tính tương tác sau khi trang đã tải, đúng không?

Máy chủ: Đúng vậy, bạn có thể đảm nhận các việc như nhấp chuột hoặc cập nhật động, nhưng tôi xử lý việc kết xuất ban đầu.

Tóm tắt nhanh

Tất cả cùng nói

Trình duyệt: Vậy, hãy tóm tắt:

  • CSR (Mặc định của React): Tôi nhận được một HTML trống với <div id="root">. JavaScript làm tất cả công việc trong trình duyệt, nhưng không tốt cho SEO vì các crawler có thể bỏ lỡ nội dung.
  • SSG (Next.js): Tôi nhận được HTML đã nướng sẵn từ máy chủ tại thời điểm xây dựng. Nó cực kỳ nhanh và tuyệt vời cho nội dung tĩnh như blog.
  • SSR (Next.js): Tôi nhận được HTML mới từ máy chủ cho mỗi yêu cầu, hoàn hảo cho nội dung động như dữ liệu trực tiếp.

Công cụ tìm kiếm: Next.js là sự lựa chọn yêu thích của tôi vì nó cung cấp HTML đã được kết xuất trước, dù là SSG hay SSR. Tôi có thể lập chỉ mục dễ dàng, làm cho Next.js tuyệt vời cho SEO.

JavaScript: Và tôi vẫn được tỏa sáng trong Next.js cho tính tương tác, ngay cả khi máy chủ làm việc nặng cho việc kết xuất.

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

1. CSR là gì?

CSR (Client-Side Rendering) là phương pháp mà nội dung được tạo ra trên trình duyệt của người dùng thông qua JavaScript.

2. SSG là gì?

SSG (Static Site Generation) là phương pháp mà nội dung HTML được tạo ra trước và được phục vụ cho người dùng, thường dùng cho nội dung tĩnh.

3. SSR là gì?

SSR (Server-Side Rendering) là phương pháp mà nội dung HTML được tạo ra trên máy chủ cho mỗi yêu cầu, giúp cung cấp nội dung mới nhất cho người dùng.

4. Next.js có tốt cho SEO không?

Có, Next.js rất tốt cho SEO vì nó cung cấp HTML đã được kết xuất trước, giúp các công cụ tìm kiếm dễ dàng lập chỉ mục nội dung.

5. Tôi nên sử dụng phương pháp nào?

Lựa chọn phương pháp phụ thuộc vào loại ứng dụng của bạn. Nếu nội dung tĩnh, hãy sử dụng SSG. Nếu cần nội dung động, hãy xem xét SSR. Nếu bạn cần tính tương tác, CSR có thể là lựa chọn tốt.

Kết luận

Bây giờ bạn đã hiểu rõ về sự khác biệt giữa CSR, SSG và SSR, cùng với cách mà React và Next.js sử dụng những phương pháp này. Hãy thử áp dụng những kiến thức này vào dự án phát triển web của bạn để tạo ra những trang web tối ưu hóa cho SEO và trải nghiệm người dùng tốt hơn. Nếu bạn có thắc mắc hoặc cần thêm thông tin, hãy để lại câu hỏi của bạn bên dưới!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào