Codebase Overview
์ด ์น์ ์ React ์ฝ๋๋ฒ ์ด์ค ๊ตฌ์กฐ์ ๊ด๋ก, ๊ทธ๋ฆฌ๊ณ ๊ตฌํ์ ๋ํ ๊ฐ์๋ฅผ ์ค๋ช ํ๊ณ ์์ต๋๋ค.
React์ ๊ธฐ์ฌํ๊ณ ์ ํ๋ค๋ฉด, ์ด ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ํ๋ก์ ํธ๋ฅผ ์์ ํ๊ธธ ๋ฐ๋๋๋ค.
React ์ฑ์ ๊ฐ๋ฐํ๋๋ฐ ์์ด์ ์๋ ๊ด๋ก๋ค์ ์ฌ์ฉ์ ๋ฐ๋์ ์ถ์ฒํ์ง๋ ์์ต๋๋ค. ๋๋ถ๋ถ์ ๊ด๋ก๋ค์ ์ด์ ์ ๋ง์ด ์ฌ์ฉ๋ ๊ฒ๋ค์ด๋ฉฐ, ์ฐจ์ฐจ ์์ ๋ ๊ฒ์ ๋๋ค.
์ต์์ ํด๋
React ์ ์ฅ์๋ฅผ ํด๋ก ํ๊ฒ ๋๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ ์ต์์ ํด๋๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
packages
ํด๋๋ React ์ ์ฅ์์ ์๋ ๋ชจ๋ ํจํค์ง๋ค์ ๋ํดpackage.json
๊ณผ ๊ฐ์ ๋ฉํ๋ฐ์ดํฐ์src
ํด๋๋ฅผ ํฌํจํ๊ณ ์์ต๋๋ค. ๋ณ๊ฒฝํ๊ณ ์ ํ๋ ๋ถ๋ถ์ด ์ฝ๋์ ๊ด๋ จ๋์ด ์๋ค๋ฉด,src
ํด๋์ ๋๋ถ๋ถ์ ํ ์ ํ๊ฒ ๋ ๊ฒ์ ๋๋ค.fixtures
์๋ ๊ธฐ์ฌ์๋ค์ ์ํ ๋ช ๊ฐ์ง React ํ ์คํธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์กด์ฌํฉ๋๋ค.build
ํด๋์๋ React์ ๋น๋ ๊ฒฐ๊ณผ๊ฐ ์์ฑ๋ฉ๋๋ค. ์ ์ฅ์์๋ ์กด์ฌํ์ง ์์ง๋ง, React๋ฅผ ํด๋ก ํ๊ณ ์ฒ์ ๋น๋ํ ์ ์์ฑ๋ฉ๋๋ค.
์ค๋ช ๋ฌธ์๋ React๋ก๋ถํฐ ๋ถ๋ฆฌ๋ ์ ์ฅ์์ ์กด์ฌํฉ๋๋ค.
์์์ ์ธ๊ธํ ๊ฒ ์ธ์ ๋ณ๋์ ์ต์์ ํด๋๊ฐ ์กด์ฌํ์ง๋ง, ๋๋ถ๋ถ ๊ธฐ์ฌํ๋๋ฐ ์์ด์ ์ฌ์ฉ๋์ง ์์ ๊ฒ์ ๋๋ค.
Colocated ํ ์คํธ
ํด๋น ํ๋ก์ ํธ์๋ ์ ๋ ํ
์คํธ๋ฅผ ์ํ ์์ ๋๋ ํ ๋ฆฌ๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค. ๋์ ์์ค ์ฝ๋์ ํจ๊ป __tests__
๋๋ ํ ๋ฆฌ ๋ด๋ถ์ ํ
์คํธ ์ฝ๋๋ฅผ ํจ๊ป ๋ฃ์ด๋์ต๋๋ค.
์๋ฅผ ๋ค์ด, setInnerHTML.js
์ ๋ํ ํ
์คํธ ์ฝ๋๋ __tests__/setInnerHTML-test.js
์ ์กด์ฌํฉ๋๋ค.
๊ฒฝ๊ณ ์ ๋ถ๋ณ์
React ์ฝ๋๋ฒ ์ด์ค์์๋ console.error
๋ฅผ ์ฌ์ฉํด ๊ฒฝ๊ณ ๋ฅผ ํ์ํฉ๋๋ค.
if (__DEV__) {
console.error('Something is wrong.');
}
๊ฒฝ๊ณ ๋ ๊ฐ๋ฐ ์์๋ง ํ์๋๋ฉฐ ๋ฐฐํฌ ์์๋ ์์ ํ ๋ฌด์๋ฉ๋๋ค. ์คํ ์์ ๋ช ๊ฐ์ง ์ฝ๋๋ฅผ ๋ฌด์ํ๊ธฐ ์ํด์, ๋ค์๊ณผ ๊ฐ์ด invariant
๋ชจ๋์ ํ์ฉํ ์ ์์ต๋๋ค.
var invariant = require('invariant');
invariant(
2 + 2 === 4,
'You shall not pass!'
);
invariant
์ ๋์ ์กฐ๊ฑด์์ด false
์ผ ๋ ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
โ๋ถ๋ณ์โ์ โํด๋น ์กฐ๊ฑด์์ด ํญ์ ์ฐธ์ผ ๊ฒฝ์ฐโ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฝ๋์ ๋์์ ํ์คํ๊ฒ ํ๊ธฐ ์ํ ์์๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค.
๊ฐ๋ฐ์ฉ๊ณผ ๋ฐฐํฌ์ฉ ํ๋ก๊ทธ๋จ์ด ์๋ก ์ ์ฌํ๊ฒ ๋์ํ๋ ๊ฒ์ ์ค์ํฉ๋๋ค. ๋ฐ๋ผ์ invariant
์์ธ๋ ๊ฐ๋ฐ์ฉ๊ณผ ๋ฐฐํฌ์ฉ ํ๋ก๊ทธ๋จ์์ ๋์์ ๋ฐ์ํฉ๋๋ค. ์ค๋ฅ ๋ฉ์์ง๋ ๋ฐฐํฌ์ฉ ํ๋ก๊ทธ๋จ์์ ์ค๋ฅ ์ฝ๋๋ก ์๋ ๋ณํ๋ฉ๋๋ค.
๊ฐ๋ฐ๊ณผ ๋ฐฐํฌ
์์ฌ ์ ์ญ ๋ณ์ __DEV__
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐ ์์๋ง ์๋ํ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
ํด๋น ๋ณ์๋ ์ปดํ์ผ ๋จ๊ณ์์ ํ๋ฒ์ ์ฒ๋ฆฌ๋๋ฉฐ, CommonJS ๋น๋ ์์ process.env.NODE_ENV !== 'production'
๋ก ๋ณํ๋ฉ๋๋ค.
์คํ ๋์ผ๋ก ๋น๋์ ๊ฒฝ์ฐ, ํด๋น ๋ณ์๋ ์์ถํ์ง ์์ ์ true
๋ก ์ทจ๊ธ๋๋ฉฐ ์์ถ ์ if
๋ธ๋ก์ ํฌํจํ์ฌ ์ ๋ถ ์ ๊ฑฐ๋ฉ๋๋ค.
if (__DEV__) {
// This code will only run in development.
}
Flow
React๋ ์ต๊ทผ Flow ๊ฒ์ฌ๋ฅผ ๋์
ํ๊ธฐ ์์ํ์ต๋๋ค. ๋ผ์ด์ผ์ค ์ฃผ์์ @flow
ํ์๊ฐ ํฌํจ๋ ํ์ผ์ ์๋ฃํ ๊ฒ์ฌ๋ฅผ ๋ฐ๊ฒ ๋ฉ๋๋ค.
ํด๋น ํ๋ก์ ํธ๋ ์ด๋ฏธ ์กด์ฌํ๋ ์ฝ๋์ ๋ํ Flow ํ์ ์ถ๊ฐ์ ๋ํ ํ ๋ฆฌํ์คํธ๋ฅผ ํ์ฉํ๊ณ ์์ต๋๋ค. Flow ๊ฒ์ฌ ํ์์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
ReactRef.detachRefs = function(
instance: ReactInstance,
element: ReactElement | string | number | null | false,
): void {
// ...
}
๊ฐ๋ฅํ๋ฉด ์๋ก ์์ฑํ๋ ์ฝ๋์ Flow ๊ฒ์ฌ ํ์์ ํฌํจํด ์ฃผ๊ธธ ๋ฐ๋๋๋ค.
yarn flow
๋ช
๋ น์ด๋ฅผ ํตํด Flow์ ๋ํ ํ์ ๊ฒ์ฌ๋ฅผ ์ง์ ์ํํด ๋ณผ ์ ์์ต๋๋ค.
๋ค์ํ ํจํค์ง
React๋ monorepo์ ๋๋ค. ํด๋น ์ ์ฅ์๋ ์ฌ๋ฌ ๋ถ๋ฆฌ๋ ํจํค์ง๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉฐ, ๊ฐ ๋ณ๊ฒฝ์ ๋ค์ ํจ๊ป ๋ฐ์๋๊ณ ๋ชจ๋ ์ด์๋ ํ ๊ณณ์์ ๊ด๋ฆฌ๋ฉ๋๋ค.
React ์ฝ์ด
React์ โ์ฝ์ดโ๋ ๋ชจ๋ ์ต์์ React
API๋ฅผ ํฌํจํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
React.createElement()
React.Component
React.Children
React ์ฝ์ด๋ ์ปดํฌ๋ํธ๋ฅผ ์ ์ํ๋ ๋ฐ์ ํ์ํ API๋ง ํฌํจํ๊ณ ์์ต๋๋ค. React ์ฝ์ด๋ ์ฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ํ๋ซํผ ์ ์ฉ ์ฝ๋๋ฅผ ํฌํจํ๊ณ ์์ง ์์ต๋๋ค. ํด๋น ์ฝ์ด๋ React DOM๊ณผ React ๋ค์ดํฐ๋ธ์ ์ปดํฌ๋ํธ์์ ๋์์ ์ฌ์ฉ๋ฉ๋๋ค.
React ์ฝ์ด์ ์์ค ์ฝ๋๋ packages/react
์ ์์นํ๊ณ ์์ต๋๋ค. ํด๋น ์ฝ๋๋ npm์์ react
ํจํค์ง๋ก ๋ฐ์ ์ ์์ต๋๋ค. ๊ด๋ จ๋ ์คํ ๋์ผ๋ก ๋ธ๋ผ์ฐ์ ๋น๋๋ react.js
์ด๋ฉฐ, ์ ์ญ์์ React
ํค์๋๋ฅผ ํตํด ์ ๊ทผํ ์ ์์ต๋๋ค.
๋ ๋๋ฌ
React๋ ์๋ DOM์ ๋์์ผ๋ก ํ์ฌ ๊ฐ๋ฐ๋์ง๋ง, ์ดํ React ๋ค์ดํฐ๋ธ๋ฅผ ํตํด ๋ค์ดํฐ๋ธ ํ๋ซํผ ๋ํ ์ง์ํ๊ฒ ๋์์ต๋๋ค. ๋ณธ ๋ฌธ๋จ์ React ๋ด๋ถ์ โ๋ ๋๋ฌโ์ ๋ํด ๊ฐ๋ตํ ์๊ฐํฉ๋๋ค.
๋ ๋๋ฌ๋ React ํธ๋ฆฌ์ ํ๋ซํผ ์ข ์์ ์ธ ๋ณํ ๋ฐฉ๋ฒ์ ๊ด๋ฆฌํฉ๋๋ค.
๋ ๋๋ฌ๋ packages/
ํด๋ ์์ ๋ค์๊ณผ ๊ฐ์ด ์กด์ฌํฉ๋๋ค.
- React DOM Renderer๋ React ์ปดํฌ๋ํธ๋ฅผ DOM์ผ๋ก ๋ ๋๋งํฉ๋๋ค. ํด๋น ๋ ๋๋ฌ๋ ์ต์์ ๋ ๋ฒจ
ReactDOM
API์ ๊ตฌํ๋์ด ์์ผ๋ฉฐ npm์์react-dom
ํจํค์ง๋ก ๋ฐ์ ์ ์์ต๋๋ค. ๋ํ ์คํ ๋์ผ๋ก ๋ธ๋ผ์ฐ์ ์์react-dom.js
๋ฅผ ํตํด ์ ์ญReactDOM
ํค์๋๋ก ์ ๊ทผํ ์ ์์ต๋๋ค. - React Native Renderer๋ React ์ปดํฌ๋ํธ๋ฅผ ๋ค์ดํฐ๋ธ ๋ทฐ๋ก ๋ ๋๋งํฉ๋๋ค. ํด๋น ๋ ๋๋ฌ๋ React ๋ค์ดํฐ๋ธ ๋ด๋ถ์์ ์ฌ์ฉ๋ฉ๋๋ค.
- React Test Renderer๋ React ์ปดํฌ๋ํธ๋ฅผ JSON ํ์์ผ๋ก ๋ ๋๋งํฉ๋๋ค. ํด๋น ๋ ๋๋ฌ๋ Jest์ Snapshot ํ ์คํธ์ ์ฌ์ฉ๋๋ฉฐ, npm์์ react-test-renderer ํจํค์ง๋ก ๋ฐ์ ์ ์์ต๋๋ค.
์ธ๊ธํ ๊ฒ ์ธ์ ๊ณต์์ ์ผ๋ก ์ง์ํ๋ ๋ ๋๋ฌ๋ react-art
๋ก ์ ์ผํฉ๋๋ค. GitHub ์ ์ฅ์์์ ๋ถ๋ฆฌ๋์ด ์์์ง๋ง, ํ์ฌ๋ ๋ฉ์ธ ์์ค ํธ๋ฆฌ๋ก ์ฎ๊ฒจ์ก์ต๋๋ค.
์ฃผ์
react-native-renderer
๋ React ๋ค์ดํฐ๋ธ ๊ตฌํ์ฒด์ ์ํธ์์ฉํ๋ ๋งค์ฐ ์์ ๋ ์ด์ด์ ๋๋ค. ๋ค์ดํฐ๋ธ ๋ทฐ๋ฅผ ๊ด๋ฆฌํ๋ ์ค์ ํ๋ซํผ ๊ด๋ จ ์ฝ๋๋ React ๋ค์ดํฐ๋ธ ์ ์ฅ์์ ์กด์ฌํฉ๋๋ค.
์ฌ์กฐ์ ์
React DOM๊ณผ React ๋ค์ดํฐ๋ธ ๊ฐ์ ๋งค์ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ๋ฅผ ํฌํจํ์ฌ, ๋ ๋๋ฌ๋ค์ ์๋น ๋ถ๋ถ ๋์ ๋ฐฉ์์ ์๋ก ๊ณต์ ํด์ผ ํฉ๋๋ค. ํนํ ์ฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ฒฝ์ฐ๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ ๋๋ง, ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ, ์ํ, ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋, ๋ ํผ๋ฐ์ค๊ฐ ํ๋ซํผ์ ์๊ด์์ด ์ผ๊ด์ ์ผ๋ก ์๋ํด์ผ ํฉ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ก ๋ค๋ฅธ ๋ ๋๋ฌ๋ค์ ๋ช ๊ฐ์ง์ ์ฝ๋๋ฅผ ๊ณต์ ํ๋ฉฐ, ํด๋น ๋ถ๋ถ์ โ์ฌ์กฐ์ ์โ๋ผ๊ณ ๋ถ๋ฆ
๋๋ค. setState()
์ ๊ฐ์ ํจ์๊ฐ ์์ ๋์ด์ผ ํ ๋, ์ฌ์กฐ์ ์๋ ํธ๋ฆฌ์ ์๋ ์ปดํฌ๋ํธ์ render()
ํจ์๋ฅผ ํธ์ถํ ํ ๋ง์ดํธ๋ ์
๋ฐ์ดํธ, ํน์ ๋ง์ดํธํด์ ๋ฅผ ์ค์ํฉ๋๋ค.
์ฌ์กฐ์ ์๋ ํ์ฌ๋ก์๋ ์ด๋ ํ public API๋ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ณ์ ์ธ ํจํค์ง๋ก์ ์กด์ฌํ์ง ์์ต๋๋ค. ๋์ React DOM๊ณผ React ๋ค์ดํฐ๋ธ ๊ฐ์ ๋ ๋๋ฌ์ ๊ฐ๋ณ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
์คํ ์ฌ์กฐ์ ์
โ์คํโ ์ฌ์กฐ์ ์๋ React 15 ์ดํ์์ ๊ตฌํ๋์์ต๋๋ค. ํ์ฌ๋ ๋ ์ด์ ์ง์ํ์ง ์์ง๋ง, ๋ค์ ์น์ ์์ ์์ธํ ์ฌํญ์ ์ดํด๋ณผ ์ ์์ต๋๋ค.
ํ์ด๋ฒ ์ฌ์กฐ์ ์
โํ์ด๋ฒโ ์ฌ์กฐ์ ์๋ ์คํ ์ฌ์กฐ์ ์์์ ๋ฐ์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๋ช ๊ฐ์ง ์ค๋๋ ์ค๋ฅ๋ฅผ ๊ณ ์น๋ ๋ฐ์ ์ค์ ์ ๋๊ธฐ ์ํด ๊ณ ์๋์์ต๋๋ค. ํด๋น ์ฌ์กฐ์ ์๋ React 16๋ถํฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
ํด๋น ์ฌ์กฐ์ ์์ ๋ชฉํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ค๋จ ๋ถ๊ฐ๋ฅํ ์์ ์ ์ฒญํฌ๋ก ๋ถํ ํ๋ ๊ธฐ๋ฅ
- ์งํ ์ค์ธ ์์ ์ ์ฐ์ ์์ ์ง์ , ์ฌ๋ฐฐ์น ๋ฐ ์ฌ์ฌ์ฉ์ ๊ดํ ๊ธฐ๋ฅ
- React์ ๋ ์ด์์์ ์ง์ํ๊ธฐ ์ํ ๊ณ์ธต๋ณ ๋ฐฐ์น ์์ ์ฒ๋ฆฌ ๊ธฐ๋ฅ
render()
ํจ์๋ก๋ถํฐ์ ๋ค์ค ์์ ๋ฐํ ๊ธฐ๋ฅ- ์๋ฌ ๊ฒฝ๊ณ์ ๋ํ ํฅ์๋ ์ง์
React ํ์ด๋ฒ ๊ตฌ์กฐ์ ๋ํด ์ฌ๊ธฐ์ ์ฌ๊ธฐ๋ฅผ ํตํด ๋ ์์ธํ ํ์ธํ ์ ์์ต๋๋ค. ํ์ด๋ฒ ์ฌ์กฐ์ ์๋ React 16๊ณผ ํจ๊ป ์ ๊ณต๋์ง๋ง, ๋น๋๊ธฐ ๊ธฐ๋ฅ์ ์์ง ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ง ์์ต๋๋ค.
ํด๋น ์์ค ์ฝ๋๋ packages/react-reconciler
์์ ํ์ธํ ์ ์์ต๋๋ค.
์ด๋ฒคํธ ์์คํ
React๋ ๋ค์ดํฐ๋ธ ์ด๋ฒคํธ ์์ ๋ ์ด์ด๋ฅผ ๊ตฌํํ์ฌ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ์ฐจ์ด๋ฅผ ์ ๊ฑฐํ์ต๋๋ค. ํด๋น ์ฝ๋๋ packages/react-dom/src/events
์์ ํ์ธํ ์ ์์ต๋๋ค.
ํด๋น ์ฝ๋์ ๋ํ ์์ธํ ์ค๋ช ์ ๋ค์์ ์์ (66๋ถ)์ ์ฐธ๊ณ ํ์ธ์.
๋ค์ ๋ด์ฉ์?
๋ค์ ์น์ ์ ์ฝ๊ณ ์ฌ์กฐ์ ์์ ๋ํ pre-React 16 ๊ตฌํ์ ๋ํด ๋ ์์ธํ๊ฒ ๋ฐฐ์๋ณด์ธ์. ์๋ก์ด ์ฌ์กฐ์ ์์ ๋ํ ์ค๋ช ์ ์์ง ์์ฑ๋์ง ์์์ต๋๋ค.