Deprecated

こ�? API γ―γ€δ»ŠεΎŒοΏ½?パジャーバージョン�? React γ§ε‰Šι™€γ•γ‚Œγ‚‹δΊˆοΏ½?�です。

React 18 では、hydrate は hydrateRoot に�?γζ›γˆγ‚‰γ‚ŒγΎγ—γŸγ€‚React 18 で hydrate を使用すると、をプγƒͺは React 17 γ‚’οΏ½?οΏ½θ‘Œγ—γ¦γ„γ‚‹γ‹οΏ½?γ‚ˆγ†γͺζŒ―γ‚‹θˆžγ„γ«γͺると�?θ­¦ε‘ŠγŒθ‘¨η€Ίγ•γ‚ŒγΎγ™γ€‚θ©³η΄°γ―γ“γ‘γ‚‰γ‚’γ”θ¦§γγ γ•γ„γ€‚

hydrate を使用すると、React 17 δ»₯前�? react-dom/server γ«γ‚ˆγ£γ¦δΊ‹ε‰η”Ÿζˆγ—γŸ HTML γ‚³γƒ³γƒ†γƒ³γƒ„γŒε«γΎγ‚Œγ‚‹γƒ–γƒ©γ‚¦γ‚Ά DOM γƒŽγƒΌγƒ‰ε†…γ«γ€React γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’θ‘¨η€Ίγ§γγΎγ™γ€‚

hydrate(reactNode, domNode, callback?)

γƒͺフゑレンス

hydrate(reactNode, domNode, callback?)

React 17 δ»₯前�?環咃で hydrate を呼び出して、ァーバ環咃で事前に React γŒγƒ¬γƒ³γƒ€γƒΌγ—γŸ HTML に対して React γ‚’γ€Œγ‚’γ‚Ώγƒƒγƒγ€γ—γΎγ™γ€‚

import { hydrate } from 'react-dom';

hydrate(reactNode, domNode);

React は、domNode ε†…γ«ε­˜εœ¨γ™γ‚‹ HTML にをタッチし、そ�?内部�? DOM οΏ½?οΏ½?οΏ½η†γ‚’εΌ•γηΆ™γŽγΎγ™γ€‚React で�?οΏ½ε…¨γ«ζ§‹η―‰γ•γ‚ŒγŸγ‚’γƒ—γƒͺγ«γ―γ€γƒ«γƒΌγƒˆγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’εΌ•ζ•°γ«γ—γŸ hydrate ε‘Όγ³ε‡Ίγ—γŒι€šεΈΈ 1 ぀�?γΏε­˜εœ¨γ—γΎγ™γ€‚

さらに例を見る

εΌ•ζ•°

  • reactNode: ζ—’ε­˜οΏ½?初期 HTML をレンダーする�?γ«δ½Ώη”¨γ•γ‚ŒγŸ β€œReact γƒŽγƒΌγƒ‰β€γ€‚γ“γ‚Œγ―ι€šεΈΈγ€ReactDOM Server οΏ½?γƒ‘γ‚½γƒƒγƒ‰οΌˆδΎ‹οΌšReact 17 οΏ½? renderToString(<App />)οΌ‰γ§γƒ¬γƒ³γƒ€γƒΌγ•γ‚ŒγŸ JSXγ€δΎ‹γˆγ° <App /> にγͺγ‚ŠγΎγ™γ€‚

  • domNode: γ‚΅γƒΌγƒδΈŠγ§γƒ«γƒΌγƒˆθ¦η΄ γ¨γ—γ¦γƒ¬γƒ³γƒ€γƒΌγ•γ‚ŒγŸ DOM 要素。

  • 省η•₯可能 callback: ι–’ζ•°γ€‚ζΈ‘γ•γ‚ŒγŸε ΄εˆγ€React γ―γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?γƒγ‚€γƒ‰γƒ¬γƒΌγ‚·γƒ§γƒ³εΎŒγ«γγ‚Œγ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚

θΏ”γ‚Šε€€

hydrate は null を返します。

