์ด ๋ฌธ์ ๋ฅผ ์ฌ์ฉํ์ฌ Suspense๋ฅผ ์คํ ์์ค๋ก ๋ฆด๋ฆฌ์คํ๊ธฐ ์ํ ๋๋จธ์ง ์์ ์ ์ถ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
AsyncMode
์์ unstable_
์ ๋์ฌ ์ ๊ฑฐ(์๋ง๋?)<div hidden>
์ ํจ๊ป ์๋ํ๋์ง ํ์ธ [#13089]lazyLoadComponent
?flushAll
, yield
๋ฑ์ ๋ํ ๊ณต๊ฐ API ๋ง๋ฌด๋ฆฌReact.Placeholder
๊ด๋ จ: ํ์ ์ฌ๋ผ์ด์ฑ ์ฐ์ฐ (https://github.com/facebook/react/issues/13306)
unstable_AsyncMode
๋ ธ์ถ(์๋ง๋?)
์ด๊ฑฐ ์ด๋ฏธ ๋ ธ์ถ ๋๊ฑฐ ์๋?
unstable_
์ ๊ฑฐ๋ฅผ ์๋ฏธํ์ต๋๋ค.
์ด๋ฆ ์๋ ์ฝ๋ ๋ถํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์คํ ์์ค๋ฅผ ๊ธฐ๋ํฉ๋๋ค ๐ฏ
[์ฐ์ฐ]์(๋) ๋ฌด์จ ๋ป์ธ๊ฐ์?๐คโ๏ธ
์ฆ, ์ฌ๋ฌ ํ๋ก์ ํธ/ํจํค์ง/๋๊ตฌ์ ์ํฅ์ ๋ฏธ์น๋ ๊ธฐ๋ฅ์ ๋๋ค.
@ghoullier ์๊ฒ ์ต๋๋ค , ์ ๋ง ๊ฐ์ฌํฉ๋๋ค!
@acdlite , ๊ฐ์ฅ ์ ์ค๋นํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง๋ฌธ์ ๋๋ค. ์ด๋ค ์ข ๋ฅ์ ํ์๋ผ์ธ๋ ์๊ตฌํ๊ฑฐ๋ ๊ธฐ๋ํ์ง ์๊ณ ๊ถ๊ธํฉ๋๋ค.
ํ์ฌ ์ด๋ฌํ ๊ธฐ๋ฅ์ด React 16์ ํฌํจ๋๊ณ 16.3์ ํฌํจ๋ ์๋ก์ด Context API์ ๊ฐ์ด ์ ์ง์ ์ผ๋ก ์ฝ๊ฒ ์ฑํํ ๊ฒ์ผ๋ก ์์ํ์ญ๋๊น?
์๋๋ฉด React๋ฅผ v17๋ก ๋ฐ์ด๋ถ์ด๊ณ ์ฑํํ๋ ค๋ฉด ๋ ๋ง์ ์์ ์ด ํ์ํ๋ค๊ณ ์๊ฐํ์ญ๋๊น?
๊ทํ์ ๋ชฉ๋ก์ ์๋ ๊ฑฐ์ ๋ชจ๋ ํญ๋ชฉ๊ณผ ํฌ๊ฒ ๊ต์ฐจํ๋ ๋ก๋๋งต์ ์์ ์ค์ด๊ณ ์ด๋ฅผ ๊ฐ์ฅ ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ง๋ฌธํฉ๋๋ค.
๋ํ ๊ฐ์ฅ ์ ์ค๋นํ๋ ๋ฐฉ๋ฒ์ ๋ํ ํ์ด ์์ต๋๊น?
(์ด ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ด ๋ค๋ฅธ ๊ณณ์์ ๋๋ฝ๋ ๊ฒฝ์ฐ ์ฌ๊ณผ๋๋ฆฝ๋๋ค)
@JedWatson ์ ์ง๋ฌธ์ ๋ค๋ฅธ ์ง๋ฌธ ์ถ๊ฐ:
16.4.0-alpha.0911da3
์
๋๋ค.)๊ฐ์ฌํฉ๋๋ค! โค๏ธ
IMO, ๊ทธ๋ค์ ์๋ฅํ๊ธฐ ์ ์ ์ด์ ๊ณผ ๊ฐ์ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์ ๊ณตํ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํฐ ๋ณํ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ฌด ๋ง์ด ์ค๋นํ ํ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค(์: redux fetch with suspense์ ๊ฐ์ด ํ์ฌ ๊ดํ๊ณผ ๋ค๋ฅด๊ฒ/์ถฉ๋ํ ์ ์๋ ๋ง์ ๊ธฐ๋ฅ์ด ์์ง๋ง codemod ๋๋ ์ฌ์ด ์บก์ํ๊ฐ ์์ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ์ํด fb์๋ 3W+ ๊ตฌ์ฑ ์์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ @acdlite (ZEIT์ @gaearon (์์ด์ฌ๋๋์ ํด๋ผ์ด์ธํธ ์์คํ์ค์ ๋ํด)์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ๋ณด๋ฉด ๋๋ฌด ๋ง์ด ๊ฑฑ์ ํ ํ์๊ฐ ์๊ณ ์นจ๋ต์ ์ด์ง ์๋ค๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ์ ์ฅ์์์ 'Umbrella' ํค๋ฅผ ๊ฒ์ํ๋ฉด #8830 ๋ฐ #12152์ ๊ฐ์ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
AFAIK์ ์ต์ ๋ฆด๋ฆฌ์ค๋ 2์์ 16.4.0-alpha.0911da3์ ๋๋ค.
IIRC, ์ด๊ฒ์ ์ค์๋์ ๋๊น?
@JedWatson ์ด ๋๊ธ์ ๊ฐ๋ฐ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋น๋๊ธฐ์์ผ๋ก ์์ ํ์ง ํ์ธํ๊ธฐ ์ํด ์ํํด์ผ ํ๋ ์์ ์ ์ดํด
์ ๋ ํ์ด์ค๋ถ์์ ์์คํ์ค ๋ชจ๋๊ณผ ์๋ก์ด API๋ฅผ ์ถ์ํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. @acdlite ๊ฐ ๋ค๋ฅธ Facebook ์์์ ๊ฒฝํ์ ๋ํ ์๊ฐ์ ๊ณต์ ํ๊ณ @JedWatson์ ๋ช ๊ฐ์ง ์ง๋ฌธ์ ๋ตํ๊ณ ์ถ์ต๋๋ค.
ํ์ฌ ์ด๋ฌํ ๊ธฐ๋ฅ์ด React 16์ ํฌํจ๋๊ณ 16.3์ ํฌํจ๋ ์๋ก์ด Context API์ ๊ฐ์ด ์ ์ง์ ์ผ๋ก ์ฝ๊ฒ ์ฑํํ ๊ฒ์ผ๋ก ์์ํ์ญ๋๊น?
React 16 ๋๋ 17๊ณผ ํจ๊ป ์ฌ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. React ํ์ ๋ฐ๋ฅด๋ฉด ์ฌํด ๋ง ์ด์ ์ ์ถ์๋ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฉฐ ์ด๋ Facebook์์ ์ผ๋ง๋ ์ ์คํ๋๊ณ ๊ด๋ จ API๊ฐ ์ค๋น๋์ด ์๋์ง ๋๋ ์๋๋ค. ๊ทธ๋ฌ๋ ์ฝ๋ ๋ฉด์์๋ ์ฑํํ๊ธฐ ์ฌ์ธ ๊ฒ์ด๋ผ๊ณ ๋ง์๋๋ฆฌ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ์๋ํ๋ฉด ์ฐ๋ฆฌ๋ facebook์์ ๊ฝค ์ค๋ซ๋์ ์คํ์ ํด์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์์คํ์ค ๊ธฐ๋ฅ์ ๊ธฐ์กด ์ฝ๋๋ฒ ์ด์ค์์ ๊ณ์ ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ (๋น๋๊ธฐ ๋ ๋๋ง๊ณผ ๊ฐ์) ์ถ๊ฐ ๋ณ๊ฒฝ์ ํตํด ์๋ก์ด ๊ธฐ๋ฅ์ด ์ ๊ณตํ๋ ๋ ๋ง์ ๋ณด๋์ค๋ฅผ ์ป๊ฒ ๋ฉ๋๋ค.
(์ค๋ ์์ฑ๋ ์ฝ๋ ์ธก๋ฉด์์ ํฅํ React์ ๋ํ ์ด๋ฌํ ๊ฐ์ ์ฌํญ๊ณผ ํธํ๋๊ธฐ๋ฅผ ์ํ๋) ํด๋ฆฌํ/๊ธฐ์ ๋ฑ์ ๊ฐ์ฅ ์ ์ค๋นํ๋ ๋ฐฉ๋ฒ์ ๋ํ ํ์ด ์์ต๋๊น?
๋๋ ๋ง์ด๊ทธ๋ ์ด์ ์ด ๋ค์ ์ ์ง์ ์ด๊ณ ์ ์ง์ ์ด๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. @NE-SmallTown์ด ๋งํ๋ฏ์ด ์ฐ๋ฆฌ๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋์ ํ๊ณ ์ถ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ํ ์ฐ๋ฆฌ๊ฐ ๋๋ฌด ํฐ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ํ์ด์ค๋ถ์ ๋กค์์ํ๋ ๊ฒ๋ ๊ณ ํต์ค๋ฌ์ธ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ง๊ธ๊น์ง๋ ๋กค์์์ด ์ํํ์ผ๋ฉฐ ์ถ๊ฐ ๋ณ๊ฒฝ์ ์ํํ ํ์๊ฐ ์์ต๋๋ค.
@JedWatson
ํ์ฌ ์ด๋ฌํ ๊ธฐ๋ฅ์ด React 16์ ํฌํจ๋๊ณ 16.3์ ํฌํจ๋ ์๋ก์ด Context API์ ๊ฐ์ด ์ ์ง์ ์ผ๋ก ์ฝ๊ฒ ์ฑํํ ๊ฒ์ผ๋ก ์์ํ์ญ๋๊น?
์ฆ๋ถ. ํญ์ ์ ์ง์ ์ผ๋ก :) ๊ทธ๋ ์ง ์์ผ๋ฉด Facebook์์ ์ด๊ฒ์ ๋ฐฐ์กํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๋ด๊ฐ ๊ธฐ๋ํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
| | ํด๋ผ์ด์ธํธ | ์๋ฒ ์ธก ๋ ๋๋ง |
|-----|----------------------------|-- ------------------------------------------|
| ์์คํ์ค | ์ด๋์๋ ์๋* | ๊ธฐ์กด ์๋ฒ ๋ ๋๋ฌ์ ๋์ผํ ์ ์ฝ ์กฐ๊ฑด |
| ๋น๋๊ธฐ ๋ ๋๋ง | <AsyncMode>
๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ | ๊ธฐ์กด ์๋ฒ ๋ ๋๋ฌ์ ๋์ผํ ์ ์ฝ ์กฐ๊ฑด |
*๋๊ธฐํ ๋ชจ๋์์ delayMs
๋ ํญ์ 0
์
๋๋ค. ์๋ฆฌ ํ์์๊ฐ ์ฆ์ ํ์๋ฉ๋๋ค.
Suspense๋ ๊ธฐ์กด ๊ตฌ์ฑ ์์๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์๋ํฉ๋๋ค. ํ๋ ์ฐ๋ฆฌ๋ <StrictMode>
ํธํ์ฑ์ด ํ์ํ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ๋ด๋ถ ํ
์คํธ ์ค์ ์๊ฒฉ ๋ชจ๋๋ก ์
๊ทธ๋ ์ด๋ํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ ์ค ํ๋๋ Suspense๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋ญ๊ณ ๊ธฐ ๋ฌ๊ฑ ๋๋ ๋ง. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์๊ฒฉ ๋ชจ๋ ๋ฐ์์๋ ์๋ํ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๋ค.
๋ฐ๋ผ์ ์ฌ์ฉ์๋ ๋น๋๊ธฐ ๋ ๋๋ง์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ ์ค๋น๊ฐ ๋๊ธฐ๋ ์ ์ Suspense๋ก ๋ง์ด๊ทธ๋ ์ด์
์ ์์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ํ์ ํธ๋ฆฌ๊ฐ ์ค๋น๋๋ฉด <AsyncMode>
๋ก ๋ํํ์ฌ ์ตํธ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ ์ฑ์ ๊ฒฝ์ฐ ์ด์ผ๊ธฐ๊ฐ ๋ค๋ฆ
๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋น๋๊ธฐ์์ผ๋ก ์ ํํฉ๋๋ค. ๋น๋๊ธฐ ์ ์ฉ์ธ ์๋ก์ด ๋ฃจํธ API( ReactDOM.render
๋์ฒด)๋ฅผ ์๊ฐํฉ๋๋ค.
๋ง์ ํ์ฌ ํ๋ ์์ํฌ(Redux, Apollo, React Router...)๊ฐ ๋น๋๊ธฐ ๋ชจ๋์์ ์ ๋๋ก ์๋ํ์ง ์์ ์ ์๋ ์ด๊ธฐ ๋ฆด๋ฆฌ์ค ์ดํ ์ด์ํ ๊ธฐ๊ฐ์ด ์์ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ํ๋์ ์ ์์ ์ง์ฅ์ ์ค ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ด๋์ด๋ ์๋ก์ด ๊ธฐ๋ฅ์ด ๋๋ฌด ๋งค๋ ฅ์ ์ด์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋น๋๊ธฐ ํธํ ๋์์ผ๋ก ์ ์ํ๊ฑฐ๋ ๋์ฒดํ๋ ๋ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ์ง ์์ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๋๋ค.
๋ํ ๊ฐ์ฅ ์ ์ค๋นํ๋ ๋ฐฉ๋ฒ์ ๋ํ ํ์ด ์์ต๋๊น?
๋ชจ๋ ๊ฒ์ <StrictMode>
๊ฐ์ธ๊ณ ๊ฒฝ๊ณ ๊ฐ ์๋์ง ํ์ธํ์ญ์์ค. ๋ฆด๋ฆฌ์ค๊ฐ ๊ฐ๊น์์ง๋ฉด ๋ ์์ธํ ๋ง์ด๊ทธ๋ ์ด์
๊ฐ์ด๋๊ฐ ์ ๊ณต๋ฉ๋๋ค.
๋ง์ ํ์ฌ ํ๋ ์์ํฌ(Redux, Apollo, React Router...)๊ฐ ๋น๋๊ธฐ ๋ชจ๋์์ ์ ๋๋ก ์๋ํ์ง ์์ ์ ์๋ ์ด๊ธฐ ๋ฆด๋ฆฌ์ค ์ดํ ์ด์ํ ๊ธฐ๊ฐ์ด ์์ ๊ฒ์ ๋๋ค.
Apollo๋ ์ด์ํ์ง ์์ต๋๋ค. ์ค๋น๊ฐ ๋์ด ์์ต๋๋ค! ๐บ๐ณ
์ง์ฌ์ผ๋ก ์ฐ๋ฆฌ๋ :heart: ๋ชจ๋ ๊ฒ์ด React์ด๋ฏ๋ก ์ด๊ธฐ ๋ฆด๋ฆฌ์ค์์ ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ถํฉํ๋์ง ํ์ธํ๋ ๊ฒ์ ์ต์ฐ์ ์์์ผ ๋ฟ๋ง ์๋๋ผ ๋งค์ฐ ํฅ๋ถ๋๋ ์ผ์ด๊ธฐ๋ ํฉ๋๋ค! ์ด @acdlite์ ๋ํ ๋ชจ๋ ๋๋ผ์ด ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
Redux ํ์ด React-Redux์ ๋ํ ๋น๋๊ธฐ ํธํ์ฑ ์์ ์ ํ๊ณ ์๋ค๊ณ ๋งํ๊ฒ ์ต๋๋ค.
https://github.com/reduxjs/react-redux/issues/950 ์์ ์ ์ฌ์ ๋ก๋๋งต์ ์ ์ํ์ต๋๋ค. TL;DR:
<StrictMode>
์ ํจ๊ป ์๋ํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค(ํ์ฌ PR: https://github.com/reduxjs/react-redux/pull/980 ).<Provider>
๋ฐ connect()
). ์ด๊ฒ์ด ๋น๋๊ธฐ ๋ ๋๋ง์์ ์ผ๋ง๋ ์ ์๋ํ๋์ง ์ดํด๋ณด๊ณ ์์ผ๋ก์ ์ต์ ์ ๊ฒฝ๋ก๋ฅผ ์์๋ผ ๊ฒ์
๋๋ค. (๋์ ์ด์ ๊ฐ๋
์ฆ๋ช
PR์ https://github.com/reactjs/react-redux/pull/898 ์ ์์ง๋ง 5.1 ์์
์์ ๋ฐฐ์ด ๋ค๋ฅธ ๊ตํ์ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ ์คํํ ๊ฒ์
๋๋ค.) ์ด ๋ฆด๋ฆฌ์ค์๋ ์๋ก์ด ์ปจํ
์คํธ๊ฐ ํ์ํ๊ณ ์์ง ์ถ์๋์ง ์์ "๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋์์ ์ปจํ
์คํธ ์ฝ๊ธฐ" PR์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์ต์ํ React 16.5๊ฐ ํ์ํฉ๋๋ค.์ฐ๋ฆฌ๋ WIP์ ๋ ๋ง์ ๊ด์ฌ์ ๊ฐ์ ธ์ค์ ๊ณ ๋ง๊ณ ์ฌ๋๋ค์ด Redux๋ฅผ React Suspense ๋ฐ ๋น๋๊ธฐ ๋ ๋๋ง๊ณผ ํจ๊ป ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ ๋ง์ ํผ๋๋ฐฑ๊ณผ ํ ๋ก ์ ์ ๊ณตํ์ฌ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์ ๋๋ก ๋ค๋ฃจ์ด์ง๋๋ก ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ฐ๋ฆฌ๋ ๋ํ ์ ํํ ์ด๋ค ์ ์ฝ ์กฐ๊ฑด์ผ๋ก ์์ ํด์ผ ํ๋์ง์ ๋ํด React ํ๊ณผ ๋ ๋ง์ ํ ๋ก ์ ํ๊ธฐ๋ฅผ ํฌ๋งํ๋ฉฐ, ๋ชจ๋ ๋ฌธ์ ์ ๋ํด ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํ๋์ง ํ์ธํ ์ ์๋ ์ํ ์ฑ์ ์ป์ ์ ์๋ค๋ฉด ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํฉ๋๋ค.
๋น๋๊ธฐ ๋ ๋๋ง ๋ฐ ์์คํ์ค ์ถ์ ๊ธฐ๋
@acdlite ๋ํ ์์คํ์ค ๋ฐ ๋น๋๊ธฐ ๋ ๋๋ง์ ๋ํ ์ง๋ฌธ์
๋๋ค.
๋ด ์ง๋ฌธ์ ๊ทธ๋ค์ด ๋์
๋๊ณ ์๋ก์ด ๋ฒ์ ์ react๋ก ์ฑ์ ์์ฑํ๊ธฐ ์์ํ๋ฉด ๋ฐ์ API์ ๋ฐ์์์ ์ฌ๋๋ค์ด ์ฝ๋ฉํ๋ ๋ฐฉ์๋ ๋ณ๊ฒฝ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๊น? (์์คํ์ค ๋ฐ ๋น๋๊ธฐ ๋ ๋๋ง ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๊ณํ์ด ์๋๋ผ๋?)
๋๋ ์์คํ์ค ๋ฐ ๋น๋๊ธฐ ๋ ๋๋ง์ผ๋ก ๋ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋ ๊น๋ค๋ก์ธ ์ ์๋ค๊ณ ๊ฐ์ ํ๊ณ (์ผ๋ถ ์๋ก์ด API ๋๋ ๊ธฐํ ์ ์ฝ์ผ๋ก ์ธํด) ํ์ํ์ง ์์ ์ฌ๋๋ค์ ์ํด ์ ์๋ก์ด ๋ฐฉ์์ผ๋ก ๋ฐ์์ ์ฌ์ฉํ๋๋ก ๊ฐ์ ํฉ๋๊น? ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ด ์ง๊ธ์ฒ๋ผ ๋ฐ์ํ๋ ๋ฐฉ์์ผ๋ก ์ฝ๋ฉํ๋ ๊ฒ์ ํ์ฉํ์ง ์์ต๋๊น?
๋๋ ์์คํ์ค๊ฐ ์๋ ๋ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋ ๊น๋ค๋ก์ธ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
์ ๊ฐ์ฐ ํ๋ฐ๋ถ๋ฅผ ๋ณผ ๊ธฐํ๊ฐ ์์ผ์ จ๋์? ์ ๋ ๊ทธ ๋ฐ๋๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์ ์์คํ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ค๋ฅธ ์ด๋ค ๊ฒ(Redux, ๋ก์ปฌ ์ํ ๋๋ ๊ธฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌํจ)๋ณด๋ค ํจ์ฌ ๋ ๊น๋ค๋กญ์ต๋๋ค.
@gaearon ์ํ์ด์. ๋๋ ์ด๋ก ์์ผ๋ก ๋ ๋ง์ ํ๊ณ ์์๋ค. ๋ฐ์์ ์๊ณ ์๋ ์ฌ๋๋ค์ด ์ด๋ฏธ ์๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. ์ฌ๋๋ค์ด ๋น๋๊ธฐ ๋ ๋๋ง ๋ฐ ์์คํ์ค ๊ธฐ๋ฅ์ด ํ์ํ์ง ์๋ค๋ฉด ์ ๊ฐ์ ๋ก "์๋ก์ด" ๋ฐ์์ ๋ฐฐ์ฐ๊ฒ ํฉ๋๊น? ํนํ "์๋ก์ด" ๋ฐ์์ด ์ฌ์ฉํ๊ธฐ ๋ ์ด๋ ต๋ค๋ฉด? ํ์ง๋ง: ์ ๋ ์ ๋ณด๊ฐ ๋ถ์กฑํ์ฌ "๋ ๊น๋ค๋ก์ด" ๋ถ๋ถ์ ๋ํด ์๋ชป ๋งํ ์ ์์ต๋๋ค. ์ ๋ ๋จ์ง ์ ์๊ฐ์ ๊ณต์ ํ๊ณ ์์ต๋๋ค. :).
์ด๋ค ๋ฉด์์๋ ์ฑ์ 10%๊ฐ Suspense ๋ฐ ๋น๋๊ธฐ ๋ ๋๋ง ๊ธฐ๋ฅ์ ํ์๋ก ํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ 90%์ ๊ฒฝ์ฐ ์ฌ๋๋ค์ด "์๋ก์ด" ๋ฐ์์ ๋ฐฐ์ฐ๋๋ก ๊ฐ์ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ํ์ง๋ง ์์ง ์์คํ์ค ๋ฐ ๋น๋๊ธฐ ๋ ๋๋ง์ ๋ํ ์ ๋ณด๋ฅผ ๋ง์ด ์์งํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ํ๋ฆด ์๋ ์์ต๋๋ค.
๋ด ๋ฐ๋ชจ๋ฅผ ์์ง ๋ณด์ง ์์๋ค๋ฉด ๋ํ๊ฐ ์ด๋ ค์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ช ํํ ํ์๋ฉด "์๋ก์ด React" ๋ ์์ผ๋ฉฐ ์ด๋ฌํ ๊ธฐ๋ฅ์ ๊ธฐ์กด ํจํด์ ๊นจ๋จ๋ฆฌ์ง ์์ต๋๋ค. ๊ทธ๋ค์ ์ฒจ๊ฐ์ ์ ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด ์์ ํ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ ํ์๋ ์์ต๋๋ค. ์ผ๋ถ ๊ธฐ๋ฅ์ ์ต์ ์๋ช ์ฃผ๊ธฐ ๋ฐฉ๋ฒ ์ ํฉ๋๋ค .
์ด๊ฒ์ด ๊ทํ์ ์ฐ๋ ค์ ์ง์ ์ ์ธ ๊ด๋ จ์ด ์์ง๋ง "์ฌ์ฉํ๊ธฐ๊ฐ ๋ ๊น๋ค๋กญ๋ค"๋ ๋ฐ ๋์ํ์ง ์์ต๋๋ค. ๋๋ ์์คํ์ค๊ฐ ํ์ฌ ์กด์ฌํ๋ ๋ค๋ฅธ ์ด๋ค ๋ก๋ฉ ๋ฉ์ปค๋์ฆ๋ณด๋ค ์ฌ์ฉํ๊ธฐ ํจ์ฌ ๊ฐ๋จํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ด ๋ด๊ฐ ๊ทธ๊ฒ์ ๋ํด ๋๋ฌด ํฅ๋ถ๋๋ ์ด์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ํ์ง ์๋ ๊ฒฝ์ฐ ์ ๊ธฐ๋ฅ ์ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค. ์ค๋๋ ํจํด์ ๊ณ์ ์๋ํฉ๋๋ค.
๋ด ์ด์ผ๊ธฐ๋ฅผ ์์ฒญ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ด ์ค์ ๋ก ์๋ํ๋ ๊ฒ์ ๋ณด๋ฉด ํจ์ฌ ๋ ์ดํด๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค.
@gaearon
๋ชจ๋ ์ค๋๋ ํจํด์ด ๊ณ์ ์๋ํฉ๋๋ค.
ํผ๋๋ฐฑ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋ค, ๊ทธ๋ ๊ฒ ์๊ฐํ์ต๋๋ค. ์ฌ๋๋ค์ด ๊ทธ๋ฐ ๊ธฐ๋ฅ์ ํ์๋ก ํ์ง ์๋๋ค๋ฉด ๊ทธ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๊ธฐ ์ ์ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ์ธ ์ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ์ด์ ๋น๋๋ค.
Hey Dan(@gaearon), ํ์๋ฆฌ๋ ์๋์ง๋ง ์์๋ด๊ณ ์ถ์ต๋๋ค. ์์์ ๋น์ ์ ๋งํ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ํ์ง ์๋ ๊ฒฝ์ฐ ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค. ์ค๋๋ ํจํด์ ๊ณ์ ์๋ํฉ๋๋ค.
"์ด์ " React์์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ก์ด React์์ ์ฝ๋ฉํ ์ ์๋ค๋ ๊ฒ์ ์์ํ๋ ๊ฒ์ ๋ฌด์์ ๋๊น?
๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ bvaughn์ getDerivedStateFromProps(๋๋ componentWillReceiveProps)๊ฐ ํ๋์ ์ ๋ฐ์ดํธ์ ๋ํด ์ฌ๋ฌ ๋ฒ ํธ์ถ๋ ์ ์์ผ๋ฏ๋ก ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค์ง ์๋ ๊ทธ์ ์๋ฃจ์ ์ ๋งํฉ๋๋ค.
๊ทธ๋์ ๋ด ์ง๋ฌธ์ ๊ฒฐ๊ตญ ์ฐ๋ฆฌ๊ฐ ์ด์ ๊ณผ ๋๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ก์ด React๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๊น? ํ์ฌ ๋ฐ์ํ๋ componentWillReceiveProps์ AFAIK๋ ํ ๋ฒ์ ์ ๋ฐ์ดํธ์ ๋ํด ์ฌ๋ฌ ๋ฒ ํธ์ถ๋์ง ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ์ง ์์ต๋๊น?
@giorgi-m : ์, ์๋ช
์ฃผ๊ธฐ ๋ฐฉ์์ด ๋ณ๊ฒฝ๋๊ณ ์์ง๋ง ์์ ์ Suspense ์์ฒด๊ฐ ์ตํธ์ธ ๊ธฐ๋ฅ์ด๋ผ๋ ๊ฒ์
๋๋ค. ๊ธฐ์กด์ ๋ชจ๋ React ๋ ๋๋ง ๋ฐฉ๋ฒ๊ณผ React์ ๋ ๋๋ง ๋์์ ๊ทธ๋๋ก ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ _if_ <AsyncMode>
ํ๊ทธ๋ฅผ ์ฑ์ ์ผ๋ถ์ ์ถ๊ฐํ์ฌ ์ ํํ๊ณ _๊ทธ๋ฆฌ๊ณ _ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์๊ตฌ ์ฌํญ์ ํ์ํ๊ธฐ ์ํด Suspense์ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ ์์ํ๋ฉด _๊ทธ๋_ ํ์ฉํ ์ ์์ต๋๋ค. ์ฝ๋๋ฒ ์ด์ค์ ์ถ๊ฐํ์ง ์์ผ๋ฉด ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์ต๋๋ค.
@giorgi-m componentDidUpdate
๋ componentWillReceiveProps
๋๋ getDerivedStateFromProps
๋์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
@markerikson ๊ทธ๋์ ๋น์ ์ bvaughn์ด ์ฌ๊ธฐ ์์ ๋งํ ๋๋ก _getDerivedStateFromProps_๊ฐ ํ ์
๋ฐ์ดํธ์ ๋ํด ์ฌ๋ฌ ๋ฒ ํธ์ถ๋ ์ ์์ง๋ง <AsyncMode/>
ํ์ฑํํ์ง ์์ ๊ฒฝ์ฐ ๋ฐ๋์ ๊ทธ๋ฐ ๊ฒ์ ์๋๋๋ค.
(์ด๋ฌํ ์ง๋ฌธ์ ํด์ ์ฃ์กํฉ๋๋ค. ๋๋๋ก ์ ์๊ฒ ๋ํ๋๋ฉฐ ๋ชจ๋ ๋ด์ฉ์ ๋ค๋ฃฐ ๋ฆฌ์์ค๋ฅผ ์ฐพ์ง ๋ชปํ์ต๋๋ค).
์ถ์ . bvaughn์ ๋ํ ์ฐ๊ฒฐ๋ ์ค๋ ๋์์ ์ ํ ์ฌํญ์ ์ธ๊ธํ์ง ์์์ผ๋ฏ๋ก ๋ด ์์ฌ์ด ์ ๊ธฐ๋์์ต๋๋ค.
๋น๋๊ธฐ ์
๋ฐ์ดํธ๋ฅผ ๋๊ธฐ์ด์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ(์: ๋ ๋๋ฌ๋ณ unstable_deferredUpdates()
์๋ ํด๋์ค ๊ตฌ์ฑ ์์์ ๊ฒฝ์ฐ deferSetState()
unstable_deferredUpdates()
)์ ํต์ฌ ์ฒดํฌ๋ฆฌ์คํธ์ ์ถ๊ฐํด์ผ ํฉ๋๊น?
๋ด ์ดํด์์ async mode
Fiber์ ๋ํ ๋ชจ๋ ์
๋ฐ์ดํธ๋ ๋น๋๊ธฐ์์ด๋ฏ๋ก ์ด๋ก ์ deferSetState()
๊ฐ ๋ถํ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ unstable-async/suspense
๋ฐ๋ชจ ๋ ๋๊ธฐ ์
๋ฐ์ดํธ์ ๋น๋๊ธฐ ์
๋ฐ์ดํธ๋ฅผ ํผํฉํ๊ณ async
๋ชจ๋("๋ฒ์ฉ" ๊ตฌ์ฑ ์์์ ๊ฒฝ์ฐ)์์ ์ด๋ฅผ ์ด๋ป๊ฒ ์ํํ ์ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
ํ์์ฌ๋ผ์ด์ฑ ์ฐ์ฐ ์ฒดํฌ๋ฆฌ์คํธ์ ์์ต๋๋ค.
์ปดํฌ๋ํธ ์ ํ์ผ๋ก Promise ์ง์
์ด์ ๊ด๋ จํ์ฌ ๋ค์์ด ์๋ ๊ฒฝ์ฐ:
const PromiseType = new Promise(() => {})
class A extends Component {
componentDidMount() {}
componentDidUpdate() {}
render() {
return <div><PromiseType></PromiseType></div>
}
}
componentDidMount
๋ฐ componentDidUpdate
์๋ช
์ฃผ๊ธฐ๊ฐ ํธ์ถ๋๋ ์์ ์ ๋ํ ๊ฒฝํ์ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
@thysultan : componentDidMount
๋ฐ componentDidUpdate
๋ UI ํธ๋ฆฌ๊ฐ ์์ ํ ๋ ๋๋ง๋์ด DOM์ ์ ์ฉ๋ ์ปค๋ฐ ๋จ๊ณ์์ ํธ์ถ๋ฉ๋๋ค.
๋ฐ๋ผ์ Suspense์ ๋ํ ๋์ ์ดํด๋ฅผ ๋ฐํ์ผ๋ก ๋ต์ A
์ธ์คํด์ค๊ฐ ์ค์ ๋ก ๋ง์ดํธ๋์ง ์์ ๊ฒ์ด๋ผ๋ ๊ฒ์
๋๋ค. PromiseType
_did_ ๊ฐ ํด๊ฒฐ๋์์ง๋ง ์ถ๊ฐ ์์ ์ค ํ๋๊ฐ ์ ๋ ํด๊ฒฐ๋์ง ์๋ ์ฝ์์ ๊ธฐ๋ค๋ฆฌ๋ ค๊ณ ์๋ํ๋ฉด ๋ค์๋ ๋ง์ดํธ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ cDM
๋ฐ cDU
๋ ์ด๋ฌํ ์์์ ์คํ๋์ง ์์ต๋๋ค.
(๋๊ตฐ๊ฐ ๋ด ๊ฐ์ ์ด ์๋ชป๋ ๊ฒฝ์ฐ ์์ ๋กญ๊ฒ ์์ ํด ์ฃผ์ธ์. :) )
์, componentDidMount
๋๋ componentDidUpdate
๋ ์ ์ฒด ํธ๋ฆฌ ๊ฐ ํด๊ฒฐ๋ ํ์๋ง ์คํ๋๋ ์ปค๋ฐ ๋จ๊ณ ์์๋ง ์คํ๋ฉ๋๋ค. ์ด ํธ๋ฆฌ์๋ ๋ช
์์ ์ผ๋ก ๋ฐฐ์นํ ์ผ๋ถ ์๋ฆฌ ํ์์๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค(์ถฉ๋ถํ ์ค๋ ๊ธฐ๋ค๋ฆฐ ํ์๋ ๊ทธ ์์ ๋ฌด์ธ๊ฐ๊ฐ ์ฌ์ ํ ์ผ์ ์ค๋จ๋๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ๋ค๋ฆ) โ ํ์ง๋ง ์ฃผ์์ ์๋ฆฌ ํ์์๊ฐ ์๋ ์์์ ๋ช
์์ ์ผ๋ก ๋ ๋๋งํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ ์ ์์ต๋๋ค. "์ค๋น๋์ง ์์" ์ํฉ์
๋๋ค.
๋๋ ์ด๊ฒ์ ๊ฐ์ง๊ณ ๋ ์ ์๊ธฐ๋ฅผ ์ ๋ง๋ก ๊ณ ๋ํ๊ณ ์์ต๋๋ค. (์ฌ์ง์ด ๋น์ ์ด ์์ง ์๋ ์์ด๋ ์น์ ์ด๊ฒ์ ์๋ ๋ฒ์ ์ ์ฌ๋ฆฌ์ง ์์๋ค๋ ๊ฒ์ ์์๋ด๊ธฐ ์ํด ๋ง์ ์์ค ์ฝ๋๋ฅผ ํ์ํ์ต๋๋ค).
์ด ๋ฆด๋ฆฌ์ค๋ฅผ ๋๊ธฐ ์ํด ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ์ผ์ด ์์ต๋๊น? :๋
ํ๋ ์ดํ๊ณ ์ถ๋ค๋ฉด ๋ง์คํฐ์์ ์ปดํ์ผํ ์ ์์ต๋๋ค. fixtures/unstable-async/suspense
์ง์นจ ๋ณด๊ธฐ
@gaearon ์ด๊ฒ์ด ํ์ฌ ์ํ์ ํด๋ผ์ด์ธํธ ์ธก์๋ง ์๋ ๊ฒ์ด ๋ง
ํธ์ง, ๋ต์ ์ฐพ์์ต๋๋ค. ๋ฒ์ฉ ์ฑ์ฉ SSR์์ Suspense๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ ๋ค๋ฅธ ์ฌ๋์ ์ํ ๊ฒ์ ๋๋ค. ํ์ฌ๋ก์๋ ์ด๊ฒ์ด ํด๋ผ์ด์ธํธ ์ธก์์ ์๋ ค์ฃผ๋ Dan์ ์ด ๋๊ธ ์ ์ฐพ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ์๊ฒฌ์ SSR์ ๋ํ ๊ฐ๋ฅํ ์๋ฏธ์ ๋ํด ์ด์ผ๊ธฐํ๋ https://www.youtube.com/watch?v=z-6JC0_cOns ๋ ๊ฐ๋ฆฌํต๋๋ค.
์ฐ๋ฆฌ๋ ์ค์ ๋ก SSR ์ฌ๊ฑด๊ณผ ๊ด๋ จ๋ ๋ช ๊ฐ์ง ์์ ์ ๊ณง ์์ํฉ๋๋ค.
์ ๊ฐํ ๋ชจ๋ฐ์ผ ์ฅ์น์์ ์คํ๋๋ ๋น๋๊ธฐ React ์ฑ์์ ์ด ์๋๋ฆฌ์ค๋ฅผ ์์ํด ๋ณด์ญ์์ค.
์ด ๋ฌธ์ ๋ Suspense์ ๋ํด ๋
ผ์๋ ๊ฒ๊ณผ ๋์ผํ <Placeholder>
๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ํผํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด 1์ด ํ์ ์คํผ๋๊ฐ ํ์๋ฉ๋๋ค.
์ด ์๋๋ฆฌ์ค๊ฐ ๊ณ ๋ ค๋์์ต๋๊น? ๋๋ฆฐ ๋น๋๊ธฐ ๋ ๋๋ง์ <Placeholder>
์๋ํฉ๋๊น?
@luisherranz ์ด๋ฅผ ๋ฐฉ์งํ๋ ๋ ๊ฐ์ง ๋ฉ์ปค๋์ฆ์ด ์์ต๋๋ค.
React์๋ ๋ชจ๋ ์ ๋ฐ์ดํธ์ ๊ด๋ จ๋ ๋ง๊ฐ์ผ์ด ์์ต๋๋ค. ํด๋ฆญ ๋ฐ ์ด์ ๊ฐ์ ๊ธฐํ ์ํธ์์ฉ์ผ๋ก ์ธํ ์ ๋ฐ์ดํธ๋ ๋ช ์์ ์ผ๋ก ๋ ๊ธด ๊ธฐํ์ ์ ํํ์ง ์๋ ํ ~150ms ์ด๋ด์ ํ๋ฌ์๋์ด์ผ ํฉ๋๋ค(์: ํ์์ ์ด์ง ์์ ์ ๋ฐ์ดํธ์ ๊ฒฝ์ฐ). ๋ฐ๋ผ์ React๋ ๋ฌด์ธ๊ฐ๊ฐ ์ค๋ ๋๋ฅผ ์ก์๋จน๋ ๊ฒฝ์ฐ ๋๊ธฐ์ ์ผ๋ก ํ๋ฌ์๋ฅผ ๊ฐ์ ์คํํฉ๋๋ค.
React๋ ์ค์ ๋ก ๋ ์ด์ requestIdleCallback
ํ์ง ์์ต๋๋ค. ์๋ํ๋ฉด ์ค์ ๋ก ๋ธ๋ผ์ฐ์ ๋ ์ค์ผ์ค๋ง์ ๋ํด ์ถฉ๋ถํ ๊ณต๊ฒฉ์ ์ด์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ ํํ ์ผ์ ์ ๊ทผ ๋ฐฉ์๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋ ์ ์์ง๋ง ์ด๊ฒ์ ํ์คํ ์ฐ๋ฆฌ๊ฐ ๊ด์ฌ์ ๊ฐ๊ณ ์๋ ๊ฒ์
๋๋ค.
๋น ๋ฅธ ๋ต๋ณ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. Dan.
- React์๋ ๋ชจ๋ ์ ๋ฐ์ดํธ์ ๊ด๋ จ๋ ๋ง๊ฐ์ผ์ด ์์ต๋๋ค.
์์ฒญ๋. ํ ์คํธํ ์ ์๋ API๊ฐ ์ด๋ฏธ ์์ต๋๊น?
- React๋ ์ค์ ๋ก ๋ ์ด์ requestIdleCallback์ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์๋ํ๋ฉด ์ค์ ๋ก ๋ธ๋ผ์ฐ์ ๋ ์์ฝ์ ๋ํด ์ถฉ๋ถํ ๊ณต๊ฒฉ์ ์ด์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์คํํ ๊ฒ์ด๊ธฐ๋ ํฉ๋๋ค. ๋๋๋ก ์ธ๋ถ ๊ด๊ณ ๊ฐ ์๊ณ twitter ๋๋ youtube์์ ํผ๊ฐ๋ ๋ณต์กํ ์ฑ์์ requestIdleCallback
๊ฐ ํธ์ถ๋๊ณ ๋ ๋๋ง์ด ์๋ฃ๋ ๋๊น์ง ๋ช ์ด๊ฐ ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ๊ทธ๋์ ๐.
BTW, ์ฐ๋ฆฌ์๊ฒ๋ ์ฒซ ๋ฒ์งธ ๋ต๋ณ๊ณผ ๊ด๋ จ๋ ๋ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ ๊ฐ์ ์คํ์ ์ผ๋ก ์ง์ฐ ๋ก๋๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํฉ๋๋ค. ์ฒซ ๋ฒ์งธ๋ ๋น๋๊ธฐ ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํ๊ณ ๋ ๋ฒ์งธ๋ ๋น๋๊ธฐ๊ฐ ์๋ฃ๋์ง ์์ ๊ฒฝ์ฐ ๋๊ธฐํ ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. ์ด ๊ฐ์:
๋ฐ๋ผ์ ์๊ฐ ๋์ ๋ ๋ฒ์งธ ํธ๋ฆฌ๊ฑฐ๋ก ํ๋ฌ์๋ฅผ ์ ์ดํ๊ณ ์ถ์ต๋๋ค. ๋ง์ด ๋๋์? ๊ฐ๋ฅํ ๊น์?
ํ ์คํธํ ์ ์๋ API๊ฐ ์ด๋ฏธ ์์ต๋๊น?
๋ง์คํฐ๋ฅผ ์๋ฏธํ๋์ง ์๋์ง(๋น๋๊ธฐ ๋ชจ๋๋ npm ๋ฆด๋ฆฌ์ค์์ ๊ณต์์ ์ผ๋ก ์ฌ์ฉํ ์ ์์) ํ์คํ์ง ์์ง๋ง ๋ง๋ฃ ์๊ฐ์ ๋ชจ๋ ์ ๋ฐ์ดํธ์ ์๋์ผ๋ก ํ ๋น๋ฉ๋๋ค. ํด๋ฆญ๊ณผ ๊ฐ์ ์ด๋ฒคํธ์ ๊ฒฝ์ฐ ํ๋ก๋์ ๋ชจ๋์์ ~150ms์ ๋๋ค. ํน๋ณํ ๋ถ์์ ํ API๋ฅผ ์ํ๋ ๊ฒฝ์ฐ ์ง์ฐ๋(๋ ๊ธด) ์ ๋ฐ์ดํธ๋ฅผ ์ ํํ ์ ์์ง๋ง ์ค์ ํ ์๋ ์์ต๋๋ค.
๋ฐ๋ผ์ ์๊ฐ ๋์ ๋ ๋ฒ์งธ ํธ๋ฆฌ๊ฑฐ๋ก ํ๋ฌ์๋ฅผ ์ ์ดํ๊ณ ์ถ์ต๋๋ค. ๋ง์ด ๋๋์? ๊ฐ๋ฅํ ๊น์?
๋ค ๊ฐ๋ฅํฉ๋๋ค. ์ฌ๊ธฐ์์ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์ปค๋์ฆ์ ์ค๋ช ํ์ต๋๋ค. https://github.com/oliviertassinari/react-swipeable-views/issues/453#issuecomment -417939459.
๋ง์คํฐ๋ฅผ ์๋ฏธํ๋์ง ์๋์ง ํ์คํ์ง ์์ต๋๋ค(๋น๋๊ธฐ ๋ชจ๋๋ npm ๋ฆด๋ฆฌ์ค์์ ๊ณต์์ ์ผ๋ก ์ฌ์ฉํ ์ ์์)
์, <unstable_AsyncMode>
, flushSync
๋ฐ unstable_deferredUpdates
์ ํจ๊ป npm ํจํค์ง๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
npm์ ๋ํ ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ํ/๋ฒ ํ ๋ฒ์ ์ถ์๋ฅผ ์์ํ์ญ์์ค! ๐
๋ค ๊ฐ๋ฅํฉ๋๋ค. ๋๋ ์ฌ๊ธฐ์ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์ปค๋์ฆ์ ์ค๋ช ํ์ต๋๋ค: oliviertassinari/react-swipeable-views#453 (comment).
ํ๋ฅญํ. unstable_deferredUpdates
์ฌ์ฉํ๋ ํ์ฌ ๊ตฌํ๋ณด๋ค ํจ์ฌ ๋ซ์ต๋๋ค. :)
<div hidden>
์ฌ์ฉํ๊ธฐ ์์ํ ๋๊น์ง ๊ธฐ๋ค๋ฆด ์ ์์ต๋๋ค. ๋น์ ์ ๋๋ผ์ด ์ผ์ํ๊ณ ์์ต๋๋ค.
@luisherranz ์กฐ์ฌํ์ธ์. ๊ทธ๋ฐ ๊ฒ๋ค์ ๋ถ์์ ํฉ๋๋ค. ๋ฒ๊ทธ๊ฐ ์๊ฑฐ๋ ๋งค์ฐ ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค(์: ์ค์ํ ์ต์ ํ - "์ฌ๊ฐ" - ์์ง ๊ตฌํ๋์ง ์์). ์๋ก์ด schedule
๋ชจ๋( schedule.unstable_scheduleWork
)์ ์ํด unstable_deferredUpdates
๋ ์ ๊ฑฐํฉ๋๋ค.
๋ค, ์ฐ๋ฆฌ๋ ์ฑ์ ์์ ๋ถ๋ถ์๋ง ์ฌ์ฉํ๊ณ ์ง์ค์ ์ผ๋ก ํ ์คํธํ๊ณ ์์ง๋ง ์ง๊ธ๊น์ง๋ ๋๋ฌด ์ข์ต๋๋ค :)
์ฃผ์ ์ ๋ค๋ฅผ ์ ์์:
requestIdleCallback
๋ ์ด๋น 20๋ฒ๋ง ํธ์ถ๋ฉ๋๋ค. 6x2 ์ฝ์ด Linux ์ปดํจํฐ์ Chrome์์๋ UI ์์
์ ์ค์ ๋ก ์ ์ฉํ์ง ์์ต๋๋ค.
requestAnimationFrame
๋ ๋ ์์ฃผ ํธ์ถ๋์ง๋ง ์ด๋ฆ์ด ์ ์ํ๋ ์์
์๋ง ํด๋น๋ฉ๋๋ค.
์ด๋ฌํ ์ด์ ๋ก requestIdleCallback
์ฌ์ฉ์ ์ค๋จํ์ต๋๋ค.
requestIdleCallback
๋์ ๋ฌด์์ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
์, ๋ฌผ๋ก ์
๋๋ค. ๋ฐ๋ณด ๋. ์ค์ผ์ค๋ฌ ๋ชจ๋์ด requestIdleCallback
๋์ ํ๋ ์๋์์ ์ฌ์ฉํ๋ ๋ธ๋ผ์ฐ์ API๊ฐ ๋ฌด์์ธ์ง ๊ถ๊ธํฉ๋๋ค. ์ง๋ฌธ์ ๋ ๋ช
ํํ๊ฒ ์ ์ํ์ด์ผ ํ์ต๋๋ค. ๐
์ค, ์ฐพ์์ต๋๋ค.
https://github.com/facebook/react/blob/eeb817785c771362416fd87ea7d2a1a32dde9842/packages/scheduler/src/Scheduler.js#L212 -L222
๊ทธ๊ฒ์ ๋ค์ ๋จ๊ณ์ ๋ฉ์ง ๊ฒ์ ๋๋ค.
์๋ ,
Suspense๋ฅผ ์ดํดํ๋ ค๊ณ ํ๋ ๋์ Suspend
๊ตฌ์ฑ ์์ ๐ณ๐ฑ๋ฅผ ์ฌ์ฉํ ๋ ์ฑ์ ์ด๋ค ๋ถ๋ถ์ด ์ค์ ๋ก "์ผ์ ์ค๋จ"๋์๋์ง ์ ํ ๋ชจ๋ฅธ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค.
๋ค์ ์์์ ๋๋ ๊ธฐ๋ Title
์ฆ์ ๋ณผ ์ ์๋๋ก Spinner
1000MS ์ดํ UserData
~ 2000ms (ํด๋น ๊ตฌ์ฑ ์์๋ก "๋ก๋"๋ฐ์ดํฐ๊ฐ 2000ms ์์) ํ.
๊ทธ๋ฌ๋ ๋ด๊ฐ ๋ณธ ๊ฒ์ Title
๊ฐ 1000ms ํ์ Spinner
์ ํจ๊ป ์ฒ์ ๋ํ๋ฉ๋๋ค.
// longRunningOperation returns a promise that resolves after 2000ms
const UserResource = createResource(longRunningOperation);
function UserData() {
const userData = UserResource.read(cache, "Lorem Ipsum");
return <p>User Data: {userData}</p>;
}
function Spinner() {
return <h1>Fallback Loading Spinner</h1>;
}
function Title() {
return <h1>Hello World</h1>;
}
function App() {
return (
<React.Fragment>
<Title />
<Suspense maxDuration={1000} fallback={<Spinner />}>
<UserData />
</Suspense>
</React.Fragment>
);
}
unstable_createRoot(document.getElementById("mount")).render(<App />);
(React 16.6.0-alpha.8af6728์ ์ฌ์ฉํ๋ ์์ ํ ์์ ๋ ์ฌ๊ธฐ ์ฝ๋์๋๋ฐ์ค
Title
์ฆ์ ํ์ํ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ค๋ฅธ ๋ถ๋ถ๋ง "์ผ์ ์ค์ง"ํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ์๋๋ฉด ๋ด๊ฐ ์์ ํ Suspense๋ฅผ ์๋ชป ์ดํด ํ์ต๋๊น? (์ด๋ฐ ์ข
๋ฅ์ ์ง๋ฌธ์ ํ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์)
๊ฐ์ฌ ํด์!
์๋ ํ์ธ์ @nilshatmann์ ๋๋ค! ์ข์ ์ง๋ฌธ์ ๋๋ค!
์ ๋ชฉ์ ์ฆ์ ํ์ํ๊ณ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ๋ถ๋ถ๋ง "์ผ์ ์ค์ง"ํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด Title
์ฆ์ ํ์ํ๊ณ ๋ค๋ฅธ ํญ๋ชฉ๋ง "์ผ์ ์ค๋จ"ํ๊ธฐ ์ํด ์ด ์์ ์์์ ๊ฐ์ด Title
๋ฅผ DOM์ ํ๋ฌ์ํ๊ธฐ ์ ์ React์ _๊ธฐ๋ค๋ฆฌ์ง ๋ง๋ผ๊ณ _ ๋ช
์์ ์ผ๋ก ์๋ ค์ผ ํฉ๋๋ค. <Suspense maxDuration={0}>
์์ ์ฆ์ ๋ ๋๋ง๋ ๊ฒ์ผ๋ก ์์๋๋ ๋ถ๋ถ์ ๋ํํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ์ผ๋ถ์
๋๋ค.
๊ธฐ๋ณธ ์ ์์ค ์ค์ผ์ค๋ฌ ์ญํ ๋๋ฌธ์ ์ด๊ฒ์ด ์ฌ์ค์ด๋ผ๊ณ ์๊ฐํฉ๋๊น? ๋๋ ๋ํ ์ด๊ฒ์ ๋ ์ ์ดํดํ๊ณ ์ถ์ง๋ง ์ง๊ธ์ผ๋ก์๋ ๋น์ ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํฉ๋๋ค.
๊ทธ๊ณณ์์ ์ค์ ๋ก ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ๋ค์ผ๋ ํฅ๋ถ๋ฉ๋๋ค.
(์ด๋ฐ ์ข ๋ฅ์ ์ง๋ฌธ์ ํ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์)
์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๐ ํ์คํ ์ ๊ฒ ๊ฐ์ต๋๋ค. ์ง๋ฌธ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
@TejasQ ๋ด ๋ธ๋ผ์ฐ์ ์์ ์์ ๋ฅผ ๋ก๋ํ๋ฉด ํด๋ฐฑ ์คํผ๋๊ฐ ์ฆ์ ๋ ๋๋ง๋ฉ๋๋ค. 1000ms ํ์ ๋ถ๋ฌ์์ผ ํ๋ ๊ฒ ์๋๊ฐ์?
@TejasQ ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค. ํ์ง๋ง @karlhorky ๊ฐ ๋ง์ต๋๋ค. ์ด์ ์คํผ๋๊ฐ ์ฆ์ ๋ํ๋ฉ๋๋ค.
์ข์! ๋๋ ๊ทธ๊ฒ์ ๋์ณค๋ค. ๋๋ ์๋ํ๋ค. ๐ ๋ค์ ํ ๋ฒ ์ดํด๋ณด๊ณ ๋ค์ ์ฐ๋ฝ๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋ญ๊ฐ ๋์น ๊ฒ ํ๋ฆผ์์ด. ๐คทโโ๏ธ
~์ ๋ฐ์ดํธ: ์ฌ๊ธฐ์์ ์์๋ด๋ ค๊ณ ํ๊ณ ์๊ณ ์ค์๊ฐ์ผ๋ก ํจ๊ป ํ๊ณ ์ถ์ ์ฌ๋์ด ์์ผ๋ฉด ํ์ ํ ์ ์์ต๋๋ค.~
๋ ๋ฒ์งธ ์
๋ฐ์ดํธ: @philipp-spiess์ ๋๋ ๊ทธ๊ฒ์ ๋ณด์๊ณ ๋๋ ์ ๋ง๋ก ๋นํฉํ์ต๋๋ค. ๋๋ ์์ง๋ ๊ทธ๊ฒ์ ์ดํดํ์ง ๋ชปํ๋ค. ์ด ์์ ์์ ์ด๊ฒ์ด ์ค์ ๋ก unstable_
๋ฐ ์ํ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์ ๋ฒ๊ทธ์ธ์ง, ์๋๋ฉด ๋จ์ํ ๋ด๊ฐ ๋ณด์ง ๋ชปํ๋ ํญ๋ชฉ์ธ์ง ํ์คํ์ง ์์ต๋๋ค.
๋ ๊ฒฝ์ฐ ๋ชจ๋ ํต์ฌ ํ์ด ์ ์ฉํ ๋ต๋ณ์ ์ ๊ณตํ๊ฑฐ๋ ๊ทํ์ ์ง๋ฌธ์ ์ฌ์ฉํ์ฌ React๋ฅผ ๋ ๋์/๋ ์ ๊ทผํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ค์ด ๋ฌด์จ ๋ง์ ํด์ผ ํ๋์ง ๋ด ์๋ค. ๐ ์ง์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค, @nilshatmann!
์ด๊ฒ์ React v16.6์ ์ผ๋ถ๋ก ์ถ์๋์์ต๋๊น? ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ์ Suspense๋ฅผ ์ฌ์ฉํ๋ ์์ ์ฝ๋๋ฅผ ๋ณด์ฌ์ค๋๋ค.
import React, {lazy, Suspense} from 'react';
const OtherComponent = lazy(() => import('./OtherComponent'));
function MyComponent() (
<Suspense fallback={<div>Loading...</div>}>
<OtherComponent />
</Suspense>
);
์ด๊ฒ์ React v16.6์ ์ผ๋ถ๋ก ์ถ์๋์์ต๋๊น?
์ง์ฐ ๋ก๋ฉ ์ฌ์ฉ ์ฌ๋ก๋ง ๋๊ธฐํ ๋ชจ๋์์๋ง ๊ฐ๋ฅํฉ๋๋ค. ๋์ ๋ชจ๋๋ ์ฌ์ ํ WIP์ ๋๋ค.
@nilshatmann
๋ค์ ์์์๋ Title์ด ์ฆ์ ํ์๋๊ณ 1000ms ํ์ Spinner๊ฐ ํ์๋๊ณ ~2000ms ํ์ UserData๊ฐ ํ์๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค(ํด๋น ๊ตฌ์ฑ ์์์ ๋ํ ๋ฐ์ดํฐ๋ฅผ "๋ก๋"ํ๋ ๋ฐ 2000ms๊ฐ ์์๋จ).
maxDuration
๊ฐ ํ๋ ์ผ์ ๋ํด ์ฝ๊ฐ ํผ๋์ค๋ฌ์ ํ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ ์๋ก์ด ๋ฉํ ๋ชจ๋ธ์ด์ง๋ง ์์ง ๋ฌธ์ํํ ์๊ฐ์ด ์์์ต๋๋ค. ๋ฐ๋ผ์ ๋์ ๋ชจ๋๊ฐ ์์ ์ ์ธ ๋ฆด๋ฆฌ์ค๊ฐ ๋ ๋๊น์ง ํ๋์ ๊ณ์ ํผ๋์ค๋ฌ์ธ ๊ฒ์
๋๋ค.
ํํฌ ์ ์์ ๋ฐํํ ๊ฒ์ ์ถํํฉ๋๋ค. ํ๊ณผ ๊ณต์ ํ๊ณ ์ถ์ ๊ฒ์ด ์์ต๋๋ค. ์ผ๋ง ์ ์ Suspense์ ์ ์ฌํ ๊ธฐ๋ฅ์ ๊ฐ์ง React Async ๋ผ๋ ๊ตฌ์ฑ ์์๋ฅผ ์ถ์ํ์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Promise ํ์ธ์ ์ฒ๋ฆฌํ๊ณ isLoading, startedAt์ ๊ฐ์ ๋ฉํ๋ฐ์ดํฐ ๋ฐ reload ๋ฐ ์ทจ์์ ๊ฐ์ ๋ฉ์๋๋ฅผ ๋ชจ๋ ์ ์ธ์ API๋ก ์ ๊ณตํฉ๋๋ค( useAsync ํํฌ ๊ฐ ์งํ
์ด์ ๋ด ์ฃผ์ ๊ด์ฌ์ฌ๋ ์ด๊ฒ์ด Suspense์ ํตํฉ๋๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ React Async์ Suspense API๋ฅผ ์ฌ์ฉํ๊ณ ์ฌ์ฉ์์๊ฒ ์น์ํ๊ณ ๊ฐ๋จํ React Async API๋ฅผ ์ ๊ณตํ๋ ๋์์ Suspense์ ์ผ์ ๊ธฐ๋ฅ์ ๋ฌด๋ฃ๋ก ์ ๊ณตํ ์ ์์ต๋๋ค. ๋ด๊ฐ ๋ณธ ๋ฐ์ ๋ฐ๋ฅด๋ฉด, React Async API๊ฐ ๋ ์ถ์์ ์ธ Suspense API์ ๋นํด ๋ ํฉ๋ฆฌ์ ์ด๊ณ ์ ๊ทผํ๊ธฐ ์ฝ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ณธ์ง์ ์ผ๋ก React Async๋ ์ฌ์ฉ ์ฌ๋ก์ ์ฝ๊ฐ ๋ ์์ ํ์ ์งํฉ์์ ์๋ํ๋ ๋ณด๋ค ๊ตฌ์ฒด์ ์ธ API๋ฅผ ์ ๊ณตํ๋ ค๊ณ ํฉ๋๋ค.
React Cache ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ์๊ณ ๋๋์ต๋๋ค. React Async์ ๊ฒฝ์ฐ ์๋์ ์ผ๋ก ์บ์ ๋ฉ์ปค๋์ฆ์ ํฌํจํ์ง ์์์ง๋ง ๋ฐ๋๋ผ Promise๋ฅผ ์ฒ๋ฆฌํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๊ทธ ์์ ์บ์ฑ์ ์ถ๊ฐํ๋ ๊ฒ์ ์๋นํ ์ฝ์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ฌ์ฉ์ ์ง์ ํํฌ์์ Suspense ๊ธฐ๋ฅ์ ์ก์ธ์คํ๋ ๊ฒ์ ๋ํด ์ฐ๋ คํ๊ณ ์์ต๋๋ค. ์์คํ์ค๋ ์ฌ๋ฌ ๋ด์ฅ ๊ตฌ์ฑ ์์์ ํฌ๊ฒ ์์กดํ๋ ๊ฒ ๊ฐ์ผ๋ฏ๋ก ํํฌ์์ ์ด๋ฌํ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค(์ ์๊ฐ์๋?). ์์คํ์ค ํํฌ๊ฐ ์์ต๋๊น? ์๋๋ฉด ๋์ ํตํฉํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์ฌ๋ณด์ธ์. Suspense/Lazy๋ก ์ฝ๋๋ฅผ ํ
์คํธํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น?
์ด์ renderer.create(...)toTree() throws
"toTree()๋ ํ๊ทธ๊ฐ 13์ธ ๋
ธ๋๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์์ง ๋ชจ๋ฆ
๋๋ค."
Suspense
์ ์ํ maxDuration
์ด ๋๊ธฐํ ๋ฐ ๋์ ๋ชจ๋๊ฐ ์๋ Concurrent Mode
์์๋ง ์ฌ์ฉ๋๋ ์ด์ ์
๋๋ค. ์๋ฌด๋ ์ค๋ช
์ ๋์์ค ์ ์์ต๋๊น?
(์ง๊ธ ๋น์ฅ์) Concurrent Mode
๊ฐ ์ด ํธ๋ฆฌ๋ฅผ ์ปค๋ฐํ๊ธฐ ์ ์ ๋ณด๋ฅ ์ํ๋ก ๋ ์ ์๋ ๊ธฐ๊ฐ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ํ์ ์ฌ๋ผ์ด์ฑ ๋ง๊ฐ ๊ธฐํ์ ํจ๊ณผ์ ์ผ๋ก ์ ์ดํ๋ฉฐ Sync ๋ชจ๋์์๋ ํ์ ์ฌ๋ผ์ด์ฑ์ด ์กด์ฌํ์ง ์์ต๋๋ค. ํธ๋ฆฌ๋ฅผ ์ปค๋ฐํ๊ธฐ ์ ์ ๊ธฐ๋ค๋ฆฌ๋ฉด ๋ฐ๋์ ์ปค๋ฐ์ด ... ๋๊ธฐํ๋์ง ์์ต๋๋ค.
์ ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ํด ๋ด๋ถ ์์ฉ ํ๋ก๊ทธ๋จ์์ Suspense๋ฅผ ์ฌ์ฉํด ์์ผ๋ฉฐ ์์ง ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์ ์ฌ์ฉํ ์ ์๋ ์ด์ ๋ฅผ ๋งค์ฐ ๋นจ๋ฆฌ ๋ฐ๊ฒฌํ์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ฒฐ๊ตญ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ง๋ ์บ์ ๊ณต๊ธ์๋ฅผ ์ ์ธํ๊ณ API๊ฐ ํฌ๊ฒ ๋ณ๊ฒฝ๋ ๊ฒ ๊ฐ์ง ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ํ ์์ ํด์ผ ํ๋ ๊ฒฝ์ฐ Suspense๋ ์ด๋ป๊ฒ ์๋ํฉ๋๊น?
์๋ฅผ ๋ค์ด, ์ฌ๊ธฐ ๋ด ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ๋ง ๋์ฐํ ํํฌ๊ฐ ์์ต๋๋ค.
function useComponentList(id) {
const incomingComponents = useSuspenseFetch(
React.useCallback(() => getComponentAPI().listComponents(id), [id])
)
const map = React.useMemo(
() =>
Map(
(incomingComponents || []).map(component => [component.id, component])
),
[incomingComponents]
)
return useCacheValue(map)
}
์ด ํํฌ:
useCacheValue
๋ํ๋ ์ง๋๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ ํนํ ์ด์ํ ๋ถ๋ถ์
๋๋ค.useCacheValue
๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
export default function useCacheValue(value) {
const [state, setState] = React.useState(value)
React.useEffect(() => {
setState(value)
}, [value])
return [state, setState]
}
value
๋ณ๊ฒฝ(๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ฐ์ ธ์์์ ๋ํ๋)์ ์๋ตํ์ง๋ง ์ฌ์ฉ์๊ฐ ํด๋น ์ํ์ ๋ฐ์ ์ฑ ํํ์ ์์ ํ ์ ์๋๋ก ํ๋ ํํฌ๋ผ๋ ์์ด๋์ด๊ฐ ์์ต๋๋ค. ์ด๋ค ๋ฉด์์๋ ๋งค์ฐ ๋์ ์บ์์ฒ๋ผ ์๋ํฉ๋๋ค(๋ฐ๋ผ์ ์ด๋ฆ).
์ด ํจํด์ด ํ์ฌ ์ํ์์ Redux์ ์ ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ๊ณ ๊ตฐ๋ถํฌํ๊ณ ์์ต๋๋ค. ๋ด๊ฐ ์๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์์ฑํ์ ๋์ ์์คํ์ค๊ฐ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ํด '์ค๋น'๋์์ ๋ ์ด๊ฒ์ด ์ด๋ป๊ฒ ๋ณด์ผ์ง์ ๋ํ ๋ฐ๊ฒฌ์ด ์์์ต๋๊น? ํ์ฌ๋ก์๋ ๋ช ๋ น์ ํ๋๊ทธ ๊ฐ์ ธ์ค๊ธฐ์ ํจ๊ป Redux๋ฅผ ๋จ๋ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ํ๋ ์์ ์ ๋๋ค.
Redux์ ์์ฒด ํํฌ ๊ฐ ์์ผ๋ฉด ์ด ๋ ๊ฐ์ง๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ๋ฐ ์์ด ๊ฐ์ฅ ํฐ ์ด๋ ค์์ Redux๊ฐ ๋ ธ์ถ๋์ง ์์์ผ ํ๋ ์ปจํ ์คํธ์ ํจ๊ป HOC๋ฅผ ์ฌ์ฉํ๋ค๋ ์ ์ด๋ฏ๋ก ์ด ์์ ์ ํจ์ฌ ๊ฐ๋จํด์ง ๊ฒ์ ๋๋ค. ๋๋ต์ :)
Suspense๋ ์ธ๋ถ ์บ์์ ํจ๊ป ์๋ํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค(์ํ์ ์ํด ๊ตฌ๋๋๋ Hook์ด ์๋ ). ๊ฐ๋จํ ์ฌ์ฉ ์ฌ๋ก์์ ์๋ํ๋ ๊ทธ๋ฌํ ์บ์์ ์ฐธ์กฐ ๊ตฌํ์ ์ ๊ณตํ ๊ฒ์ ๋๋ค. ๋ฆด๋ ์ด๋ ์์ฒด ์บ์ฑ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํฉ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๋๊ตฌ(์: Apollo)๋ ํธํ ๊ฐ๋ฅํ ์์ฒด ์บ์๋ฅผ ๊ตฌํํ ์ ์์ผ๋ฉฐ, ์ด ๋ ๊ฐ์ง ๊ตฌํ์์ ์๊ฐ์ ์ป์ ์ ์์ต๋๋ค.
๋์ฐ๋ณ์ด/๋ฌดํจํ๋ ๋ต๋ณ์ด ํ์ํ ์ ์ผํ ์ง๋ฌธ์ด ์๋๋๋ค. ์ฐ๋ฆฌ๋ ๋ํ ๋ค์ ์ฌํญ์ ๋ํด ์๊ฐํ ํ์๊ฐ ์์ต๋๋ค. ์คํผ๋๋ฅผ ํ์ ํ ์๊ธฐ , ๋งค๋ฌ๋ฆฐ ํธ๋ฆฌ ์ธ๋ถ์ ์์ ์ ์๋ "์ธ๋ผ์ธ ํ์๊ธฐ"์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ํจํด, ์กฐ์ ๋ก๋ ์ํ(ํํฅ์ ์์๋ก ์ ๊ธ ํด์ ํด์ผ ํ๊ฑฐ๋ ์๋ ์ํ๋ก ๋ค์ด ์ค๋ ๊ฒ์ ๊ฒฝ์ฐ) ์ค๋น๋จ), ๋ชฉ๋ก์ ์คํธ๋ฆฌ๋ฐ ๋ ๋๋ง, ์ด๊ฒ์ด ๋ถ๋ถ ์ํ์ ๋ฏธ์น๋ ์ํฅ ๋ฑ. ์ฐ๋ฆฌ๋ ์ด๋ฌํ ์์ ์ ํ๊ณ ์์ง๋ง ์์ง "๊ณต์ ๊ถ์ฅ ์ฌํญ"์ ์์ต๋๋ค. ์์ ๋ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐํํ๋ ๋ธ๋ก๊ทธ์์ ์ ์ ์์ต๋๋ค.
์ฐธ๊ณ ๋ก ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ํ Suspense๋ ์ฌ๋๋ค์ด ์ต์ํ๋ ๊ฒ๊ณผ๋ ์ถฉ๋ถํ ๋ค๋ฅธ ๋ฉํ ๋ชจ๋ธ์ ๋๋ค. Redux์ ๊ฐ์ ๋งค์ฐ ์ ํ๋์ง ์์ ๋ฉ์ปค๋์ฆ๊ณผ ํตํฉ๋ ๋ ๋ฐ๋์ ๊ฐ๋ ฅํ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ๋ ๊ฒ์ ๊ณต์ ํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ๋ณด๊ฒ ๋ ๊ฒ์ ๋๋ค. ์ง๊ธ์ ๋ญ๋ผ ๋ง์๋๋ฆฌ๊ธฐ ์ด๋ ต์ต๋๋ค.
@gaearon "์ฐ๋ฆฌ๊ฐ ์ด๋ฐ ์ผ์ ํ๊ณ ์๋ค"๊ณ ๋งํ ๋ ๋ด๊ฐ ๊ตฌ๋ ํ ์ ์๋ ๋ฌธ์ ๊ฐ ์๊ฑฐ๋ ์ด๋ฌํ ํ ๋ก ์ด ๋น๊ณต๊ฐ๋ก ์งํ๋๋์?
@gaearon๋ ๊ฐ์ฌํฉ๋๋ค :)
@ntucker ์ธ์ ๋์ฒ๋ผ ์งํ ์ค์ธ ํ๋์ PR๋ก ๋ณผ ์ ์์ต๋๋ค. ์: https://github.com/facebook/react/pull/14717 , https://github.com/facebook/react/pull/14884 , https://github.com/facebook/react/pull/15061 , https://github.com/facebook/react/pull/15151 , https://github.com/facebook/react/pull/15272 , https://github.com/facebook/react/pull/15358 , https //github.com/facebook/react/pull/15367 ๋ฑ. ์ฐ๋ฆฌ๋ ๊ฐ PR์ ๋ช ๊ฐ์ง ์ค๋ช ์ ์ธ ์ ๋ณด๋ฅผ ๋ฃ์ผ๋ ค๊ณ ๋ ธ๋ ฅํ๋ฉฐ ํ ์คํธ์์ ๋์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ณผ ์ ์์ต๋๋ค. ์คํ์ ๋ํ ๋ฌธ์ ๋ง๋๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ๋ฎ์ต๋๋ค.
์ ํํ ๋ชจ๋ธ์ด ์ค์ ๋ก ์๋ํ๋ค๋ ํ์ ์ด ๋ ํ์ ๋ ์์ธํ ์ค๋ช ์ ๊ฒ์ํ๊ฒ ์ต๋๋ค. ๋ชจ๋ ์คํ์ ๋ฐ์ํ๋ ๋๋ก ์์ธํ ์ค๋ช ํ๋ค๋ฉด ์ฐ๋ฆฌ๋ ์ปค๋ฎค๋ํฐ ๋ชจ๋์๊ฒ ์์ฐ์ ์ด์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์คํ์ ๋๋ถ๋ถ์ ์คํจํ์ผ๋ฉฐ, ๊ฐ๊ฐ์ ์คํ์ ๋ฌธ์ํํ๊ณ ์ค๋ช ํ๋ฉด ์์ ์๋๊ฐ ๋๋ ค์ง๋๋ค.
์ด๊ฒ์ ์ฌ๋๋ค์ด ๋์ค์ ์ฐ๋ฆฌ๊ฐ ์๋ ์ค๊ณ๋ ๋ฐฉ์์ผ๋ก ์๋ํ์ง ์๋๋ค๋ ๊ฒ์ ๊นจ๋ซ๋ ๊ฒ์ ์ค์ฌ์ผ๋ก ๋ฉํ ๋ชจ๋ธ์ ๊ตฌ์ถํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณ๋ ๊ฒฝ์ฐ๊ฐ ํจ์ฌ ๋ ๋ง์ต๋๋ค. (๋ฐฉ๊ธ ์ญ์ ํ maxDuration
ํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.) ๋ฐ๋ผ์ ๊ทํ์ ์๊ฐ๊ณผ ์๊ฐ์ ๋ชจ๋ ์ฌ์ฉํ ์ ์์ ๋๊น์ง ๋ฐ์ฏค ๊ตฌ์ด ์์ด๋์ด๋ฅผ ๊ณต์ ํ๋ ๊ฒ์ ๋ณด๋ฅํ๊ณ ์ถ์ต๋๋ค. ์ด๋ ์ฐ๋ฆฌ๊ฐ ๊ณผ๊ฑฐ์ React๋ฅผ ๊ฐ๋ฐํ ๋ฐฉ์๊ณผ๋ ์ผ์นํฉ๋๋ค. ๋ฌด์ธ๊ฐ๊ฐ ์ง์ ์ผ๋ก ์ค๋น๋๋ฉด(์ฌ์ง์ด ๋ฉํ ๋ชจ๋ธ์ ์ด๋ก ์ ์ธ ์์ฑ์ ์ํด์๋ผ๋), ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ฌธ์ํํ๊ณ ์ค๋ช
ํ๋ ๋ฐ ๋ชจ๋ ์ฃผ์๋ฅผ ์ง์คํ ๊ฒ์
๋๋ค.
์ฐธ๊ณ ๋ก ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ํ Suspense๋ ์ฌ๋๋ค์ด ์ต์ํ๋ ๊ฒ๊ณผ๋ ์ถฉ๋ถํ ๋ค๋ฅธ ๋ฉํ ๋ชจ๋ธ์ ๋๋ค. Redux์ ๊ฐ์ ๋งค์ฐ ์ ํ๋์ง ์์ ๋ฉ์ปค๋์ฆ๊ณผ ํตํฉ๋ ๋ ๋ฐ๋์ ๊ฐ๋ ฅํ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ๋ ๊ฒ์ ๊ณต์ ํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ๋ณด๊ฒ ๋ ๊ฒ์ ๋๋ค. ์ง๊ธ์ ๋ญ๋ผ ๋ง์๋๋ฆฌ๊ธฐ ์ด๋ ต์ต๋๋ค.
@gaearon ๋คํ์ค๋ฝ๊ฒ๋ Suspense์ ๋ฉํ ๋ชจ๋ธ์ ์ ์ ์๋ฒฝํ๊ฒ ์ผ์นํฉ๋๋ค. ํผ์ฆ ์กฐ๊ฐ์ด ์ ์๋ฆฌ์ ๋์ด๊ฒ ๋์ด ๋งค์ฐ ๊ธฐ์ฉ๋๋ค. ๋ชจ๋ ๋ ธ๋ ฅ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
์ง๋ 11์์ ๋ฐํ๋ ๋ก๋๋งต(https://reactjs.org/blog/2018/11/27/react-16-roadmap.html)์ ๋ฐ๋ฅด๋ฉด Suspense์ "๋์" ๋ฒ์ ์ 2019๋ 2๋ถ๊ธฐ๋ก ์์ ๋์ด ์์ต๋๋ค. Q3 2019. Q3๊ฐ ์๋ Q3 ๋๋ Q3 ๋ฑ์ ์ธก๋ฉด์์ ์ป์ ์ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
์ด๊ฒ์ ๋ด๊ฐ ์ฐพ์ ์ ์๋ ์ต์ ๋ก๋๋งต ์ ๋ฐ์ดํธ์์ต๋๋ค. https://reactjs.org/blog/2019/08/08/react-v16.9.0.html#an -update-to-the-roadmap
์ฐ๋ฆฌ๋ 10์์ ์คํ์ ์ธ ๋ฆด๋ฆฌ์ค๋ฅผ ์ ๊ณตํ์ต๋๋ค: https://reactjs.org/docs/concurrent-mode-intro.html. ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ํ๋ก๋์ ์์ ์คํ ์ค์ธ ๊ฒ๊ณผ ๋์ผํ ๋น๋์ ๋๋ค. API๋ฅผ ์กฐ์ ํ๊ณ ๋ ๋์ ์์ค์ API๋ฅผ ๊ตฌ์ถํ๋ ์ธก๋ฉด์์ ์์ง ํด์ผ ํ ์ผ์ด ๋ ์์ง๋ง ์ํ๋ ๊ฒฝ์ฐ ์์ํ ์ ์์ต๋๋ค.
์์คํ์ค๊ฐ ๋ ์ฃฝ์ด๊ณ ์์ด
@gaearon ํ๋ก๋์ ์์ ์ฌ์ฉ
์ฐ๋ฆฌ๋ ๋ชจ๋ ์ด ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ ์ ํ๊ณ ์์ผ๋ฉฐ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์ฌ๋ฌ๋ถ์ฒ๋ผ ๋ช์ ๋น ์ ธ ์๋ค๊ณ ํ์ ํฉ๋๋ค. ์ฝ๊ฐ์ ๋ช ํ์ฑ, ๋ธ๋ก๊ทธ, SOMETHING์ด ์ ๋ง ๋์์ด ๋ ๊ฒ์ ๋๋ค. ๊ฑฐ์ "Facebook์์ ํ๋ก๋์ ์ค์ด๋ฏ๋ก ์๋ฃ๋์์ต๋๋ค."์ ๊ฐ์ ๋๋์ด ๋ญ๋๋ค.
@mschipperheyn
์ด๊ฒ์ ๋ค๋ ๊ฐ์ ํ๋ก์ ํธ์ ๋๋ค. ์ ์งํ ๋๋ต์ ์ฐ๋ฆฌ๊ฐ 2๋ ์ ์ ์์ํ์ ๋ ์๊ฐํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ์์ ์ ๋ณ์๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ข์ ์์์ ์ด์ ํ๋ก๋์ ์์ ๋ง์ด ์ฌ์ฉ ํ๊ธฐ ๋๋ฌธ์ ๋๋ฝ๋ ๋ถ๋ถ์ด ๋ช ํํ๊ณ ํฐ๋์ ๋์ด ๋ณด์ ๋๋ค. ์ด๋ก ์ ์ธ ๊ฒ์ด ์๋๋๋ค. ๊ด๋ฒ์ํ๊ฒ ์ฑํํ ์ค๋น๊ฐ ๋์๋ค๊ณ ํธ์ํ๊ฒ ๋งํ ์ ์๊ธฐ ์ ์ ์๋ฃํด์ผ ํ๋ ์ ํํ ์ธํธ๊ฐ ์์ต๋๋ค.
์ค๋๋ ๋ค์ํ ์์ ํ๋ฆ์ ๋๋ต์ ์ธ ์ํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<Suspense>
์ฌ์ฉํ์ฌ ์ฝ๋ ๋ถํ ์ ๋ํ API lazy
. (16.6 ๋ฐ์์ ์ ๊ณต)createRoot
๋ฐ useTransition
. (์์ ์ฌ์ฉํ ์์๋ experimental
์ถ์)event
์์ ๊ธฐ๋ณธ ์ฐ์ ์์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์ข์ต๋๋ค.๊ฑฐ์ "Facebook์์ ํ๋ก๋์ ์ค์ด๋ฏ๋ก ์๋ฃ๋์์ต๋๋ค."์ ๊ฐ์ ๋๋์ด ๋ญ๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ๋ณด์ผ ์ ์๋์ง ์ ์ ์์ต๋๋ค. :-) ์ฐ๋ฆฌ๋ ์ง๋ ๋ช ๋ฌ ๋์ ์ด ๋ฌธ์ ์ ๋ํด ๋ ผ์คํฑ์ผ๋ก ์์ ํด ์์ผ๋ฉฐ ๋ง์ ๊ธฐ์ ์ ์ธ ์ธก๋ฉด์ด ์๋ฃ๋์๊ฑฐ๋ ๊ฑฐ์ ๋ง๋ฌด๋ฆฌ ๋จ๊ณ์ ์์ต๋๋ค. ๋๋จธ์ง ์์ ์ ๋๋ถ๋ถ์ ๋ ๊ฐ์ง ๋ฒ์ฃผ๋ก ๋๋ฉ๋๋ค.
์์ ์ ์ธ ๋ฆด๋ฆฌ์ค์์ ์ด๋ฅผ ๊ฐํํ๊ธฐ ์ ์ ์ด๊ธฐ ์ค๊ณ์์ ๋ฐ๊ฒฌํ ๊ฒฐํจ์ ์์ ํฉ๋๋ค. ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ์ง๊ธ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์ถ์ํ๋ค๋ฉด, ์ฐ๋ฆฌ๋ ๋ช ๋ฌ ์์ ์ค๋ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ๋ผ์ผ ํ ๊ฒ์ ๋๋ค. ํผ๋์ค๋ฌ์ธ ๋ฟ์ ๋๋ค.
์ํ๊ณ ํธํ์ฑ ๋ฐ ์ข์ ๊ธฐ๋ณธ๊ฐ. ์ค๋๋ ์๋ฌด๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ๋ฆด๋ฆฌ์คํ๋ ๊ฒ์ ๊ทธ๋ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ธฐ์กด ์ ๊ทผ ๋ฐฉ์์์ ์๋ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋์์ด ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ๋๋ถ๋ถ์ ์์
(์: useMutableSource
ํตํ Flux ๊ณ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํธํ์ฑ, ๋ ๋์ ์ด๋ฒคํธ ์๋ฏธ ์ ํ, ๊ถ์ฅ ์บ์ฑ ์ ๋ต ์ ๊ณต)์ ์ฐ๋ฆฌ๊ฐ ๋ฆด๋ฆฌ์คํ ๊ฒ์ ์ค์ ๋ก ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ๊ธด ๊ผฌ๋ฆฌ์
๋๋ค.
"์ค๋ ์ฌ์ฉํ ์ ์์ต๋๊น?"๋ผ๋ ์ธก๋ฉด์์... ์๋ฐํ ๋งํ๋ฉด ์ค๋ ์ด ๋ชจ๋ ๊ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ํ๋ค. ํนํ Relay Hooks์ Concurrent ๋ชจ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์์ง ์ค์ํ ๋ณ๊ฒฝ ์ฌํญ๊ณผ ์๋ ค์ง ๋ฌธ์ ๊ฐ ์์ผ๋ฏ๋ก ํ์ฌ ์ํ๋ ๊ด๋ฒ์ํ๊ฒ ์ฑํํ ์ค๋น๊ฐ ๋์๋ค๊ณ ์๊ฐํ๋ ๊ธฐ์ค์ ์ถฉ์กฑํ์ง ๋ชปํ๊ณ ์์ต๋๋ค. ๋ฌผ๋ก , ๋ฒ๊ทธ๋ API๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๊บผ๋ คํ์ง ์๋๋ค๋ฉด ์ฐ๋ฆฌ์ฒ๋ผ @experimental
๋ฆด๋ฆฌ์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ๋ Facebook์ด "์๋ฃ"๋ผ๋ ์ธก๋ฉด์์ ํน๋ณํ ์์น์ ์๋ค๊ณ ๋งํ์ง ์์ต๋๋ค. ์ ๋ฐ๋๋ก ์ฐ๋ฆฌ๋ ์์ง ๋๋์ง ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ด๋ถ์ ์ผ๋ก๋ ์ฐ๋ฆฌ๊ฐ ๊ตฌ์ถํ๊ณ ์๋ ๊ฒ์ด ๊ฒฌ๊ณ ํ๋ค๋ ๊ฒ์ ์๊ธฐ ๋๋ฌธ์ ์์ง์ด๋ ๊ธฐ์ฐจ์ ์๋จ์ ๋ณ๋๊ณผ ๊ตฌ์ถ์ ๊ธฐ๊บผ์ด ๊ฐ์ํ ์ฉ์๊ฐ ์์ต๋๋ค. ์ด ๋ฌด๊ฑฐ์ด dogfood๊ฐ ์์๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ 6๊ฐ์ ๋ง์ ๋ฐ๊ฒฌํ ๊ฒฐํจ์ ๋ฐ๊ฒฌํ๊ณ ์ฌ์ค๊ณํ๋ ๋ฐ ๋ช ๋ ์ด ๊ฑธ๋ ธ์ ๊ฒ์ ๋๋ค.
์์ฝํ์๋ฉด, ํด์ผ ํ ์ผ์ด ๋ ์์ต๋๋ค.
@gaearon ์
๋ฐ์ดํธ ๊ฐ์ฌํฉ๋๋ค! ๊ทธ๋ฆฌ๊ณ ์ ๋ชฉ์๋ฆฌ๊ฐ ํ๋ ธ๋ค๋ฉด ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ๋๋ ๋ด๊ฐ ๋ช ๋ฌ ๋์ ํธ์ํฐ๋ฅผ ๋ค์ง๊ณ ์๋ฌด๊ฒ๋ ์ฐพ์ง ๋ชปํ ๊ฒ์ ์ฝ๊ฐ ์ค๋งํ๋ค๋ ๊ฒ์ ์ธ์ ํฉ๋๋ค. ์ด ์ธก๋ฉด Server renderer immediately flushes Suspense fallbacks (available in experimental releases)
์ ๊ตฌํ์ ์ํด Apollo Graphql๋ก ํ
์คํธํ ๋ ์๊ฐ์ ํ ๋นํ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
์, ๋์๊ด ์ ์์ ํธ๊ธฐ์ฌ ๋ง์ ์ฌ๋๋ค์ด ๊ฐ์ง๊ณ ๋ ์ค๋น๊ฐ ๋์ด ์์ด์ผ ํฉ๋๋ค. ๋๋ฝ๋ ๋ถ๋ถ์ ๋๋ถ๋ถ "ํ๋ณตํ ๊ธธ"์ ์ ๊ณตํ๋ ๊ฒ์ ๊ดํ ๊ฒ์ด์ง๋ง ๋๋ถ๋ถ์ ๋ฐฐ๊ด์ ๊ฑฐ๊ธฐ์ ์์ด์ผ ํฉ๋๋ค.
์๋ฒ ๋ ๋๋ฌ๋ Suspense ํด๋ฐฑ์ ์ฆ์ ํ๋ฌ์ํฉ๋๋ค(์คํ ๋ฆด๋ฆฌ์ค์์ ์ฌ์ฉ ๊ฐ๋ฅ).
์ด๊ฒ์ ๋ํด ์ด๋์์ ์ฝ์ ์ ์์ต๋๊น? Concurrent Mode API Reference(์คํ์ )๋ฅผ ๊ธฐ๋ํ์ง๋ง ์ด์ด ์์์ต๋๋ค.
๋๊ตฐ๊ฐ Next.js, Relay Hooks ๋ฐ Concurrent Mode(SSR ํฌํจ)๋ฅผ ํจ๊ป ์คํฐ์นญํ๋ ๋ฐ๋ชจ๊ฐ ์๋ค๋ฉด ๊ต์ฅํ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ถฉ๋ถํ ๋ฌธ์๋ฅผ ์ฐพ์ ์๋ง ์๋ค๋ฉด ์ด์ ์ํํด ๋ณผ ์๋ ์์ต๋๋ค.
@CrocoDillon
SSR์ ๋ํ ์ถ๊ฐ ๋ฌธ์๋ ์์ง๋ง ๋๋ถ๋ถ ์๋ก์ด ๊ธฐ๋ณธ ๋์์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ตฌ์ฑ ์์๊ฐ ์๋ฒ์์ ์ผ์ ์ค๋จ๋ ๋๋ณด๋ค ์คํ์ ์ธ ๋ฆด๋ฆฌ์ค๊ฐ ์๋ ๊ฒฝ์ฐ ๋์ ๊ฐ์ฅ ๊ฐ๊น์ด Suspense ํด๋ฐฑ์ ํ๋ฌ์ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํด๋ผ์ด์ธํธ์์ createRoot(node, { hydrate: true }).render(<App />)
ํฉ๋๋ค.
์ด๊ฒ์ ์ด๋ฏธ ๋ชจ๋ ์๋ก์ด ์ํ ๊ธฐ๋ฅ์ ํ์ฑํํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์์คํ์ค ๊ฒฝ๊ณ๋ ์๋ฒ์์ ์์ฑ๋ ํด๋ฐฑ HTML์ "์ฒจ๋ถ"๋ ๋ค์ ํด๋ผ์ด์ธํธ ๋ ๋๋ง์ ์๋ํฉ๋๋ค.
๋ํ ์ ์ฒด ์ฑ์ด ๋ก๋ ๋๊ธฐ ์ ์ ์๋ถ ๊ณต๊ธ์ ์์ํ ์ ์์ต๋๋ค. <App>
๊ฐ ์ถฉ์ ๋๋ฉด ์๋ถ์ ๊ณต๊ธํ ์ ์์ต๋๋ค. ์ฝ๋๊ฐ ์ค๋น๋์ง ์์์ ๋ ์๋ ๊ตฌ์ฑ ์์๊ฐ ์ผ์ ์ค๋จ๋๋ ํ(๊ฒ์ผ๋ฅธ ๊ฒ๊ณผ ์ ์ฌ). ์ด ๊ฒฝ์ฐ React๊ฐ ํ๋ ์ผ์ ์๋ฒ HTML ์ฝํ
์ธ ๋ฅผ ์ ์ง ํ๋ฉด์ Suspense ๊ฒฝ๊ณ๋ฅผ "์ฒจ๋ถ"ํ๋ ๊ฒ์
๋๋ค. ํ์ ๊ตฌ์ฑ ์์๊ฐ ๋ก๋๋๋ฉด ๊ณ์ ์๋ถ ๊ณต๊ธ๋ฉ๋๋ค. ์ํ๋ ๋ถ๋ถ์ ๋ํํ ๋ฐ ์ฌ์ ์ด๋ฒคํธ๊ฐ ๋ฉ๋๋ค.
๋ค์ ํตํฉ ์๋/์์ ๋ํด @devknoll ์๊ฒ ์์ฒญํ ์ ์์ต๋๋ค. ๊ทธ๋ ์๋ง ์ผ๋ถ๊ฐ ์์ต๋๋ค.
react@experimental
๋ฐ react-dom@experimental
ํ๊ณ next.config.js
๋ค์์ ์ถ๊ฐํ์ฌ Next.js์์ ๋์ ๋ชจ๋๋ฅผ ํ์ฑํํ ์ ์์ต๋๋ค.
// next.config.js
module.exports = {
experimental: {
reactMode: 'concurrent'
}
}
๋ค์์ ์ด์ ๋ํ Next.js ํ ๋ก ์ ๋๋ค. https://github.com/zeit/next.js/discussions/10645
์๋ฒ ๋ ๋๋ง์์ ์ค๋จ์ ๊ธฐ๋ค๋ฆด ์ ์์ต๋๊น(์: ์ ์ ์ฌ์ดํธ ์์ฑ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ)? ์ฝ๋ฐฑ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ ๊ธฐ๋ณธ๊ฐ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ์ฌ์ ์ ๊ฐ๋ฅํ์ง ๊ถ๊ธํฉ๋๋ค.
๋ํ ์ ์ฒด ์ฑ์ด ๋ก๋๋๊ธฐ ์ ์ ์๋ถ ๊ณต๊ธ์ ์์ํ ์ ์์ต๋๋ค. ์ธ์
์๋ถ์ ๊ณต๊ธํ ์ ์์ต๋๋ค. ์ฝ๋๊ฐ ์ค๋น๋์ง ์์์ ๋ ์๋ ๊ตฌ์ฑ ์์๊ฐ ์ผ์ ์ค๋จ๋๋ ํ(๊ฒ์ผ๋ฅธ ๊ฒ๊ณผ ์ ์ฌ). ์ด ๊ฒฝ์ฐ React๊ฐ ํ๋ ์ผ์ ์๋ฒ HTML ์ฝํ ์ธ ๋ฅผ ์ ์งํ๋ฉด์ Suspense ๊ฒฝ๊ณ๋ฅผ "์ฒจ๋ถ"ํ๋ ๊ฒ์ ๋๋ค. ํ์ ๊ตฌ์ฑ ์์๊ฐ ๋ก๋๋๋ฉด ๊ณ์ ์๋ถ ๊ณต๊ธ๋ฉ๋๋ค. ์ํ๋ ๋ถ๋ถ์ ๋ํํ ๋ฐ ์ฌ์ ์ด๋ฒคํธ๊ฐ ๋ฉ๋๋ค.
@gaearon ์ผ๋ฐ์ ์ผ๋ก ์๋ฒ์์๋ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ์ ์์ง๋ง ํด๋ผ์ด์ธํธ์์๋ React.lazy๋ฅผ ์ฌ์ฉํ๋ค๋ ๋ป์ธ๊ฐ์? ์๋ฒ์์ ์ ์ฒด ๋งํฌ์ ์ ๋ฐํํ ์ ์์ง๋ง ํด๋ผ์ด์ธํธ์์ ๊ตฌ์ฑ ์์ ์ฝ๋์ ๊ตฌ๋ฌธ ๋ถ์ ๋ฐ ๋ ๋๋ง์ด ์ง์ฐ๋ฉ๋๋ค. ์๋ฒ์์ ๋ ๋๋ง๋ ๋งํฌ์ ์ด ์ฌ๊ธฐ์ ์์คํ์ค ํด๋ฐฑ ์ญํ ์ ํฉ๋๊น?
@robrichard ์ค์ ๋ก React.lazy
์๋ํ์ง๋ ์์์ง๋ง(FB์์ ๋ค๋ฅธ ๋ํผ๋ฅผ ์ฌ์ฉํ๊ณ Next์๋ ์์ฒด ๋ฒ์ ์ด ์์) ์ด๊ฒ์ด ์๋ํ๋ ๋ฐฉ์์
๋๋ค. ํ์ธํ ๊ฐ์น๊ฐ ์์ต๋๋ค :-) ํน์ ์ ํ ์ฌํญ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด props๋ฅผ ์
๋ฐ์ดํธํ๊ณ ์์ ๋ฉ๋ชจ ๊ตฌ์ ๊ธ์ต์ด ์๋ ๊ฒฝ์ฐ ๋๋ ๊ทธ ์์ ์ปจํ
์คํธ๋ฅผ ์
๋ฐ์ดํธํ๋ ๊ฒฝ์ฐ ๋ฌด์์ ํด์ผ ํ ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ ๊ฑฐํ๊ณ ๋์ฒด๋ฅผ ํ์ํด์ผ ํฉ๋๋ค. ๊ทธ๊ฒ์ผ๋ก.
@gaearon ํ์ฌ ์ํ ๋ถ๋ถ์๋ถ์? #14717์ด ๋ณํฉ๋์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ด๋ค ๋ฆด๋ฆฌ์ค๋ก ๋ง๋ค์ด์ก๋์ง ์์ฌ์ค๋ฝ์ต๋๋ค.
unstable_createRoot
API๋ฅผ ์ฌ์ฉํ๋ ํ ์ค๋ซ๋์ ๋ชจ๋ @experimental
๋ฆด๋ฆฌ์ค์์ ์ฌ์ฉ๋์์ต๋๋ค.
๋ฐ๋ชจ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. https://codesandbox.io/s/floral-worker-xwbwv?file=/src/index.js
@gaearon "๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ข ์์ฑ"์ด ๋ฌด์์ ์๋ฏธํ๋์ง ์์ธํ
@gaearon "๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ข ์์ฑ"์ด ๋ฌด์์ ์๋ฏธํ๋์ง ์์ธํ
๋ฌผ๋ก ์ด์ฃ . ์์ ๋ชฉ๋ก์ด ๊ฐ๊ฒฐํ ๊ฒ์ ๋ํด ์ฌ๊ณผํด์ผ ํฉ๋๋ค. ๋งค์ฐ ์์ถ๋์ด ์๊ณ ์ด๋ค ์ค ๋ง์ ๋ถ๋ถ์ด ์ค์ํ ๋ณ๋์ ํ์ ํ๋ก์ ํธ์ ๋๋ค(์ด ๋๋ฌธ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์ด์ ์ ๋๋ค).
๊ทํ์ ํน์ ์ง๋ฌธ์ ๋ตํ๊ธฐ ์ ์ ํ ๊ฑธ์ ๋ฌผ๋ฌ๋์ ์ข ๋ ๋์ ๋งฅ๋ฝ์ ๋ง์๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋ ๋์ ๋งฅ๋ฝ์ ์ ๋ง ์ข์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์๋ฃจ์ ์ ๊ตฌ์ถํ๋ ๊ฒ์ด ์ ๋ง ์ ๋ง ์ด๋ ต๋ค๋ ๊ฒ์ ๋๋ค. ๊ตฌํ์ ์๋ฏธ์์๋ฟ๋ง ์๋๋ผ ๋์์ธ์ ์๋ฏธ์์๋. ์ผ๋ฐ์ ์ผ๋ก ์ฝ๋ก์ผ์ด์ (๋ฐ์ดํฐ ์๊ตฌ ์ฌํญ์ ๋ฐ์ดํฐ๊ฐ ์ฌ์ฉ๋๋ ์์น์ ๊ฐ๊น๊ฒ ์ ์ง)๊ณผ ํจ์จ์ฑ(๋ฐ์ดํฐ ๋ก๋๋ฅผ ์ผ๋ง๋ ์ผ์ฐ ์์ํ๊ณ ๋คํธ์ํฌ ํญํฌ์๋ฅผ ํผํ ์ ์๋์ง) ๊ฐ์ ์ ์ถฉ์์ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ์๊ท๋ชจ์์๋ ๋์ ๋์ง ์์ง๋ง ๊ตฌ์ฑ ์์์ ์๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๋ฐ์ด๋ ์ฑ๋ฅ๊ณผ ์ฐ๊ธฐ ์ฌ์ด ์ฝ๋ ์ค์์ ์ ํํด์ผ ํฉ๋๋ค. ๋ง์ ๊ฒฝ์ฐ์ ๋ถํํ๋ ๋ ๋ค ์ป์ง ๋ชปํฉ๋๋ค. ์ด๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ๋จ๊ฑฐ์ด ์ฃผ์ ์ธ ์ด์ ์ ๋๋ค.
์ฐ๋ฆฌ๋ "๊ณต์" React์ ๋ค์ด๊ฐ๋ ๊ฒ์ ๋ํด ๋งค์ฐ ๋์ ๊ธฐ์ค์ ๊ฐ์ง๊ณ ์์ต๋๋ค. "Reacty"๊ฐ ๋๋ ค๋ฉด ์ผ๋ฐ React ๊ตฌ์ฑ ์์์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์์ฒ ๊ฐ์ ๊ตฌ์ฑ ์์๋ก ํ์ฅ๋ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ง ์๋ ์๋ฃจ์ ์ ์ ์๋ก ์ถ์ฒํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ํ ์ฑ๋ฅ์ ์ ์งํ๊ธฐ ์ํด ๋ณต์กํ ์ต์ ํ๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋๋ก ํ๋ ์๋ฃจ์ ์ ๊ถ์ฅํ์ง ์์ต๋๋ค. FB์์ ์ฐ๋ฆฌ๋ Relay ํ์ผ๋ก๋ถํฐ ๋ง์ ๊ตํ์ ์ป์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ ์ฌ๋์ด GraphQL์ ์ฌ์ฉํ ์ ์๊ฑฐ๋ Relay๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ดํ์ง ์๋๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ผ๋ฐ React์ฉ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์๋ฃจ์ ์ด Relay์์ ์ด๋ ต๊ฒ ์ป์ ๊ตํ ์
์ ๋ ์ด๊ฒ์ด ๋จ์ง ํฐ ์ฑ์ ๊ดํ ๊ฒ์ด ์๋๋ผ๋ ์ ์ ๊ฐ์กฐํ๊ณ ์ถ์ต๋๋ค. ๋ฌธ์ ๋ ํฐ ์ฑ์์ ๊ฐ์ฅ ๋๋๋ฌ์ง์ง๋ง npm์์ ๋ง์ ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ์ ธ์ค๋ ์์ ์ฑ๋ ์ด๋ฌํ ๋นํจ์จ์ฑ์ ํ์ ์งํฉ์ผ๋ก ์ด๋ ค์์ ๊ฒช์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋๋ฌด ๋ง์ ํด๋ผ์ด์ธํธ ์ธก ์ฝ๋๋ฅผ ์ ๋ฌํ๊ณ ์ด๋ฅผ ์ํฐํด์ ๋ก๋ํ๋ ๊ฒ์ ๋๋ค. ๋๋ ๋๋ฌด ๋ง์ด ๋ฏธ๋ฆฌ ๋ก๋ํฉ๋๋ค. ๋ํ ์์ ์ฑ์ ์์ ์ฑ์ผ๋ก ์์ํ ๋จ์ ์์ง ์์ต๋๋ค. React ๊ตฌ์ฑ ์์ ๋ชจ๋ธ์ด ์ฑ์ ๋ณต์ก์ฑ์ ๊ด๊ณ์์ด ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ํ๋ ๊ฒ์ฒ๋ผ ๋ชจ๋ ํฌ๊ธฐ์ ์ฑ์ ๋ํด ์ ์๋ํ๋ ์๋ฃจ์ ์ ์ํฉ๋๋ค.
์ด์ ๊ทํ์ ํน์ ์ง๋ฌธ์ ํด๊ฒฐํฉ๋๋ค. ๋ฆด๋ ์ด์๋ "๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ข
์์ฑ"์ด๋ผ๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ํด ์๊ฐํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋์ import
์ ์งํ์
๋๋ค. ๋์ import
์ด ํญ์ ํจ์จ์ ์ธ ๊ฒ์ ์๋๋๋ค. ์กฐ๊ฑด์ด ์ฐธ์ผ ๋๋ง ์ผ๋ถ ์ฝ๋๋ฅผ ๋ก๋ํ๋ ค๋ ๊ฒฝ์ฐ(์: "์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋์ง" ๋๋ "์ฌ์ฉ์์๊ฒ ์ฝ์ง ์์ ๋ฉ์์ง๊ฐ ์์ต๋๊น?"), ์ ์ผํ ์ต์
์ ๋๋ฆฌ๊ฒ ํธ๋ฆฌ๊ฑฐํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋ฌด์ธ๊ฐ๊ฐ ์ฌ์ฉ๋ ๋๋ง ๊ฐ์ ธ์ค๊ธฐ(์: React.lazy
)๋ฅผ "์์"ํ๋ค๋ ์๋ฏธ์
๋๋ค. ์ฌ์ค ๋๋ฌด ๋ฆ์์ด์. ์๋ฅผ ๋ค์ด, ์ฌ๋ฌ ์์ค์ ์ฝ๋ ๋ถํ ๊ตฌ์ฑ ์์(๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ตฌ์ฑ ์์)๊ฐ ์๋ ๊ฒฝ์ฐ ๊ฐ์ฅ ์์ชฝ์ ์๋ ๊ตฌ์ฑ ์์๋ ์์ ์๋ ๊ตฌ์ฑ ์์๊ฐ ๋ก๋๋ ํ์๋ง ๋ก๋๋ฅผ ์์ํฉ๋๋ค. ์ด๊ฒ์ ๋นํจ์จ์ ์ด๋ฉฐ ๋คํธ์ํฌ "ํญํฌ"์
๋๋ค. ๋ฆด๋ ์ด "๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ข
์์ฑ"์ ์ฌ์ฉํ๋ฉด ์ฟผ๋ฆฌ์ ์ผ๋ถ๋ก ๊ฐ์ ธ์ค๋ ค๋ ๋ชจ๋์ ์ง์ ํ ์ ์์ต๋๋ค. ์ฆ, "์ผ๋ถ ์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด ๋ฐ์ดํฐ ์๋ต๊ณผ ํจ๊ป ์ด ์ฝ๋ ์ฒญํฌ๋ฅผ ํฌํจํฉ๋๋ค". ์ด๋ ๊ฒ ํ๋ฉด ํ์ํ ๋ชจ๋ ์ฝ๋ ๋ถํ ์ฒญํฌ๋ฅผ ์ต๋ํ ๋นจ๋ฆฌ ๋ก๋ํ ์ ์์ต๋๋ค. ์ฑ๋ฅ์ ์ํด ์ฝ๋ก์ผ์ด์
์ ๊ตํํ ํ์๊ฐ ์์ต๋๋ค. ๋ณ ๊ฒ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง ์ ํ ์ฝ๋์์ ๋ฌธ์ ๊ทธ๋๋ก ์ด๋ฅผ ์ค์์ต๋๋ค.
์ด์ ๋ค์, ์ฐ๋ฆฌ๋ Relay๋ฅผ React์ ๋ฃ์ง ์์ ๊ฒ์ด๋ฉฐ ์ฌ๋๋ค์ด GraphQL์ ์ฌ์ฉํ๋๋ก ๊ฐ์ํ๊ณ ์ถ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ๋ ์ ์ผ๋ก ๊ธฐ๋ฅ ์์ฒด๋ ์ผ๋ฐ์ ์ด๋ฉฐ ์ด์ ๋ํ ์ข์ ์คํ ์์ค ์๋ฃจ์ ์ ์ฌ์ฉํ๋ฉด ์ฌ๋๋ค์ด ์ค๋๋ ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ์ฝ๋ ๋ถํ ์ ์ํํ ์ ์์ต๋๋ค(๋ฐ๋ผ์ ํด๋ผ์ด์ธํธ JS ์ฝ๋๋ฅผ ํจ์ฌ ์ ๊ฒ ์ ๊ณตํฉ๋๋ค!). ํด๋น ์ผ๋ฐ ๊ธฐ๋ฅ์ ํธ์ถ๋์ง ์์ต๋๋ค. "๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ข ์์ฑ" โ ์ ๊ฐ ์ธ๊ธํ ๋ฆด๋ ์ด ์ด๋ฆ์ผ ๋ฟ์ ๋๋ค. ์ด ๊ธฐ๋ฅ์ GraphQL์ด ํ์ํ์ง ์์ ๋ ํฐ ๊ถ์ฅ ์๋ฃจ์ ์ ์ผ๋ถ๊ฐ ๋ ๊ฒ์ ๋๋ค. ํ๋์ ๊ธ๋จธ๋ฆฌ ๊ธฐํธ ๋ชฉ๋ก ํญ๋ชฉ์ ๋ํด ์ค๋ช ํ ๋ด์ฉ์ด ๋ง๊ธฐ ๋๋ฌธ์ ๋ชฉ๋ก์์ ํด๋น ์ด๋ฆ์ผ๋ก ์ฐธ์กฐํ์ต๋๋ค.
์ด๊ฒ์ด ํด๊ฒฐ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@mschipperheyn
์ด๊ฒ์ ๋ค๋ ๊ฐ์ ํ๋ก์ ํธ์ ๋๋ค. ์ ์งํ ๋๋ต์ ์ฐ๋ฆฌ๊ฐ 2๋ ์ ์ ์์ํ์ ๋ ์๊ฐํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ์์ ์ ๋ณ์๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ข์ ์์์ ์ด์ ํ๋ก๋์ ์์ ๋ง์ด ์ฌ์ฉ ํ๊ธฐ ๋๋ฌธ์ ๋๋ฝ๋ ๋ถ๋ถ์ด ๋ช ํํ๊ณ ํฐ๋์ ๋์ด ๋ณด์ ๋๋ค. ์ด๋ก ์ ์ธ ๊ฒ์ด ์๋๋๋ค. ๊ด๋ฒ์ํ๊ฒ ์ฑํํ ์ค๋น๊ฐ ๋์๋ค๊ณ ํธ์ํ๊ฒ ๋งํ ์ ์๊ธฐ ์ ์ ์๋ฃํด์ผ ํ๋ ์ ํํ ์ธํธ๊ฐ ์์ต๋๋ค.
์ค๋๋ ๋ค์ํ ์์ ํ๋ฆ์ ๋๋ต์ ์ธ ์ํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<Suspense>
์ฌ์ฉํ์ฌ ์ฝ๋ ๋ถํ ์ ๋ํ APIlazy
. (16.6 ๋ฐ์์ ์ ๊ณต)createRoot
๋ฐuseTransition
. (์์ ์ฌ์ฉํ ์์๋experimental
์ถ์)event
์์ ๊ธฐ๋ณธ ์ฐ์ ์์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์ข์ต๋๋ค.๋๋ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ๋ณด์ผ ์ ์๋์ง ์ ์ ์์ต๋๋ค. :-) ์ฐ๋ฆฌ๋ ์ง๋ ๋ช ๋ฌ ๋์ ์ด ๋ฌธ์ ์ ๋ํด ๋ ผ์คํฑ์ผ๋ก ์์ ํด ์์ผ๋ฉฐ ๋ง์ ๊ธฐ์ ์ ์ธ ์ธก๋ฉด์ด ์๋ฃ๋์๊ฑฐ๋ ๊ฑฐ์ ๋ง๋ฌด๋ฆฌ ๋จ๊ณ์ ์์ต๋๋ค. ๋๋จธ์ง ์์ ์ ๋๋ถ๋ถ์ ๋ ๊ฐ์ง ๋ฒ์ฃผ๋ก ๋๋ฉ๋๋ค.
์์ ์ ์ธ ๋ฆด๋ฆฌ์ค์์ ์ด๋ฅผ ๊ฐํํ๊ธฐ ์ ์ ์ด๊ธฐ ์ค๊ณ์์ ๋ฐ๊ฒฌํ ๊ฒฐํจ์ ์์ ํฉ๋๋ค. ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ์ง๊ธ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์ถ์ํ๋ค๋ฉด, ์ฐ๋ฆฌ๋ ๋ช ๋ฌ ์์ ์ค๋ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ๋ผ์ผ ํ ๊ฒ์ ๋๋ค. ํผ๋์ค๋ฌ์ธ ๋ฟ์ ๋๋ค.
์ํ๊ณ ํธํ์ฑ ๋ฐ ์ข์ ๊ธฐ๋ณธ๊ฐ. ์ค๋๋ ์๋ฌด๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ๋ฆด๋ฆฌ์คํ๋ ๊ฒ์ ๊ทธ๋ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ธฐ์กด ์ ๊ทผ ๋ฐฉ์์์ ์๋ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋์์ด ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ๋๋ถ๋ถ์ ์์ (์:
useMutableSource
ํตํ Flux ๊ณ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํธํ์ฑ, ๋ ๋์ ์ด๋ฒคํธ ์๋ฏธ ์ ํ, ๊ถ์ฅ ์บ์ฑ ์ ๋ต ์ ๊ณต)์ ์ฐ๋ฆฌ๊ฐ ๋ฆด๋ฆฌ์คํ ๊ฒ์ ์ค์ ๋ก ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ๊ธด ๊ผฌ๋ฆฌ์ ๋๋ค."์ค๋ ์ฌ์ฉํ ์ ์์ต๋๊น?"๋ผ๋ ์ธก๋ฉด์์... ์๋ฐํ ๋งํ๋ฉด ์ค๋ ์ด ๋ชจ๋ ๊ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ํ๋ค. ํนํ Relay Hooks์ Concurrent ๋ชจ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์์ง ์ค์ํ ๋ณ๊ฒฝ ์ฌํญ๊ณผ ์๋ ค์ง ๋ฌธ์ ๊ฐ ์์ผ๋ฏ๋ก ํ์ฌ ์ํ๋ ๊ด๋ฒ์ํ๊ฒ ์ฑํํ ์ค๋น๊ฐ ๋์๋ค๊ณ ์๊ฐํ๋ ๊ธฐ์ค์ ์ถฉ์กฑํ์ง ๋ชปํ๊ณ ์์ต๋๋ค. ๋ฌผ๋ก , ๋ฒ๊ทธ๋ API๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๊บผ๋ คํ์ง ์๋๋ค๋ฉด ์ฐ๋ฆฌ์ฒ๋ผ
@experimental
๋ฆด๋ฆฌ์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.์ ๋ Facebook์ด "์๋ฃ"๋ผ๋ ์ธก๋ฉด์์ ํน๋ณํ ์์น์ ์๋ค๊ณ ๋งํ์ง ์์ต๋๋ค. ์ ๋ฐ๋๋ก ์ฐ๋ฆฌ๋ ์์ง ๋๋์ง ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ด๋ถ์ ์ผ๋ก๋ ์ฐ๋ฆฌ๊ฐ ๊ตฌ์ถํ๊ณ ์๋ ๊ฒ์ด ๊ฒฌ๊ณ ํ๋ค๋ ๊ฒ์ ์๊ธฐ ๋๋ฌธ์ ์์ง์ด๋ ๊ธฐ์ฐจ์ ์๋จ์ ๋ณ๋๊ณผ ๊ตฌ์ถ์ ๊ธฐ๊บผ์ด ๊ฐ์ํ ์ฉ์๊ฐ ์์ต๋๋ค. ์ด ๋ฌด๊ฑฐ์ด dogfood๊ฐ ์์๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ 6๊ฐ์ ๋ง์ ๋ฐ๊ฒฌํ ๊ฒฐํจ์ ๋ฐ๊ฒฌํ๊ณ ์ฌ์ค๊ณํ๋ ๋ฐ ๋ช ๋ ์ด ๊ฑธ๋ ธ์ ๊ฒ์ ๋๋ค.
์์ฝํ์๋ฉด, ํด์ผ ํ ์ผ์ด ๋ ์์ต๋๋ค.