您已經聽到了各種討論,也看過了晦澀難懂的 Next.js 文件。也許您甚至嘗試過使用它們,但卻完全搞不懂。 React 伺服器元件 (RSC) 感覺像是自 Hooks 以來 React 最大的思維模式轉變。然而,每個人都誤解了它們。

不要再把它們僅僅視為「在伺服器上執行的元件」。這只是故事的一半。本文將深入探討它們究竟是什麼,為何它們能解決你肯定遇到的問題,以及它們如何從根本上改變 React 架構。

問題:厄運的“瀑布”

想像一下一個典型的 React 應用。你有一個頁面用於獲取部落格文章列表,並且對於每篇文章,它都需要獲取作者的詳細資訊。在一個典型的客戶端 React 應用(即使使用了 SSR)中,這也會形成一個「網路瀑布」。

// Client-side React (e.g., using useEffect)
const BlogPage = () => {
  const [posts, setPosts] = useState(null);

  useEffect(() => {
    fetchPosts().then((data) => setPosts(data)); // 1. Fetch post list
  }, []);

  if (!posts) return <p>Loading posts...</p>;

  return (
    <div>
      {posts.map((post) => (
        <PostCard key={post.id} post={post} /> // 2. Each PostCard fetches its own author
      ))}
    </div>
  );
};

const PostCard = ({ post }) => {
  const [author, setAuthor] = useState(null);

  useEffect(() => {
    fetchAuthor(post.authorId).then((data) => setAuthor(data)); // 3. Fetch author
  }, [post.authorId]);

  return (
    <article>
      <h1>{post.title}</h1>
      {author ? <p>By: {author.name}</p> : <p>Loading author...</p>} {/* 4. Finally render */}
    </article>
  );
};

這個順序安排得讓人很不舒服。作者的取得甚至要等到父元件的文章資料載入完畢才能開始。用戶看到的是一連串令人不快的載入旋轉視窗。

這就是 RSC 旨在解決的問題。

解決方案:單次存取伺服器

React 伺服器元件完全顛覆了這個模型。它們是僅在伺服器上執行的元件。它們不會重新渲染,不使用狀態或效果。它們的工作是獲取資料並描述 UI。

以下是使用 RSC 的相同範例(使用 Next.js App Router):

// app/blog/page.js
// This is a Server Component by default
async function BlogPage() {
  const posts = await fetchPosts(); // 1. Fetch on the server

  return (
    <div>
      {posts.map((post) => (
        <PostCard key={post.id} post={post} />
      ))}
    </div>
  );
}

// app/components/PostCard.js
async function PostCard({ post }) {
  const author = await fetchAuthor(post.authorId); // 2. Also fetch on the server!

  return (
    <article>
      <h1>{post.title}</h1>
      <p>By: {author.name}</p> {/* 3. No loading state needed! */}
    </article>
  );
}

等等,什麼?就在元件內部 await ?沒錯!這就是魔力所在。兩次資料獲取都發生在伺服器上,在同一個環境中。沒有網路延遲。這就像從本地快取讀取資料,只不過是讀取的是資料庫。

伺服器現在可以一次解析所有資料,並將最終建立的完整 HTML 結構傳送給客戶端。瀑布流消失了。

讓我們直觀地了解差異

這種架構轉變至關重要。下圖展示了兩種模型中資料擷取的關鍵路徑。

圖形模型

交互時間 (TTI) 的差異巨大。客戶端模型受到多個連續網路請求的限制。 RSC 模型則在單一伺服器端執行上下文中完成所有資料處理工作。

為什麼這很重要:大勝利

  1. 效能大幅提升:不再出現客戶端資料瀑布流。更快的首次內容繪製 (FCP) 和可互動時間 (TTI)。

  2. 更小的客戶端套件:伺服器元件的 JavaScript 程式碼永遠不會傳送到客戶端。這大大減少了包的大小。你用來渲染 Markdown 的繁重函式庫?它仍然保留在伺服器上。

  3. 直接後端存取:您可以直接從元件安全地存取資料庫、內部 API 或檔案系統,而無需先建立單獨的 REST/GraphQL API 端點。這極大地提升了開發人員的體驗。

  4. 自動快取:伺服器元件的渲染結果可以被框架(如 Next.js)自動緩存,使得後續請求變得非常快。

陷阱(並非全是玫瑰)

  • 心理負擔:最大的障礙。你現在有兩種類型的元件,你必須不斷思考程式碼在哪裡執行。

  • 複雜性:它為 React 增加了一層新的複雜性,這對於初學者來說已經很多了。

  • 庫支援:並非所有第三方程式庫都與伺服器元件相容。您通常需要將它們包裝在客戶端元件中。

結論:你應該關心嗎?

絕對是如此。雖然學習難度較高,但 React 伺服器元件代表了 React 在資料密集型應用中開發的未來。它們以優雅的方式解決了實際的效能和架構問題。

它們不僅僅是一個“新功能”,而是一種新的範式。首先要理解將應用程式拆分為靜態(伺服器)和互動(客戶端)部分的思維模型。其效能和使用者體驗優勢不容忽視。

在理解伺服器元件的過程中,你遇到的最大困難是什麼?你在生產環境中使用過它們嗎?請在下方留言處留言告訴我!

如果您想支持我的內容,可以在這裡為我買杯咖啡:

給我買杯咖啡


原文出處:https://dev.to/ilsa_shaikh_089e2bfab0bf4/react-server-components-theyre-not-what-you-think-and-they-change-everything-55fk


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝10   💬6   ❤️11
448
🥈
我愛JS
📝1   💬6   ❤️4
93
🥉
AppleLily
📝1   💬4   ❤️1
46
#4
💬2  
6
#5
💬1  
5
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次