注意点

  • hydrate γ―γ€γƒ¬γƒ³γƒ€γƒΌγ•γ‚ŒγŸγ‚³γƒ³γƒ†γƒ³γƒ„γŒγ€γ‚΅γƒΌγƒγ§γƒ¬γƒ³γƒ€γƒΌγ•γ‚ŒγŸγ‚³γƒ³γƒ†γƒ³γƒ„γ¨εŒδΈ€γ§γ‚γ‚‹γ“γ¨γ‚’ζœŸεΎ…γ—γ¦γ„γΎγ™γ€‚React γ―γƒ†γ‚­γ‚Ήγƒˆγ‚³γƒ³γƒ†γƒ³γƒ„οΏ½?οΏ½?η•°γ‚’οΏ½?ζ­£γ§γγΎγ™γŒγ€δΈδΈ€θ‡΄γ―γƒγ‚°γ¨γ—γ¦ζ‰±γ„οΏ½?ζ­£γ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚
  • 開発ヒードでは、React はハむドレーション中�?δΈδΈ€θ‡΄γ«γ€γ„γ¦θ­¦ε‘Šγ—γΎγ™γ€‚δΈδΈ€θ‡΄γŒη™Ίη”Ÿγ—γŸε ΄εˆγ€ε±žζ€§οΏ½?ι•γ„γŒοΏ½?ζ­£γ•γ‚Œγ‚‹δΏθ¨Όγ―γ‚γ‚ŠγΎγ›γ‚“γ€‚γ“γ‚Œγ―γƒ‘γƒ•γ‚©γƒΌγƒžγƒ³γ‚ΉδΈŠοΏ½?理由から重要です。γͺぜγͺらほとんど�?γ‚’γƒ—γƒͺγ§γ―γ€δΈδΈ€θ‡΄γ―γΎγ‚Œγ§γ‚γ‚Šγ€γ™γΉγ¦οΏ½?γƒžγƒΌγ‚―γ‚’γƒƒγƒ—γ‚’ζ€œθ¨Όγ™γ‚‹γ“γ¨γ―ιžεΈΈγ«ι«˜γ‚³γ‚Ήγƒˆγ«γͺるからです。
  • γ‚’γƒ—γƒͺγ«γ―ι€šεΈΈγ€hydrate 呼び出しは 1 γ€γ γ‘ε­˜εœ¨γ—γΎγ™γ€‚γƒ•γƒ¬γƒΌγƒ γƒ―γƒΌγ‚―γ‚’δ½Ώη”¨γ—γ¦γ„γ‚‹ε ΄εˆγ€γƒ•γƒ¬γƒΌγƒ γƒ―γƒΌγ‚―γŒγ“οΏ½?ε‘Όγ³ε‡Ίγ—γ‚’θ‘Œγ†γ‹γ‚‚γ—γ‚ŒγΎγ›γ‚“γ€‚
  • γ‚’γƒ—γƒͺγŒγ‚―γƒ©γ‚€γ‚’γƒ³γƒˆγ§γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹ε½’εΌγ§γ‚γ‚Šγ€δΊ‹ε‰γƒ¬γƒ³γƒ€γƒΌγ•γ‚ŒγŸ HTML がγͺγ„ε ΄εˆγ€hydrate() γ―δ½Ώη”¨γ§γγΎγ›γ‚“γ€‚δ»£γ‚γ‚Šγ«γ€React 17 δ»₯前では render()、React 18 δ»₯降では createRoot() を使用してください。

使用法

hydrate を呼び出して、React γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γ‚΅γƒΌγƒγ§γƒ¬γƒ³γƒ€γƒΌγ•γ‚ŒγŸγƒ–γƒ©γ‚¦γ‚ΆοΏ½? DOM γƒŽγƒΌγƒ‰γ«γ‚’γ‚Ώγƒƒγƒγ—γΎγ™γ€‚

import { hydrate } from 'react-dom';

hydrate(<App />, document.getElementById('root'));

hydrate() γ‚’δ½Ώη”¨γ—γ¦γ€γ‚―γƒ©γ‚€γ‚’γƒ³γƒˆοΏ½?み�?γ‚’γƒ—γƒͺοΌˆγ‚΅γƒΌγƒγ§γƒ¬γƒ³γƒ€γƒΌγ•γ‚ŒγŸ HTML がγͺいをプγƒͺοΌ‰γ‚’γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹γ“γ¨γ―γ‚΅γƒγƒΌγƒˆγ•γ‚Œγ¦γ„γΎγ›γ‚“γ€‚δ»£γ‚γ‚Šγ«γ€React 17 δ»₯前では render()、React 18 δ»₯降では createRoot() を使用してください。

γ‚΅γƒΌγƒγ§γƒ¬γƒ³γƒ€γƒΌγ•γ‚ŒγŸ HTML οΏ½?ハむドレーション

