์ต์ ์ฃผ์ ๋ฒ์ ์๋ Automatic Batching์ ๊ฐ์ ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ์ ์ฌํญ, startTransition
๊ณผ ๊ฐ์ ์๋ก์ด API, Suspense
๋ฅผ ์ง์ํ๋ ์คํธ๋ฆฌ๋ฐ ์๋ฒ ์ธก ๋ ๋๋ง์ด ํฌํจ๋๋ค.
Automatic Batching
React
์ ๋ฐฐ์น(Batching
)๋, ๋ ๋์ ์ฑ๋ฅ์ ์ํด ์ฌ๋ฌ ์ํ ์
๋ฐ์ดํธ๋ฅผ ํ๋์ re-rendering
์ผ๋ก ๋ฌถ๋ ์์
์ด๋ค.
// Before: only React events were batched.
setTimeout(() => {
setCount(c => c + 1);
setFlag(f => !f);
// React will render twice, once for each state update (no batching)
}, 1000);
// After: updates inside of timeouts, promises,
// native event handlers or any other event are batched.
setTimeout(() => {
setCount(c => c + 1);
setFlag(f => !f);
// React will only re-render once at the end (that's batching!)
}, 1000);
automatic batching์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ReactDOM.render
๋ฅผ ReactDOM.createRoot
๋ก ๋ณ๊ฒฝํด์ผํ๋ค.
Concurrency
React 18๋ถํฐ๋ startTransition
API๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ์
๋ฐ์ดํธ๋ฅผ ๋ช
์์ ์ผ๋ก ๊ตฌ๋ถํ์ฌ ์งํํ ์ ์๊ฒ ๋์๋ค.
Urgent update(๊ธด๊ธ ์
๋ฐ์ดํธ)
๋ ์
๋ ฅ, ํด๋ฆญ, ๋๋ฅด๊ธฐ ๋ฑ๊ณผ ๊ฐ์ ์ง์ ์ ์ธ ์ํธ ์์ฉ (ex. text ์
๋ ฅ)
Transition update(์ ํ ์
๋ฐ์ดํธ)
๋ UI๋ฅผ ํ ๋ณด๊ธฐ์์ ๋ค๋ฅธ ๋ณด๊ธฐ๋ก ์ ํ(ex. text ์
๋ ฅ๋์์๋ ๋ณด์ด๋ ๊ฒ์๊ฒฐ๊ณผ)
import { startTransition } from 'react';
// Urgent: Show what was typed
setInputValue(input);
// Mark any state updates inside as transitions
startTransition(() => {
// Transition: Show the results
setSearchQuery(input);
});
startTransition
๋ก ๋ํ๋ ์
๋ฐ์ดํธ๋ urgentํ์ง ์์๊ฒ์ผ๋ก ์ฒ๋ฆฌ๋๋ฉฐ, ํด๋ฆญ์ด๋ key down๊ณผ ๊ฐ์ ๋ urgentํ ์
๋ฐ์ดํธ ๋ฐ์ํ ๊ฒฝ์ฐ ์ค๋จ๋๋ค.
Suspense
<Suspense />
๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ์์ ์์ง ํ์ํ ์ค๋น๊ฐ ๋์ง ์์ ๋ถ๋ถ์ ๋ก๋ฉ์ํ๋ฅผ ์ง์ ํ ์ ์๋ค. ์์ ์ ์ธ๊ธ๋์๋ React.lazy
์ ํจ๊ป ์ฌ์ฉํ๋ ์ ํ๋ Suspense์์ ์งํํ์ฌ React 18์์ ๊ธฐ๋ฅํ์ฅ์ ํ์๋ค.
React 18์ suspense๋ transition API ๊ฒฐํฉํ ์ฌ ์ฌ์ฉํ ๋ ๊ฐ์ฅ ์ฌ์ฉ์ฑ์ด ์ข๋ค. transition ์ค์ ์ผ์ ์ค๋จ์ ํ๊ฒ๋๋ฉด ์ด๋ฏธ ๋ณด์ด๋ ์ปดํฌ๋ํธ๊ฐ fallback(๋กํ
์ปดํฌ๋ํธ)์ผ๋ก ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋ค. ๋์ React๋ ์ถฉ๋ถํ ๋ฐ์ดํฐ๊ฐ ๋ก๋๋ ๋๊น์ง rendering์ ์ง์ฐํ๋ค.
import { Suspense } from 'react';
<Suspense fallback={<PageGlimmer />}>
<RightColumn>
<ProfileHeader />
</RightColumn>
<LeftColumn>
<Suspense fallback={<LeftColumnGlimmer />}>
<Comments />
<Photos />
</Suspense>
</LeftColumn>
</Suspense>
New APIs
createRoot
:rendering
๋๋unmount
ํ root๋ฅผ ๋ง๋๋ ์ api.ReactDOM.render
๋์ ์ฌ์ฉํ๊ณ react 18 ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด ํ์hydrateRoot
: server rendering์ hydrateํ๋ ์๋ก์ด api. react 18 ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด ํ์
(์ ๋๊ฐ์ง api ๋ชจ๋ react๊ฐ rendering ๋๋ hydrating ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์๋ ๋ก๊ทธ๋ฅผ ํ์ธํ ์ ์๋onRecoverableError
์ต์ ์ ์ ๊ณตํ๋ค)renderToPipeableStream
: node ํ๊ฒฝ์์ ์คํธ๋ฆฌ๋ฐ์ ์ํ ์๋ก์ด api
์์์ ์์๋ณธ๊ฒ๋ค ์ด์ธ์ ์๋ก์ด hooks (useId
, useTransition
, useDeferredValue
, useSyncExternalStore
, useInsertionEffect
) ๋ค๋ ์ถ๊ฐ๋์๋ค. ์์ธํ ๋ณ๊ฒฝ์ฌํญ์ ๋ํด ๊ถ๊ธํ๋ค๋ฉด ๊ณต์๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค. https://reactjs.org/blog/2022/03/29/react-v18.html