โ ๏ธ ์ ๋ฆฌํ ๋ด์ฉ์ ์คํ๋ ์๋ชป๋ ์ ๋ณด๊ฐ ์์ ์ ์์ต๋๋ค. ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก React์๋ ์ ์ฉํ ๊ฒฝ๊ณ ๊ฐ ๋ง์ด ํฌํจ๋์ด ์๋ค. ๊ฒฝ๊ณ ๋ React๋ฅผ ๋ ํฌ๊ณ ๋๋ฆฌ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์ฑ์ ๋ฐฐํฌํ ๋ ํ๋ฌ๋์ ๋ฒ์ ์ ์ฌ์ฉํด์ผ ํ๋ค.
์ฑ์ ๊ฐ๋ฐํ ๋๋ ๊ฐ๋ฐ ๋ชจ๋, ์ฌ์ฉ์์๊ฒ ๋ฐฐํฌํ ๋๋ ํ๋ก๋์ ๋ชจ๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
npm run build
๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด ํ๋ก์ ํธ์ build/
ํด๋์ ์ ํ๋ฆฌ์ผ์ด์
์ ํ๋ก๋์
๋น๋ ํ์ผ์ด ๋ง๋ค์ด์ง๋ค.
React ๋ฐ React DOM์ ํ๋ก๋์ ์ค๋น ๋ฒ์ ์ ๋จ์ผ ํ์ผ๋ก ์ ๊ณตํ๋ค.
<script src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
๊ฐ์ฅ ํจ์จ์ ์ธ Brunch ํ๋ก๋์
๋น๋๋ฅผ ์ํด tenser-brunch
๋ฅผ ์ค์นํด์ ๋น๋ ๊ฐ๋ฅ
# npm์ ์ฌ์ฉํ๋ค๋ฉด
npm install --save-dev terser-brunch
# Yarn์ ์ฌ์ฉํ๋ค๋ฉด
yarn add --dev terser-brunch
๊ทธ ์ธ๋ก Browserify, Rollup, , webpack ๋ฑ์ด ์๋ค.
์ ํ๋ฆฌ์ผ์ด์
์์ ๊ธด ๋ชฉ๋ก์ ๋ ๋๋งํ๋ ๊ฒจ์ฐ windowing
์ด๋ผ๋ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒํ๋ค.
์ด ๊ธฐ๋ฒ์ ์ฃผ์ด์ง ์๊ฐ์ ๋ชฉ๋ก์ ๋ถ๋ถ ๋ชฉ๋ก๋ง๋ ๋๋งํ๋ฉฐ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋งํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ๊ณผ ์์ฑ๋ DOM ๋ ธ๋์ ์๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์๋ค.
react-window์ react-virtualized๋ ๋๋ฆฌ ์๋ ค์ง windowing ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ป. ๋ชฉ๋ก, ๊ทธ๋ฆฌ๋ ๋ฐ ํ ํ์ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํ๋ค.
์ปดํฌ๋ํธ์ prop์ด๋ state๊ฐ ๋ณ๊ฒฝ๋๋ฉด React๋ ์๋ก ๋ฐํ๋ ์๋ฆฌ๋จผํธ๋ฅผ ์ด์ ์ ๋ ๋๋ง๋ ์๋ฆฌ๋จผํธ์ ๋น๊ตํด์ ์ค์ DOM ์ ๋ฐ์ดํฐ๊ฐ ํ์ํ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค. ๊ฐ์ง ์์ ๊ฒฝ์ฐ React๋ DOM์ ์ ๋ฐ์ดํธ ํ๋ค.
React๊ฐ ๋ณ๊ฒฝ๋ DOM ๋
ธ๋๋ง ์
๋ฐ์ดํธํ๋๋ผ๋ ๋ฆฌ๋ ๋๋ง์๋ ์ฌ์ ํ ๋ค์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ๋ฌธ์ ๊ฐ ๋์ง ์์ง๋ง ์๋ ์ ํ๊ฐ ๋์ ๋๋ ๊ฒฝ์ฐ shouldComponentUpdate
๋ก ์ด ๊ธฐ๋ฅ์ ๋ฌด์ํจ์ผ๋ก์จ ์๋๋ฅผ ๋์ผ ์ ์๋ค.
SCU
๋ย shouldComponentUpdate
๊ฐ ๋ฐํํ ๊ฒ์ ๋ํ๋ด๋ฉฐ,ย vDOMEq
๋ React ์๋ฆฌ๋จผํธ๊ฐ ๋์ผํ์ง ์ฌ๋ถ๋ฅผ ํ์ํ๋ค. ๋ง์ง๋ง์ผ๋ก ์์ ์์ ์ปดํฌ๋ํธ๋ฅผ ์กฐ์ ํด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ธ๋ค.
shouldComponentUpdate
๋ C2์ ๋ฟ๋ฆฌ๋ฅผ ๋ ํ์ํธ๋ฆฌ์์ย false
๋ฅผ ๋ฐํ โ C4 ๋ฐ C5์์ย shouldComponentUpdate
๋ฅผ ํธ์ถํ ํ์๊ฐ ์๋ค.
C1๊ณผ C3์ ๊ฒฝ์ฐย shouldComponentUpdate
๊ฐย true
๋ฅผ ๋ฐํ โ React๊ฐ ํธ๋ฆฌ์ ๊ฐ์ฅ ํ์์ ๊ฐ์ ํ์ธ โ C6์ ๊ฒฝ์ฐย shouldComponentUpdate
๋ย true
๋ฅผ ๋ฐํํ๊ณ ๋ ๋๋ง ๋ ์๋ฆฌ๋จผํธ๋ ๋์ผํ์ง ์๊ธฐ ๋๋ฌธ์ React๋ DOM์ ์
๋ฐ์ดํธ, C8์ ๊ฒฝ์ฐ ์ด์ ์ ๋ ๋๋ง ๋ React ์๋ฆฌ๋จผํธ์ ๋์ผํ๊ธฐ ๋๋ฌธ์ DOM์ ์
๋ฐ์ดํธํ ํ์๊ฐ ์์
์ด ๋ฌธ์ ๋ฅผ ํผํ๋ ๋ฐฉ๋ฒ์ props์ state๋ก ์ฌ์ฉ์ค์ธ ๊ฐ์ ๋ณ๊ฒฝ์ ํผํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
class ListOfWords extends React.PureComponent {
render() {
return <div>{this.props.words.join(',')}</div>;
}
}
class WordAdder extends React.Component {
constructor(props) {
super(props);
this.state = {
words: ['marklar']
};
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
// This section is bad style and causes a bug
const words = this.state.words;
words.push('marklar');
this.setState({words: words});
}
render() {
return (
<div>
<button onClick={this.handleClick} />
<ListOfWords words={this.state.words} />
</div>
);
}
}
์์ ๊ฐ์ ๊ฒฝ์ฐ๋ PureComponent
๊ฐย this.props.words
์ ์ด์ ๊ฐ๊ณผ ์๋ก์ด ๊ฐ์ ๊ฐ๋จํ๊ฒ ๋น๊ตํ์ฌ ๋ฐฐ์ด์ ์ค์ ๋จ์ด๊ฐ ๋ณ๊ฒฝ๋์๋ค ํ๋๋ผ๋ ๋ ๋๋ง์ด ์
๋ฐ์ดํธ ๋์ง ์๋๋ค.
์ด ๋ฌธ์ ๋ ์๋์ ๊ฐ์ด ์์ฑํด์ ํผํ ์ ์๋ค.
handleClick() {
this.setState(state => ({
words: state.words.concat(['marklar'])
}));
}
handleClick() {
this.setState(state => ({
words: [...state.words, 'marklar'],
}));
};
ํ๋ก๋์ ๋น๋๋ฅผ ํ์ฉํด์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๊ณ ์๋ ๊ฒ๋ณด๋ค ๋ง์ด ์๋ค๋ ๊ฒ์ ์์๋ค. ๋ํ sholudComponentUpdate๋ฅผ ํ์ฉํด์ ์๋๋ฅผ ๋์ผ ์ ์๋ค๋ ๊ฒ๋ ์๊ฒ ๋์๋ค.