React γ§γ―γ€β€œγƒγ‚€γƒ‰γƒ¬γƒΌγ‚·γƒ§γƒ³ (hydration)” とは、ァーバ環咃�? React γ«γ‚ˆγ£γ¦δΊ‹ε‰γƒ¬γƒ³γƒ€γƒΌγ•γ‚Œγ¦γ„γ‚‹ HTML に React γŒγ€Œγ‚’γ‚Ώγƒƒγƒγ€γ™γ‚‹γ“γ¨γ‚’ζŒ‡γ—γΎγ™γ€‚γƒγ‚€γƒ‰γƒ¬γƒΌγ‚·γƒ§γƒ³δΈ­γ€React γ―ζ—’ε­˜οΏ½?γƒžγƒΌγ‚―γ‚’γƒƒγƒ—γ«γ‚€γƒ™γƒ³γƒˆγƒͺγ‚ΉγƒŠγ‚’γ‚’γ‚Ώγƒƒγƒγ—γ€γ‚’γƒ—γƒͺοΏ½?γƒ¬γƒ³γƒ€γƒΌε‡¦η†γ‚’γ‚―γƒ©γ‚€γ‚’γƒ³γƒˆγ«εΌ•γηΆ™γŽγΎγ™γ€‚

React で�?οΏ½ε…¨γ«ζ§‹η―‰γ•γ‚ŒγŸγ‚’γƒ—γƒͺγ§γ―γ€ι€šεΈΈγ€γ‚’γƒ—γƒͺ全体�?衷動時に 1 ぀�?γ€Œγƒ«γƒΌγƒˆγ€οΏ½?γƒγ‚€γƒ‰γƒ¬γƒΌγ‚·γƒ§γƒ³γ‚’δΈ€εΊ¦γ γ‘θ‘Œγ„γΎγ™γ€‚

import './styles.css';
import { hydrate } from 'react-dom';
import App from './App.js';

hydrate(<App />, document.getElementById('root'));

ι€šεΈΈγ€hydrate γ‚’ε†εΊ¦ε‘Όγ³ε‡Ίγ—γŸγ‚Šγ€θ€‡ζ•°οΏ½?ε ΄ζ‰€γ§ε‘Όγ³ε‡Ίγ—γŸγ‚Šγ™γ‚‹εΏ…θ¦γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚γ“γ“γ‹γ‚‰ε…ˆγ―γ€React γŒγ‚’γƒ—γƒͺケーション�? DOM γ‚’οΏ½?�理しています。UI γ‚’ζ›΄ζ–°γ™γ‚‹γ«γ―γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ― state を使うことにγͺるでしょう。

ハむドレーションに閒する詳細は、hydrateRoot οΏ½?ドキγƒ₯γƒ‘γƒ³γƒˆγ‚’ε‚η…§γ—γ¦γγ γ•γ„γ€‚


γ‚„γ‚€γ‚’εΎ—γͺいハむドレーション不一致エラー�?ζŠ‘εˆΆ

γ‚΅γƒΌγƒγ¨γ‚―γƒ©γ‚€γ‚’γƒ³γƒˆοΏ½?ι–“γ§γ€ε˜δΈ€οΏ½?要素�?ε±žζ€§γ‚„γƒ†γ‚­γ‚Ήγƒˆγ‚³γƒ³γƒ†γƒ³γƒ„γŒγ‚„γ‚€γ‚’εΎ—γͺい理由で異γͺγ‚‹ε ΄εˆοΌˆγŸγ¨γˆγ°γ€γ‚Ώγ‚€γƒ γ‚Ήγ‚Ώγƒ³γƒ—γͺど)、ハむドレーション�?δΈδΈ€θ‡΄θ­¦ε‘Šγ‚’ζŠ‘εˆΆγ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚

要素�?γƒγ‚€γƒ‰γƒ¬γƒΌγ‚·γƒ§γƒ³θ­¦ε‘Šγ‚’ζŠ‘εˆΆγ™γ‚‹γ«γ―γ€suppressHydrationWarning={true} γ‚’θΏ½εŠ γ—γΎγ™γ€‚

export default function App() {
  return (
    <h1 suppressHydrationWarning={true}>
      Current Date: {new Date().toLocaleDateString()}
    </h1>
  );
}

