首頁·報錯訊息

react 18+ · JavaScript

報錯原文

Hydration failed because the initial UI does not match what was rendered on the server

這是什麼意思

伺服器發來的 HTML 與瀏覽器首次算繪出來的結果不一致,React 無法把兩者對接。在算繪過程中用 new Date() 或 Math.random()、讀 localStorage、按 window 寬度畫不同的東西,都注定給出兩個不同的答案;瀏覽器會悄悄糾正的標籤也一樣,比如 <p> 裡套 <div>。規矩是:首次算繪要畫出和伺服器完全相同的東西,差異留到 useEffect 跑完之後再改。代價是那部分會晚一瞬間出現,並且不在伺服器產生的 HTML 裡。React 19 把同樣的情形寫作 "the server rendered HTML didn't match the client",還會印出哪裡不一致的 diff。

怎麼修

這個沒有一行命令能解決。說明裡寫了該看哪裡。

來自
react 18+
JavaScript
15

瀏覽器和 node 的錯誤通常只告訴你什麼壞了,不告訴你那個值為什麼變成這樣——你讀了 undefined、它不是函式、它不是 JSON——所以該修的地方在拋錯那一行的上游;只用 ?. 和預設值把那一行按住,同樣的問題會在更遠的地方、以更難辨認的樣子回來。

怎麼讀報錯

  • 從第一行往下讀。越往下越是工具內部的事,起因通常寫在最上面。
  • 有檔名和行號就從那裡查——不是堆疊最上面那一格,而是最上面那條提到你自己寫的檔案的行。
  • 把報錯原文照樣去搜,但先去掉你自己的路徑和變數名,正是那些讓搜尋比對不上。
  • 同一種情況在不同版本裡措辭不同。結果不對頭,就把版本號一起加進查詢。
  • 貼上修法之前,先確認它會丟掉什麼。這裡面有些是不能收回的。

常見問題

Q. “Hydration failed because the initial UI does not match what was rendered on the server” 是什麼意思?

伺服器發來的 HTML 與瀏覽器首次算繪出來的結果不一致,React 無法把兩者對接。在算繪過程中用 new Date() 或 Math.random()、讀 localStorage、按 window 寬度畫不同的東西,都注定給出兩個不同的答案;瀏覽器會悄悄糾正的標籤也一樣,比如 <p> 裡套 <div>。規矩是:首次算繪要畫出和伺服器完全相同的東西,差異留到 useEffect 跑完之後再改。代價是那部分會晚一瞬間出現,並且不在伺服器產生的 HTML 裡。React 19 把同樣的情形寫作 "the server rendered HTML didn't match the client",還會印出哪裡不一致的 diff。

Q. 怎麼修?

沒有一行命令能解決。上面的說明寫了該看哪裡。

Q. 這是哪個工具報的?

react 18+。它屬於JavaScript,報錯原文有 15 個詞。

相關報錯