hydrate
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> ); }
γοΏ½?ζΉζ³γ§γ―γεεοΏ½?γ¬γ³γγΌγ―γ΅γΌγγ¨εγγ³γ³γγ³γγγ¬γ³γγΌγγδΈδΈθ΄γειΏγγΎγγγθΏ½ε οΏ½?γ¬γ³γγΌγγγ€γγ¬γΌγ·γ§γ³οΏ½?η΄εΎγ«εζηγ«θ‘γγγΎγγ