γ“γ‚Œγ―ε˜δΈ€γƒ¬γƒ™γƒ«οΏ½?ζ·±γ•γΎγ§γ—γ‹ζ©Ÿθƒ½γ›γšγ€ιΏι›£γƒγƒƒγƒγ¨γ—γ¦οΏ½?δ½Ώη”¨γ‚’ζ„ε›³γ—γ¦γ„γΎγ™γ€‚ιŽεΊ¦γ«δ½Ώη”¨γ—γͺγ„γ§γγ γ•γ„γ€‚γ“γ‚Œγ‚’δ½Ώη”¨γ—γ¦γ‚‚γƒ†γ‚­γ‚Ήγƒˆγ‚³γƒ³γƒ†γƒ³γƒ„δ»₯ε€–οΏ½?場合は React は違いを�?ζ­£γ—γ‚ˆγ†γ¨γ―γ—γͺγ„γŸγ‚γ€ε°†ζ₯οΏ½?ζ›΄ζ–°γΎγ§δΈ€θ²«ζ€§γŒδΏγŸγ‚Œγͺγ„ε―θƒ½ζ€§γŒγ‚γ‚ŠγΎγ™γ€‚


γ‚―γƒ©γ‚€γ‚’γƒ³γƒˆγ¨γ‚΅γƒΌγƒγ§η•°γͺるコンテンツ�?処理

γ‚΅γƒΌγƒγ¨γ‚―γƒ©γ‚€γ‚’γƒ³γƒˆγ§ζ„ε›³ηš„γ«η•°γͺγ‚‹γ‚‚οΏ½?γ‚’γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹εΏ…θ¦γŒγ‚γ‚‹ε ΄εˆγ€2 ε›žγ«εˆ†γ‘γŸγƒ¬γƒ³γƒ€γƒΌγ‚’θ‘Œγ†γ“γ¨γŒγ§γγΎγ™γ€‚γ‚―γƒ©γ‚€γ‚’γƒ³γƒˆγ§η•°γͺγ‚‹γ‚‚οΏ½?γ‚’γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ―γ€isClient οΏ½?γ‚ˆγ†γͺ state 倉数をθͺ­γΏε–γ‚‹γ‚ˆγ†γ«γ—γ€γ“οΏ½?ε€‰ζ•°γ‚’γ‚¨γƒ•γ‚§γ‚―γƒˆε†…γ§ true に設�?οΏ½γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚

import { useState, useEffect } from "react";

export default function App() {
  const [isClient, setIsClient] = useState(false);

  useEffect(() => {
    setIsClient(true);
  }, []);

  return (
    <h1>
      {isClient ? 'Is Client' : 'Is Server'}
    </h1>
  );
}

こ�?ζ–Ήζ³•γ§γ―γ€εˆε›žοΏ½?γƒ¬γƒ³γƒ€γƒΌγ―γ‚΅γƒΌγƒγ¨εŒγ˜γ‚³γƒ³γƒ†γƒ³γƒ„γ‚’γƒ¬γƒ³γƒ€γƒΌγ—γ€δΈδΈ€θ‡΄γ‚’ε›žιΏγ—γΎγ™γŒγ€θΏ½εŠ οΏ½?γƒ¬γƒ³γƒ€γƒΌγŒγƒγ‚€γƒ‰γƒ¬γƒΌγ‚·γƒ§γƒ³οΏ½?η›΄εΎŒγ«εŒζœŸηš„γ«θ‘Œγ‚γ‚ŒγΎγ™γ€‚

落とし穴

こ�?γ‚’γƒ—γƒ­γƒΌγƒγ§γ―γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ 2 ε›žγƒ¬γƒ³γƒ€γƒΌγ™γ‚‹εΏ…θ¦γŒγ‚γ‚‹γŸγ‚γƒγ‚€γƒ‰γƒ¬γƒΌγ‚·γƒ§γƒ³γŒι…γγͺγ‚ŠγΎγ™γ€‚δ½Žι€ŸγͺζŽ₯ηΆšγ«γŠγ‘γ‚‹γƒ¦γƒΌγ‚Άδ½“ι¨“γ«ζ³¨ζ„γ—γ¦γγ γ•γ„γ€‚JavaScript γ‚³γƒΌγƒ‰γ―εˆζœŸγƒ¬γƒ³γƒ€γƒΌγ•γ‚ŒγŸ HTML γ‚ˆγ‚Šγ‚‚γ‹γͺγ‚Šι…γθͺ­γΏθΎΌγΎγ‚Œγ‚‹ε ΄εˆγŒγ‚γ‚‹γŸγ‚γ€γƒγ‚€γƒ‰γƒ¬γƒΌγ‚·γƒ§γƒ³η›΄εΎŒγ«η•°γͺγ‚‹ UI γ‚’γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹γ¨γƒ¦γƒΌγ‚Άγ«δΈεΏ«ζ„Ÿγ‚’δΈŽγˆγ‚‹γ‹γ‚‚γ—γ‚ŒγΎγ›γ‚“γ€‚