0
0
Lập trình
Thaycacac
Thaycacac thaycacac

Khám Phá Next.js 15: Kết Hợp Máy Chủ và Khách Hàng

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

• 8 phút đọc

Khám Phá Next.js 15: Kết Hợp Máy Chủ và Khách Hàng

Xây dựng một ứng dụng web hiện đại không chỉ là việc lập trình, mà còn là nghệ thuật kết hợp các yếu tố lại với nhau như một bản giao hưởng. Mỗi phần - từ giao diện người dùng (UI), quản lý trạng thái, đến các cuộc gọi API - cần phải hòa quyện một cách hoàn hảo. Tuy nhiên, chúng ta thường đối mặt với một căng thẳng cơ bản: máy chủ, mạnh mẽ và gần dữ liệu, đối lập với khách hàng, năng động và gần người dùng.

Chúng ta đã xây dựng những hệ thống phức tạp để quản lý sự đối lập này: render phía máy chủ (SSR), tạo trang tĩnh (SSG) và lấy dữ liệu từ phía khách hàng. Mặc dù chúng ta đã làm cho nó hoạt động, nhưng gánh nặng tinh thần là rất cao. Ranh giới giữa chúng trở nên mờ nhạt.

Next.js 15, với việc triển khai chín muồi các Thành phần Máy chủ React (RSCs), không chỉ thêm một tính năng mới. Nó cung cấp một triết lý mới. Một mô hình tư duy mới. Không chỉ là chọn máy chủ hoặc khách hàng; mà là kết hợp chúng lại với nhau một cách có chủ đích, như một nghệ sĩ vĩ đại chọn phương tiện phù hợp cho từng phần của tác phẩm nghệ thuật.

Chào mừng bạn đến với atelier. Hãy để lại các công cụ cũ và học cách vẽ bằng một bảng màu mới.

Hành Trình: Từ Môi Trường Đến Ý Định

Mô hình tư duy cũ của chúng ta dựa trên nơi mà mã có thể chạy. Chúng ta thường hỏi: "Liệu thành phần này có an toàn cho máy chủ không? Nó có cần window không?"

Mô hình tư duy mới cho Next.js 15 dựa trên mục đíchý định. Chúng ta giờ đây đặt ra một câu hỏi sâu sắc hơn:

"Mục đích tồn tại của thành phần này là gì?"

Câu trả lời cho câu hỏi này sẽ rõ ràng tương ứng với một trong hai thế giới, mỗi thế giới có bản chất riêng:

Đặc điểm Thành phần Máy chủ (Atelier) Thành phần Khách (Triển lãm)
Mục đích Kết hợp, Lấy dữ liệu, Logic Tương tác, Trạng thái, Chu kỳ sống
Bản chất Tĩnh, Bất đồng bộ Năng động, Đồng bộ
Công cụ Truy cập DB/API trực tiếp, mô-đun Node.js useState, useEffect, API của trình duyệt
Đầu ra Nguyên liệu (JSX, dữ liệu, promises) Tương tác (Xử lý sự kiện, trạng thái)
Phép ẩn dụ Nghệ sĩ tạo ra bức tranh trong không gian riêng tư Bức tranh hoàn thiện, được trình bày trước khán giả

Đây không phải là một hạn chế kỹ thuật; mà là một ràng buộc triết học. Và như tất cả các nghệ sĩ vĩ đại biết, những hạn chế là điều tạo ra sự sáng tạo chân chính.

Tác Phẩm Nghệ Thuật: Kết Hợp Có Chủ Đích

Hãy chuyển từ lý thuyết sang thực tiễn. Hãy tưởng tượng một ProductPage.

Thành phần Máy chủ (app/product/[id]/page.js): Kiến trúc sư

Trang, theo mặc định trong Router Ứng dụng của Next.js 15, là một Thành phần Máy chủ. Đây là nơi mà nó thuộc về. Mục đích của nó rất rõ ràng: thu thập dữ liệu và tạo ra khung cho giao diện. Nó hoạt động trong "atelier."

javascript Copy
// Thành phần Máy chủ: Làm những gì nó giỏi nhất.
import { fetchProduct, fetchRecommendations } from '@lib/db'; // Truy cập DB trực tiếp!

async function ProductPage({ params }) {
  // Trong atelier, chúng ta có thể làm việc với nguyên liệu thô một cách an toàn.
  const product = await fetchProduct(params.id);
  const recommendations = await fetchRecommendations();

  // Chúng ta kết hợp giao diện, truyền dữ liệu đã chuẩn bị cho các phần tương tác.
  return (
    <main>
      {/* Đây chỉ là kết hợp, không có tương tác */}
      <h1>{product.name}</h1>
      <p>{product.description}</p>

      {/* Chúng ta truyền dữ liệu đến một Thành phần Khách, giống như đưa một bản thiết kế cho một thợ thủ công */}
      <ProductImageGallery images={product.images} />

      {/* Thành phần này cần trạng thái, vì vậy nó phải ở phía khách hàng */}
      <AddToCartButton productId={product.id} stock={product.stock} />

      {/* Chúng ta có thể thậm chí truyền dữ liệu sau đó */}
      <RecommendedProducts list={recommendations} />
    </main>
  );
}

export default ProductPage;

Lưu ý tính thanh lịch. Không có các cuộc gọi useEffect để lấy dữ liệu. Không có mã boilerplate cho trạng thái tải. Thành phần gần như hoàn toàn diễn đạt. Nó mô tả thứ gì mà trang là, không phải cách quản lý việc lắp ráp của nó.

