iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0
Modern Web

React 走出新手村 系列 第 27

React 走出新手村 — React Server Components

  • 分享至 

  • xImage
  •  

緣起

官方介紹影片連結,我也是做這個主題才知道,原來這個概念已經存在那麼久了,那我們快速講解他的成因吧!

影片整理

目的
https://ithelp.ithome.com.tw/upload/images/20230923/20129020xekpQQ309w.png
Dan Abramov 說出了我們前端開發當中需要權衡的三個要點,良好的用戶體驗、不複雜的維護成本及提升效能。

接著他提出了一個例子來闡述開發上的痛點
https://ithelp.ithome.com.tw/upload/images/20230923/20129020D3ZBAPJiN7.png

這是一個很常見的大包小組件組合,問題在於每個組件都需要不同的API回傳資料,但就體驗而言我們更希望這些組件的渲染盡量同時,不同時的話會有要等回傳才能渲染的問題,而且如果關注性能的話,我們也會考慮並行的去 fetch ,所以我們通常會把 fetch 的邏輯放到頂層,然後再透過 Props 或 Context 傳遞下去。
https://ithelp.ithome.com.tw/upload/images/20230923/20129020V4RLC5fEAL.png

這樣會把可維護性變差,除了看起來噁心,每個元件從邏輯上就不那麼解耦了,我們所以我們會考慮每個元件自己處理 fetch 邏輯。
https://ithelp.ithome.com.tw/upload/images/20230923/20129020N9yCrD12wO.png
但是這樣的處理體驗又會變差。

我們會需要從伺服器端 fetch 資料,是因為我們把所有渲染操作放到了用戶端,那如果我們把部分渲染邏輯放伺服器端呢?
https://ithelp.ithome.com.tw/upload/images/20230923/201290206znQiOySi8.png
https://ithelp.ithome.com.tw/upload/images/20230923/20129020Hk3e40pxvo.png
這就是 React Server Component 的構想。

那麼現在你可以透過 Next 13 輕鬆體驗到 Server component 的好處。

前後差異點

下面我整理了一些他與 Next 在使用之前與使用之後的一些差異點:

  1. 伺服器端渲染的限制
    • 伺服器端渲染(SSR)的JavaScript組件會在伺服器上轉換為HTML字符串,並傳送到瀏覽器,以實現快速的首次有意義內容繪製。
    • 然而,JavaScript仍然需要在用戶進行互動時進行提取,通常通過hydration步驟實現。
    • SSR通常用於初始頁面載入,因此在hydration完成後,通常不會再次使用。
  2. React Server Component
    • React 的 server component 是對伺服器端渲染的補充,可在不增加 JavaScript 大小的情況下將渲染過程進行到中介抽象格式。
    • server component 與 SSR 並非替代關係,而是一種新的渲染方法,可以快速以中介格式渲染,然後利用 SSR 基礎設施將其轉換為 HTML,從而實現快速的首次繪製(FCP)。
  3. 自動代碼拆分(code splitting)
    • 自動代碼拆分是一種最佳實踐,以根據用戶需要進行動態拆分,減少傳送到客戶端的代碼量。
    • 伺服器元件引入自動代碼拆分,將所有正常引入視為可能的拆分點,並允許開發人員更早地選擇要使用的組件,從而讓客戶端更早地在渲染過程中提取組件。
  4. Server component與Next.js SSR的區別
    • Server component 不會將代碼傳送到客戶端,消除了傳送到客戶端的SSR中的組件代碼,從而減少了客戶端JavaScript捆綁的大小。
    • Server component 允許在 Dom tree 的任何位置訪問後端,而不僅僅是頂層頁面,這擴展了後端訪問的範圍。
    • 可以在保持客戶端 Dom tree 內的狀態的情況下,重新獲取伺服器元件,因為主要傳輸機制比僅限於 HTML 更豐富。

總結

這些重點突顯了伺服器元件作為 SSR 補充的作用,以及它對於解決 SSR 的限制和優化客戶端性能的重要性。
下面我們來總結 server component 和一般 client component 的差異:

What do you need to do? Server Component Client Component
Fetch data
Access backend resources (directly)
Keep sensitive information on the server (access tokens, API keys, etc)
Keep large dependencies on the server / Reduce client-side JavaScript
Add interactivity and event listeners (onClick(), onChange(), etc)
Use State and Lifecycle Effects (useState(), useReducer(), useEffect(), etc)
Use browser-only APIs
Use custom hooks that depend on state, effects, or browser-only APIs
Use React Class components
以上表格內容取自Next官方文件

這些就是在 Next app router 之下的機制,下一篇我們來理解一下App router的處理機制。

給全新手的大禮包

React基本Hook教學

參考資料

patterns
掘金文章
發布影片
react doc


上一篇
React 走出新手村 — Next SSR
下一篇
React 走出新手村 — Next App Router
系列文
React 走出新手村 31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言