Thành phần Khách (components/AddToCartButton.js): Thợ thủ công

Bây giờ, chúng ta cần tương tác. Chúng ta cần trạng thái, một trình xử lý sự kiện và truy cập vào ngữ cảnh của người dùng. Đây là công việc của "triển lãm", phía khách hàng.

javascript Copy
'use client'; // Chỉ thị quan trọng: "Điều này thuộc về triển lãm."

import { useState } from 'react';

function AddToCartButton({ productId, stock }) {
  // Công cụ phía khách: Trạng thái, Hiệu ứng, Xử lý sự kiện.
  const [quantity, setQuantity] = useState(1);
  const [isAdding, setIsAdding] = useState(false);

  async function handleAddToCart() {
    setIsAdding(true);
    await addToCart({ productId, quantity }); // Gọi đến một route API phía khách.
    setIsAdding(false);
    // Có thể hiển thị thông báo toast...
  }

  // Mục đích của thành phần này hoàn toàn là tương tác.
  return (
    <div>
      <QuantitySelector value={quantity} onChange={setQuantity} max={stock} />
      <button onClick={handleAddToCart} disabled={isAdding || stock === 0}>
        {isAdding ? 'Đang thêm...' : 'Thêm vào giỏ hàng'}
      </button>
    </div>
  );
}

export default AddToCartButton;

Lưu ý rằng chỉ thị 'use client' không phải là một gợi ý về hiệu suất; nó là một tuyên bố về ý định. Nó nói rằng, "Mục đích của tôi là tương tác. Tôi cần môi trường của trình duyệt để thực hiện vai trò của mình." Đây là thợ thủ công bước vào hội trường triển lãm để tương tác với khán giả.

Nghệ Thuật Kết Nối: Cách Chúng Kết Nối

Phép màu, nghệ thuật thực sự của mô hình mới này, nằm ở ranh giới giữa hai thế giới này. Bạn không truyền các hàm hoặc trình xử lý sự kiện từ Thành phần Máy chủ sang Thành phần Khách. Bạn truyền dữ liệu và props có thể tuần tự.

Hãy nghĩ về nó như việc thành phần máy chủ viết một kịch bản và cung cấp các props, và thành phần khách hành động trên sân khấu của trình duyệt. Sự tách biệt này là điều đảm bảo an ninh, giảm kích thước gói máy chủ và cho phép tối ưu hóa mạnh mẽ như tiền render tĩnh.

Làm Thế Nào Để Chấp Nhận Mô Hình Tư Duy Này: Hướng Dẫn Dành Cho Người Có Kinh Nghiệm

Sự thay đổi này có thể cảm thấy rất lớn. Bạn không chỉ học một API mới; bạn đang điều chỉnh lại trực giác của mình. Dưới đây là cách tiếp cận:

  1. Bắt Đầu Với Tư Duy "Máy Chủ Trước". Mặc định mọi thành phần là Thành phần Máy chủ. Hãy hỏi: "Liệu công việc này có thể thực hiện trong atelier không?" Nếu nó không cần tương tác, nó không nên ở trong triển lãm. Đây là sự thay đổi lớn nhất trong tư duy.

  2. Xác Định Các Đảo Tương Tác. Xem các thành phần hiện có của bạn. Thành phần nào có useState, useEffect, onClick? Đây là những hòn đảo của bạn. Đây là những gì cần chỉ thị 'use client'. Đẩy chúng xuống cây càng xa càng tốt, làm cho gốc chủ yếu là cấu trúc từ phía máy chủ.

  3. Học Lại Cách Lấy Dữ Liệu. Từ bỏ mẫu lấy dữ liệu useEffect cho dữ liệu chính của bạn. Để Thành phần Máy chủ await dữ liệu trực tiếp. Sử dụng các ranh giới Suspense để xác định trạng thái tải của bạn một cách diễn đạt. Đây là một trừu tượng sạch hơn và mạnh mẽ hơn.

  4. Ôm Chặt Sự Kết Hợp. Đừng chống lại mô hình truyền props. Hãy xem nó như một lợi ích. Nó buộc một dòng chảy dữ liệu rõ ràng và làm cho các thành phần dễ dự đoán và dễ kiểm tra hơn.

Lớp Sơn Cuối Cùng: Một Bản Giao Hưởng Về Mục Đích

Next.js 15 với React Server Components không chỉ là một bản cập nhật framework. Nó là một lời mời gọi đến một trình độ nghệ thuật cao hơn. Nó thách thức chúng ta suy nghĩ sâu sắc hơn về mục đích của mỗi dòng mã mà chúng ta viết.

Nó thay thế câu hỏi "Liệu tôi có thể làm cho điều này hoạt động không?" bằng câu hỏi nghệ thuật hơn "Nơi nào điều này thuộc về tốt nhất?"

Bằng cách chấp nhận mô hình tư duy này, chúng ta không còn là những thợ cơ khí nối kết các môi trường. Chúng ta trở thành các kiến trúc sư kết hợp với ý định. Chúng ta trở thành những nghệ nhân, lựa chọn một cách có suy nghĩ công cụ phù hợp cho công việc phù hợp, tạo ra các ứng dụng không chỉ hiệu suất và khả năng mở rộng cao hơn mà còn thanh lịch và có mục đích hơn.

Bảng vẽ đang chờ đợi. Bạn sẽ kết hợp tác phẩm nghệ thuật tiếp theo của mình như thế nào?

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