๋จผ์ , ์ด ๋ฉ์ง ๊ตฌ์ฑ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ๋๋จํ ๊ฐ์ฌํฉ๋๋ค! ๋๋จํด!
๋ด ์ ์ฑ์ ์๋์ ์ถ๊ฐํ์ต๋๋ค. ์ฃผ๋ก ์๋ ์์ ๋ฅผ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์์ต๋๋ค. PoC๋ฅผ ์ํด ๊ณฑํ์ต๋๋ค.
<Divider />
<List>{mailFolderListItems}</List>
๋ถ๋ถ.
๊ทธ ํ์๋ ํนํ ๋ชจ๋ฐ์ผ ์ฅ์น(nexus 4, ํก๋จ ๋ณด๋๊ฐ ์๋ ์ฝ๋ฅด๋๋ฐ 20)์์ ๋งค์ฐ ๋๋ฆฌ๊ฒ ๋๊ปด์ง๋๋ค. ๊ฐ๋ฐ์ ๋ชจ๋๋ฅผ ์ฌ์ฉํ์ง๋ง prod ๋ชจ๋๋ ์๋๊ฐ ๋ง์ด ํฅ์๋์ง ์์ต๋๋ค.
๋ฐ์ ๊ฐ๋ฐ ๋๊ตฌ๋ฅผ ํตํด ๋๋ mailFolderListItems์ ๊ตฌ์ฑ ์์๊ฐ react-router์ ๋ชจ๋ ๋งํฌ ํด๋ฆญ ๋๋ ๋ฉ๋ด ์ด๊ธฐ์์ ๋ ๋๋ง๋๋ ๊ฒ์ ํ์ธํ์ต๋๋ค. {mailFolderListItems}
๋ฅผ ๋ค์ ๋ ๋๋งํ๋ ๋ฐ ์ต๋ 50-60ms๊ฐ ์์๋ฉ๋๋ค. ๋๋ ์ฌ์ฉํ๋ค
const modalProps = {
keepMounted: true, // Better open performance on mobile.
};
๋ค๋ฅธ ์ฑ ๊ตฌ์ฑ ์์์ ๋ถํ์ค์ฑ์ ์์ ๊ธฐ ์ํด mailFolderListItems
๋ฅผ Component๋ก ๋ณํํ๊ณ ๋ค์ ๋ ๋๋ง์ ๋นํ์ฑํํ์ต๋๋ค.
class MailFolderListItems extends React.Component<{}, {}> {
shouldComponentUpdate() {
return false;
}
render() {
return (
<List>
<Link to={Routes.Startpage.path}>
<ListItem>
<ListItemIcon>
<InboxIcon />
</ListItemIcon>
[...]
<Divider />
<MailFolderListItems />
๊ทธ ํ ์ด ๋ถ๋ถ์ ๊ด์ฐฎ๊ฒ ๋๊ปด์ง๋๋ค.
https://github.com/mui-org/material-ui/issues/5628 ์ ์ฐพ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋ค์ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ด ์ข์ต๋๋ค . shouldComponentUpdate
์ต์ ํ๋ ์ฑ๋ฅ์ ์ป๊ธฐ ์ํ ๊ธฐ๋ณธ์ ์ด๊ณ ๊ฐ์ฅ ์ค์ํ ๋จ๊ณ์
๋๋ค. PureComponent
๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐ๋ก ๊ฐ๊ธฐ์
๋๋ค.
๊ฒ๋ค๊ฐ WithStyles
์์ฃผ ๋ง์ ์๊ฐ(๋ชจ๋ material-ui ๊ตฌ์ฑ ์์์ ๋ํด 1-2ms ์ด์)์ด ์๋น๋๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
๋๋ ์ด ํ๋ฅญํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ๊ฐ๋ฅํ ๋ฐ์ ์ฑ๋ฅ์ ์ต๋ํ ์ป์ ๊ฒ์ผ๋ก ๊ธฐ๋ํ๊ณ ์์ต๋๋ค.
์ฑ์ ๋ชจ๋ material-ui ๊ตฌ์ฑ์์์ ํจ๊ป ๋๋ ค์ง๋๋ค.
์ปดํฌ๋ํธ ๋ฐ๋ชจ ํ์ด์ง์์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์๊ธฐ ๋๋ฌธ์ ์์ง ์ฌํ ์์ ๋ฅผ ์ ๊ณตํ์ง ์์ง๋ง ํ์ํ ๊ฒฝ์ฐ ์ฝ๋ ๋ฐ ์์ ๋ฐ๋ชจ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์ ๊ฒฝ์ฐ ์ฑ๋ฅ ์ค์ ์์ 5๋ฐฐ ์ด์์ผ๋ก ๋๋ ค์ง๋ ๊ฒฝ์ฐ ๋์ ๋๋๋ค.
| ๊ธฐ์ | ๋ฒ์ |
|----------------|---------|
| ๋จธํฐ๋ฆฌ์ผ UI | 1.0.0-๋ฒ ํ.38 |
| Material-UI ์์ด์ฝ | 1.0.0-๋ฒ ํ.36 |
| ๋ฐ์ | 16.2.0 |
| ๋ธ๋ผ์ฐ์ | ์ฝ๋ฅด๋๋ฐ ํก๋จ ๋ณด๋ 20(์๋๋ก์ด๋ ํฌ๋กฌ 50๊ณผ ๋์ผ) |
๋๋ ์ด ํ๋ฅญํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ๊ฐ๋ฅํ ๋ฐ์ ์ฑ๋ฅ์ ์ต๋ํ ์ป์ ๊ฒ์ผ๋ก ๊ธฐ๋ํ๊ณ ์์ต๋๋ค.
@Bessonov Performance๋ v1 ๋ฆด๋ฆฌ์ค ์ดํ์ ์ด์ ์ด ๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํต์ฌ์ ์ ์งํ๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค. +90%์ ๊ฒฝ์ฐ์ ์ถฉ๋ถํด์ผ ํฉ๋๋ค. ์ ์ด๋ ์ง๊ธ๊น์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๊ฒฝํ์ ๋๋ค. ์ฑ๋ฅ์ด ์ค์ํ๋ค๋ ์ฌ์ค์ ๋ํด ์ฃผ์๋ฅผ ํ๊ธฐ์ํค๋ ๊ฒ ์ธ์๋ ์ธ๋ถ ์ฐธ์กฐ๋ฅผ ์ ๊ณตํ์ง ์์์ง๋ง ์ด ๋ฌธ์ ๋ฅผ ์คํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ์๋ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์กฐ์ฌํ ์ ์๋ Material-UI์ ์ฑ๋ฅ ๋ฃจํธ ์ ํ์ ์๋ณํ ์ ์๋ ๊ฒฝ์ฐ(์ฌ์ ์ฝ๋ ๋ฐ ์์ ๋๋ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ) ์ด๋ฅผ ๋์ด์ญ์์ค. ๊ทธ ์ ๊น์ง๋ ์ด์๋ฅผ ์ข ๋ฃํ๊ฒ ์ต๋๋ค.
@oliviertassinari ๋น ๋ฅธ ์๋ต์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ๋ฐ๋งค ํ์ ๊ทธ ํผํฌ๋จผ์ค๊ฐ ์ง์ค๋ ๊ฒ์ด๋ผ๋ ์์์ ๋ค์ผ๋ ๋งค์ฐ ๊ธฐ์ฉ๋๋ค.
+90%์ ๊ฒฝ์ฐ์ ์ถฉ๋ถํด์ผ ํฉ๋๋ค. ์ ์ด๋ ์ง๊ธ๊น์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๊ฒฝํ์ ๋๋ค.
๋ฐ์คํฌํ์์ - ๊ทธ๋ ์ต๋๋ค. ํ์ง๋ง ๋ชจ๋ฐ์ผ์์๋ ์ ๋ง ๋๋ฆฝ๋๋ค. ์๋๊ณผ ์ผ๋ถ ๋ฒํผ๋ง ์์ผ๋ฉด ์ฑ์ด ๋๋ ค์ง๋๋ค. ์๋ตํ์ง ์์ผ๋ฉฐ ํ์์ ๋ฐ๋ผ ๋ ๋ง์ ์ ๋ ฅ์ ์๋นํฉ๋๋ค.
์ฑ๋ฅ์ด ์ค์ํ๋ค๋ ์ฌ์ค์ ๋ํด ์ฃผ์๋ฅผ ํ๊ธฐ์ํค๋ ๊ฒ ์ธ์๋ ์ธ๋ถ ์ฐธ์กฐ๋ฅผ ์ ๊ณตํ์ง ์์์ง๋ง ์ด ๋ฌธ์ ๋ฅผ ์คํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ์๋ ์์ต๋๋ค.
์ด๋ฏธ ์ ๊ธฐ๋ ๋ฌธ์ ์ ๋ํ ์ฐธ์กฐ์ ๋ฐ์ ๋ฌธ์์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ๊ณตํ์ต๋๋ค.
๋น์ฌ๊ฐ ์กฐ์ฌํ ์ ์๋ Material-UI์ ์ฑ๋ฅ ๋ฃจํธ ์ ํ์ ์๋ณํ ์ ์๋ ๊ฒฝ์ฐ(๋ณต์ ์ฝ๋ ๋ฐ ์์ ๋๋ ์ ์ฅ์ ์ฌ์ฉ)
๋ด๊ฐ ๋งํ๋ฏ์ด, ๋๋ ํ ์ ์์ต๋๋ค. ๋ค์์ ์์ ์ฑ๋ถ๊ณผ ๋น์์ ์ฑ๋ถ์ ๋น๊ตํ ๊ฒ์ ๋๋ค. ์ฌํ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ง๊ธ:
index.js
pure
์ true
์ด ์์ ๋ ๋๋ฌด ๋ง์ List ์์๋ฅผ ์ฝ์ ํ๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ ๋นํ์ค์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ๋งํ๋ฏ์ด ๋ชจ๋ฐ์ผ์์๋ ๋ชจ๋ ํ๋์ "๋๋ผ๋" ์ง์ ์ ๋งค์ฐ ๋น ๋ฅด๊ฒ ๊ฐ๋ฆฌํต๋๋ค.
๋ค์์ WithStyles
๋ด ๋ฌธ์ ์
๋๋ค. CPU ์กฐ์ ๊ธฐ๋ฅ์ด ์๋ ๋ฐ์คํฌํ์ ์์ต๋๋ค. ์์์ผ์ ์ค์ ์ฅ์น์ ์คํฌ๋ฆฐ์ท์ ๊ฒ์ํ๊ณ ์ถ์ต๋๋ค.
WithStyles(ListItem)
:
ListItem
:
์ฐจ์ด๋ ListItem
๊ตฌ์ฑ ์์์ ๊ฒฝ์ฐ์๋ง 1.26ms์
๋๋ค. ์ด์ ๊ฐ์ ๊ตฌ์ฑ ์์๊ฐ 13๊ฐ ์์ผ๋ฉด ๋ ์ด์ 60fps๋ก ๋ ๋๋งํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ๊ธฐ๊ฐ์ด ํญ์ ์ฌ๊ธฐ์ ์๋ ๊ฒ์ ์๋์ Desktop์์ ํ์ธํ์ต๋๋ค.
์์ ์ฑ๋ถ๊ณผ ๋น์์ ์ฑ๋ถ์ ๋น๊ต๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Btw PureComponent๊ฐ ๋ชจ๋ ์ฑ๋ฅ ๋ฌธ์ ์ ๋ํ ์๋ฃจ์ ์ด๋ผ๊ณ ๋งํ์ง๋ ์์ต๋๋ค. ๋ชจ๋ฐ์ผ์์ material-ui๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ์ญํ ์ค ํ๋๊ฐ ๋ ์ ์๋ค๊ณ ๋ง์๋๋ฆฌ๊ณ ์ถ์ต๋๋ค.
์ฐจ์ด์ ์ ListItem ๊ตฌ์ฑ ์์์ ๊ฒฝ์ฐ์๋ง 1.26ms์ ๋๋ค.
@Bessonov WithStyles ๊ตฌ์ฑ ์์๋ ๋์ผํ ๊ตฌ์ฑ ์์์ ๋ฐ๋ณต์ ์ธ ์ธ์คํด์ค์ ๋ํด ๋งค์ฐ ์ ๋ ดํด์ผ ํฉ๋๋ค. CSS๋ฅผ ํ ๋ฒ๋ง ์ฃผ์
ํฉ๋๋ค.
React ํ๊ณ์ ๊ณ ์ฐจ ๊ตฌ์ฑ ์์์ ๋น์ฉ์ ๋๋ฌํ์ ์ ์์ต๋๋ค.
React์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ํํ๊ธฐ ์ํ ๋ค์ํ ์๋ฃจ์
์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์์ ๋ฉ๋ชจ์ด์ ์ด์
๋ฐ ๊ฐ์ํ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํฅํ ์ฑ๋ฅ ์กฐ์ฌ๋ฅผ ์ํ ์์์ ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ์ด์ด๋๊ณ ์์ต๋๋ค.
์ง๊ธ ๋น์ฅ ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ์ผ์ ๋ง์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฐ๋ ค๋ฅผ ์ ๊ธฐํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
์ข์, ๊ทธ๊ฒ์ ๋จ์ง ํ ๋ถ๋ถ์
๋๋ค. ๋ ์ค์ํ ๋ถ๋ถ์ธ shouldComponentUpdate
์ต์ ํ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น?
ํธ์ง: ์ด ๋ฌธ์ ๋ฅผ ๋ ๋ถ๋ถ์ผ๋ก ๋๋๊ณ ์ถ์ต๋๋ค. ์ด ๋ถ๋ถ์ shouldComponentUpdate
์ ๋ํ ๊ฒ์ด๊ณ ๋ค๋ฅธ ๋ถ๋ถ์ WithStyles
์ ๋ํ ๊ฒ์
๋๋ค. ๋ ๋ง์ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค ์ ์๋ค๋ฉด ๋ง์ด์ฃ . ๊ด์ฐฎ์ต๋๊น?
shouldComponentUpdate ์ต์ ํ
@Bessonov ์ฐ๋ฆฌ๋ ๋ ๊ฐ์ง ์ด์ ๋ก Material-UI ์ธก์์ ์ด๋ฌํ ๋ก์ง ์ ์๋์ ์ผ๋ก ๊ตฌํํ์ง ์์ต๋๋ค.
shouldComponentUpdate
๋ก์ง์ด React ํธ๋ฆฌ์ ๋ฃจํธ์์ ๊ฐ๊น์ธ์๋ก ๋ ํจ์จ์ ์
๋๋ค. ๋ด ๋ง์, ๋๋ฌด์์ ๊ฐ์ง์น๊ธฐ๋ฅผ ๋ง์ด ํ ์๋ก ๋ ์ข์ต๋๋ค. Material-UI ๊ตฌ์ฑ ์์๋ ๋ฎ์ ์์ค์
๋๋ค. ๋ฎ์ ๋ ๋ฒ๋ฆฌ์ง ๊ธฐํ๊ฐ ์์ต๋๋ค.์ฐ๋ฆฌ๊ฐ ์ฐพ์ ์ ์ผํ ๊ธฐํ๋ ์์ด์ฝ์ ๋๋ค. ์๋ก์ด ๊ฒ์ ์๋ณํ ์ ์๋์ง ์๋ ค์ฃผ์ญ์์ค.
WithStyles์ ๋ค๋ฅธ ๋ถ๋ถ
WithStyles์์ ๋ณด๋ธ ์๊ฐ์ +90%๋ ์ค์ ๋ก JSS ์์ ์๋น๋๋ฉฐ Material-UI ์ธก์์ ์ด์ ๋ํด ํ ์ ์๋ ์ผ์ ๊ฑฐ์ ์์ต๋๋ค.
์ ์ด๋ ์ต๊ทผ์๋ ๋ฐ๋ณต์ ์ธ ๋ ๋๋ง์์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํค๊ธฐ ์ํด ์๋ฒ ์ธก ๋ ๋๋ง์ ์ํ ์บ์ฑ ๊ธฐํ๋ฅผ ํ์ธํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์๋ฒ ์ธก์์๋ง ๊ฐ๋ฅํฉ๋๋ค.
๋๋ถ๋ถ์ ๊ตฌ์ฑ ์์๋ ๊ฐ ๋ ๋์์ ๋ฐ์ ์์ ์ฐธ์กฐ ๋ณ๊ฒฝ์ธ ๋ฐ์ ์์๋ฅผ ํ์ฉํ๋ฏ๋ก ๋ ผ๋ฆฌ๊ฐ CPU ์ฃผ๊ธฐ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๋ญ๋นํ๊ฒ ๋ง๋ญ๋๋ค.
์ฉ๋์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ ๊ฐ์ ํ ์ ์์ต๋๋ค. ๋๋ ๋ ์์ ์ ๋ฒค์น๋งํนํ์ง ์์ง๋ง, ํนํ ๋ถ๋ณ ๊ตฌ์กฐ์ ๊ฒฝ์ฐ ์ฌ๋ฐ๋ฅธ ๊ตฌ์ฑ ์์ ์ฌ์ฉ๊ณผ ์ต์ ํ๋ shouldComponentUpdate
(์์ ๋น๊ต ํฌํจ)์ด ์ต์ ํ๋์ง ์์ ๊ตฌ์ฑ ์์๋ณด๋ค ๋น์ฉ์ด ๋ ๋ ๋ค๊ณ ํ์ ํฉ๋๋ค. ใ
). ๊ด๋ จ ํฐ์ผ: https://github.com/mui-org/material-ui/issues/4305
์๋ฅผ ๋ค์ด https://github.com/mui-org/material-ui/blob/v1-beta/docs/src/pages/demos/drawers/PermanentDrawer.js#L68์์ ์ด๊ฒ์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ PureComponent
๋ง๋ญ๋๋ค.
classes={{
paper: classes.drawerPaper,
}}
๋งค๋ฒ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ์ง๋ง:
const drawerClasses = {
paper: classes.drawerPaper,
};
[...]
classes={drawerClasses}
๊ตฌ์ฑ ์์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
shouldComponentUpdate ๋ก์ง์ด React ํธ๋ฆฌ์ ๋ฃจํธ์์ ๊ฐ๊น์ธ์๋ก ๋ ํจ์จ์ ์ ๋๋ค. ๋ด ๋ง์, ๋๋ฌด์์ ๊ฐ์ง์น๊ธฐ๋ฅผ ๋ง์ด ํ ์๋ก ๋ ์ข์ต๋๋ค.
๋ค, ๋ง์ต๋๋ค.
Material-UI ๊ตฌ์ฑ ์์๋ ๋ฎ์ ์์ค์ ๋๋ค. ๋ฎ์ ๋ ๋ฒ๋ฆฌ์ง ๊ธฐํ๊ฐ ์์ต๋๋ค.
๊ทธ๊ฒ์ ๋ถ๋ถ์ ์ผ๋ก ์ฌ์ค์
๋๋ค. https://codesandbox.io/s/r1ov818nwm ์์ ๋ณผ ์ ์๋ฏ์ด ์ ๋ List
๋ฅผ PureComponent
๊ฐ์๋๋ค. ๋ค๋ฅธ ๊ฒ์ ์์ผ๋ฉฐ ์ค์ํ ์์๋ก ์๋ ์๋๋ฅผ ๋์
๋๋ค. ๋๋ ์ด๊ฒ์ด ์ ์ด๋ {this.props.children}
๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ๊ตฌ์ฑ ์์์ ๋ํด ์ฌ์ค์ด๋ผ๊ณ ์ฃผ์ฅํฉ๋๋ค. ๋ค๋ฅธ ๋ฐ๋ชจ๋ฅผ ๋ง๋ค์์ต๋๋ค. https://codesandbox.io/s/my7rmo2m4y
101๊ฐ์ Button(pure = false)๊ณผ PureComponent๋ก ๋ํ๋ Button(pure = true, Button ๊ฐ์ ธ์ค๊ธฐ ์์น ์ฐธ์กฐ)์ด ์์ต๋๋ค. "ํด๋ฆญ" ๋ฒํผ์ ํด๋ฆญํด๋ ๋์ผํ ๊ฒ์ ๊ฒฐ๊ณผ:
์ผ๋ฐ ๋ฒํผ:
๋ํ๋ ๋ฒํผ(์ค๋ฒํค๋ ๋ฑ ํฌํจ):
๋ณด์๋ค์ํผ ์ผ๋ฐ ๋ฒํผ์๋ 637ms โโ๋ 47ms๊ฐ ์์ต๋๋ค! shouldComponentUpdate
(๋๋ PureComponent
)๋ฅผ ์ต์ ํํ๋ ๊ฒ์ด ์ฌ์ ํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ญ๋๊น? :)
ํธ์ง: ์ฒ์์ ๋ฌธ๊ตฌ ์์
@oliviertassinari @oreqizer ํฅ๋ฏธ๋ก์ด ์ ์ ๋ฐ๊ฒฌํ์ต๋๋ค. extends PureComponent
๋ Component
์ ๊ฐ์ด ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์
๋๋ค.
shouldComponentUpdate() {
return false;
}
ํธ์ง: ๋๋ ์ด๊ฒ์ด ๋ฐ์ ๋ด๋ถ ์ต์ ํ ์ค ํ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ณด์๋ค์ํผ ์ผ๋ฐ ๋ฒํผ์๋ 637ms โโ๋ 47ms๊ฐ ์์ต๋๋ค! ์์ง๋ shouldComponentUpdate(๋๋ PureComponent)๋ฅผ ์ต์ ํํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ญ๋๊น? :)
@Bessonov ์์ ๋ ผ๋ฆฌ์ ์ ์ฌ๋ ฅ์ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค. ์, ๋งค์ฐ ์ ์ฉํ ์ ์์ต๋๋ค! x13 ๊ฐ์ ์ฌํญ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ด ์ค์ ์กฐ๊ฑด์ ๊ฐ๊น๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
@oliviertassinari ํ๋ฅญํ ๊ฐ๋ฐ์๋ก์ ์ด๋ป๊ฒ ์ด๋ฐ ๊ฒ์ ์์ฑํ ์ ์์ต๋๊น? ์ฌ์ค์ด ์๋ ์ฃผ์ฅ์ผ๋ก _๊ฐ์ธ์ ์ธ ๊ฐ์ ์ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋๋ ์์์ ์ถฉ๋ถํ ์ฌ์ค์ ์ ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์ด ํ๋ก์ ํธ๋ฅผ ์ข์ํ๊ณ ๊ธฐ์ฌํ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๋ชจ๋ ๊ฒ์ ํ๋ค. ์ถฉ๋ถํ์ง ์๋ค? ์, ๊ทธ๋ผ ๋ ๋ง์ ์ฌ์ค ๊ณผ ๊ฐ์ ์ด _no_ ์์ต๋๋ค.
๋น์ ์ ์ํด 10๊ฐ์ ๋ฒํผ์ผ๋ก ์ค์ ๋๋ค. 10! ์ด๋ material-ui์ 10๊ฐ ๊ตฌ์ฑ์์(๋ ๋์ ๊ฒ์ ์ปจํ ์ด๋)๊ฐ ์ฑ์ ์ฌ์ฉํ ์ ์์ ๋๊น์ง ์ ์ฒด ์ฑ์ ์๋๋ฅผ ๋ฆ์ถ๋ ๊ฒ์ ์๋ฏธ ํฉ๋๋ค ! ์ค๋กํ ์์ด ํก๋จ๋ณด๋ 21/ํฌ๋กฌ 51์ ์ฌ์ฉํ์ฌ ์ค์ ์ฅ์น์์ ํ ์คํธ:
์ผ๋ฐ ๋ฒํผ:
ํจ์ด๋ฒํผ:
์ด๊ฒ์ ์ฌ์ ํ โโ8๋ฐฐ ๊ฐ์ ๋์์ต๋๋ค! ๊ทธ๊ฒ์ ๊ฑฐ๋ํ๋ค! ๋ชจ๋ฐ์ผ ์ฅ์น์์ ์ด๊ฒ์ด ์ผ๋ง๋ ์ค์ํ์ง ์์ํ ์ ์์ต๋๊น?
ํ ํ์ด์ง์ 100๊ฐ์ ๋ฒํผ ๋์ ์ต๋ 10๊ฐ์ ๋ฒํผ์ด ์์ต๋๋ค. ๊ทธ๋๋ 10๊ฐ์ ๊ทธ๋ฆฌ๋, 10๊ฐ์ X ๋ฑ์ ์ฐพ์ ์ ์์ต๋๋ค.
Button์ ๊ฐ์ฅ ๊ฐ๋จํ ์ปดํฌ๋ํธ ์ค ํ๋์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ต๋๋ค! ์ฑ๋ฅ ๊ด์ ์์ material-ui ๊ฐ ๊นจ์ ธ ์์์ ๋ณด์ฌ์ค๋๋ค. ์ด์ AppBar, Toolbar, List, Drawer์ ๊ฐ์ ์ปจํ ์ด๋ ๊ตฌ์ฑ ์์๋ฅผ ์์ํด๋ณด์ญ์์ค! ์ด๊ฒ์ ๋ ๋์๋ค! ๋ชจ๋ ํ์ด์ง์ 20๊ฐ์ ๊ตฌ์ฑ ์์/์ปจํ ์ด๋๋ฅผ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ป์ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ ฅํ ๋ฐ์คํฌํ/๋งฅ์์ ์ด๋ ํ ์๋ ์ ํ๋ ๋ง๋ฃ๋์ง ์๊ธฐ ๋๋ฌธ์ material-ui๊ฐ ๋ฏฟ์ ์ ์์ ์ ๋๋ก ๋๋ฆฌ์ง ์๋ค๋ ์๋ฏธ๋ ์๋๋๋ค.
react-intl์์ ์ด์ props์ ์ props ๊ฐ์ ๊ฒ์ฌ๋ ํญ์ false์ ๋๋ค. CPU ์ฃผ๊ธฐ๋ฅผ ๋ญ๋นํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋์ x13 -> x0.8
์ฝ๋์๋๋ฐ์ค์ ๋ํ ์๋ฅผ ๋ณด์ฌ์ฃผ์ธ์. ์ ์ด๋ฐ ์ผ์ด ์ผ์ด๋์ผ ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๊ฒ์ ๋ฐ์ ๊ตฌ์ฑ ์์๋ฅผ ์๋ชป ์ฌ์ฉํ ๋๋ง ๋ฐ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ณต์์ ์ธ ์ ๋ react-intl ์ด ์ ์ฉ๋์ง ์์ context subscribers ์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ์๋ชป๋ ์ฌ์ฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค . ๊ทธ๋ฌ๋ ์ฑ๋ฅ์ ์ ์งํ๊ธฐ ์ํ ๋ฐ์ ์ง์นจ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก์ ์ผ์นํ๋ ๋ค๋ฅธ ๊ตฌ์ฑ ์์๊ฐ ๋ง์ด ์์ต๋๋ค.
BTW: WithStyles๋ ๋ชจ๋ฐ์ผ ์ฅ์น์ ๋ฒํผ์ ๋ํด ์ต๋ 2,27ms๋ฅผ ์๋นํฉ๋๋ค. 8๊ฐ์ ๊ตฌ์ฑ ์์์ 60fps ๋ฏธ๋ง์ ๋๋ค.
์ฌ์ค์ด ์๋ ์ฃผ์ฅ์ผ๋ก ๊ฐ์ธ์ ์ธ ๊ฐ์ ์ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๊ฐ์ธ์ ์ธ ์ถ์ธก์ด๋ผ๊ณ ์๊ฐํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋นํ์ ์ฌ๊ณ ๋ฅผ ํ๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค. ๊ฐ๋ ์ ์ผ๋ก ๋งํ์๋ฉด, ์ถ๊ฐ prop ์ํ๋ ์์ ๋ฒ์ ์ด ์๋ ๋ฒ์ ์ ๋นํด ์๋๋ฅผ ๋ฆ์ถ๋ฉฐ ๊ฐ์น ์๋ ๊ฒ์ ๊ฐ์ง์น๊ธฐํด์ผ ํฉ๋๋ค. #5628 ๋๋ https://github.com/react-bootstrap/react-bootstrap/issues/633#issuecomment -234749417 ๋๋ https://github.com/reactstrap/reactstrap/pull/771#issuecomment -375765577๊ณผ ๊ฐ์ ์ถ๋ก
์์ํจ:
์์ํ ์์ด:
์ฌ์์ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@oliviertassinari codesandbox๊ฐ ๋ชจ๋ ๊ฒ์ ํ ์คํธ์ ์ ํฉํ๊ฒ ๋ง๋ ๋ค๊ณ ํ์ ํฉ๋๊น? ๋ด ๊ฒฐ๊ณผ๊ฐ ๋งค์ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์:
์์ํ์ง ์์ ๊ฒฝ์ฐ(์ค๋กํ์ด ์์ด๋ ๋๋ฆผ):
์์(true๋ก ๋ณ๊ฒฝํ๊ณ ์ ์ฅํ ํ ์ฝ๋์๋๋ฐ์ค์ ๋ํ ์ URL์ ์ป์):
์ปจํ ์คํธ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ธํ์ง ์๊ณ ์ฌ์ฉ์๊ฐ ๋ชจ๋ ํ์ ๊ตฌ์ฑ ์์๋ "์์"์ธ์ง ํ์ธํ๋๋ก ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ํฉํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ฐ๋ฅํ ํ ์ ์ฐํด์ผ ํ๋ฉฐ ์ด๊ฒ์ด ์ฌ์ฉ์ ๋ ์ด๋ ต๊ฒ ๋ง๋ค ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค.
๋๋ ์์ ์ ๋ณธ๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋งค์ฐ ํฅ๋ฏธ๋ก์ด ์ ์ถฉ์์ ๋๋ค. ํ ์ชฝ์์๋ material-ui์กฐ์ฐจ๋ "๊ฐ๋ฅํ ํ ์ ์ฐ ํด์ผ "ํ์ง๋ง ๋ค๋ฅธ ํํธ์ผ๋ก๋ ํ์ฌ ์ฑ๋ฅ์ผ๋ก ์ธํด ์ ํ _์ฌ์ฉํ ์ ์์ต๋๋ค_.
์์ ๋ฐ ๋น์์ ๋ฒ์ ์ ๊ตฌ์ฑ ์์๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋ํด ์๊ฐํด์ผ ํ ์๋ ์์ต๋๋ค. ๋ด ์ฑ์ด ๋ฐ์คํฌํฑ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ์ฑ๋ฅ์ ์ป๊ธฐ ์ํด ์ง๊ธ ์ํํฉ๋๋ค.
@Bessonov ์ฝ๋ ์๋ ๋ฐ์ค๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฅ๋์ง ์์์ต๋๋ค. ์ฃ์กํฉ๋๋ค. ๋ค์ diff๊ฐ ๋๋ฝ๋์์ต๋๋ค. ๋งํฌ๋ฅผ ์ ๋ฐ์ดํธํ์ต๋๋ค.
<Button>
+ <i>
Button
+ </i>
</Button>
์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ฐ์ถํด์ผ ํ๋์ง ์ดํด๊ฐ ๋์ง ์์ต๋๊น? ๋ ๋์ ์ฐจํธ๋ฅผ ์ป์์ง๋ง ์์ํ์ง ์์ ๋ฒ์ ์ ํจ์ฌ ๋๋ฆฝ๋๋ค.
ํธ์ง: ์๊ฒ ์ต๋๋ค. ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์์ ๋ด๋ ค๊ณ ๋ ธ๋ ฅํ์ญ์์ค ...
์์์ด ์ด์ ์ดํด ํ์ด. "๋ชจ๋ ๋ ๋์ ์ ๊ฐ์ฒด"์ ๋์ผํ ๊ฒ์ ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ ์ ๋์น์ฑ์ง ๋ชปํ๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ babel ํ๋ฌ๊ทธ์ธ์ ํตํด ์๋์ผ๋ก ์์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ํ ์ ์์ต๋๋ค.
๊ธ์, ๋น์ ์ ์ด๋ฏธ ๊ทธ๊ฒ์ ์๊ณ ์์ต๋๋ค! :D ์์ฒด์ ์ผ๋ก๋ ๋ง์ ์ด์ ์ด ์์ง๋ง(~7%๋ฅผ ํ์ํ์ต๋๋ค) ์์์ ์ธ๊ธํ ๋ช ๊ฐ์ง ๊ฒฐํจ์ ํผํ๊ธฐ ์ํด ์์ํ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒฐ๋ก ์ ์ผ๋ก ์ฌ์ ํ ์์ต์ฑ์ด ์์ต๋๋ค. ์ง๊ธ Pure Wrapper + babel ํ๋ฌ๊ทธ์ธ + ํ๋ก๋์ ๋น๋๋ก ํ ์คํธํ๋๋ฐ ๋์ผํ ๋ชจ๋ฐ์ผ ์ฅ์น์์ ๋น ๋ฅด๊ฒ ์ธ์์ ์ ๋๋ค!
๋ด๊ฐ ๋งํ๋ฏ์ด, ์ ์ฐ์ฑ์ ์ํ ์์ํ์ง ์์ ๊ตฌ์ฑ ์์์ ์ฑ๋ฅ์ ์ํ ์์ ๊ตฌ์ฑ ์์(๋ํผ๋ ๋จ์ํ๊ณ ์ ์ง ๋ณด์๊ฐ ์ฉ์ดํ๋๋ก ์ ์งํ๊ธฐ์ ์ถฉ๋ถํจ)๋ฅผ ๋ชจ๋ ์ ๊ณตํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์๊ฒ๋ ์ ์ฒด ์ฑ๋ฅ ํฅ์์ด ์ฑ๋ฅ ๋จ์ ๋ณด๋ค ํจ์ฌ ํฌ๊ธฐ ๋๋ฌธ์ ์์ํ ๊ตฌ์ฑ ์์๋ง์ผ๋ก ์ด ์ ์์ต๋๋ค. ๋๋ ๋ ๋์: ์์ ๊ตฌ์ฑ ์์ ์์ด material-ui๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ข์, ์ง๊ธ์ ์ด ์ฃผ์ ์ ๋ํ ์ถ๊ฐ ์ ๋ ฅ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ผ๋ฉฐ ๋ด ์ฑ์์ ์์ฒด ๋ํผ๋ฅผ ์์ฑํฉ๋๋ค.
ํต์ฐฐ๋ ฅ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
๋๋ transform-react-constant-elements๊ฐ ์ค์ ๋ก ์ฌ์ฉ๋๊ณ ์๊ณ ์ ๋ง๋ก ์ ์ฉํ๋ค๋ ๊ฒ์ ๋ค์ด๋ณธ ์ ์ด ์์ต๋๋ค. ๋ฌด์์ ๋ฏธ์ธ ์ต์ ํ๋งํผ์ ๊ด์ฐฎ์ง๋ง ์ค์ ๋ก๋ ๋ง์ ๊ฒ์ ์ป์ ์ ์์ ๋งํผ ๊ฐ๋จํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ๋ ๋๋ญ
๋๋ค. ๊ทธ๋ฌ๋ <Add />
์ ๊ฐ์ ๋ชจ๋ SVG ์คํ์ผ ์์ด์ฝ ๊ตฌ์ฑ ์์์ ๋ํ ์ต์ ํ๊ฐ ๋์์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด ์์ ๋ฅผ ์ดํด๋ณด๋ฉด(์ธก๋ฉด์์ ํ๋ฌ๊ทธ์ธ์ ํด๋ฆญํ๊ณ "react-constant"๋ฅผ ๊ฒ์ํ ๋ค์ "transform-react-constant-elements" ํ์ธ๋์ ํด๋ฆญ) ์ต์ ํ๋ ๊ฒ์ด ๊ฑฐ์ ์์์ ์ ์ ์์ต๋๋ค.
InputAdornment
๊ฐ ๋งจ ์๋ก ์ด๋๋์์ต๋๋ค.InputProps={{startAdornment: ...}}
๋ ์ฌ์ ํ ์ธ๋ผ์ธ ์ํ์ด๋ฉฐ PureComponent๋ฅผ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ๋ ๋๋งํ ๋๋ง๋ค ์ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.classes={{label: classes.runButtonLabel}}
๋ PureComponent๊ฐ ์คํ ๋ฒํผ์ ์ต์ ํํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค.์ ๋ ๊ฐ์ธ์ ์ผ๋ก PureComponent๋ฅผ ์ข์ํ๊ณ ์ ๋์ ์ผ๋ก ๋ชจ๋ ๊ณณ์์ ์ฌ์ฉํ๊ณ ์ต๋ํ ์ต์ ํํ์ฌ ์๋ํ๋๋ก ๋ ธ๋ ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ MUI๊ฐ PureComponent๊ฐ ์๋ํ๋ ๋ฐฉ์์ผ๋ก ๋ง๋ค์ด์ง ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ ์์ต๋๋ค.
InputProps
์ ๊ฐ์ *Props
์ํ์ MUI ์๋ ๋ฐฉ์์ ๊ธฐ๋ณธ ํจํด์
๋๋ค. ํ์ํ ๋ MUI ๋ด๋ถ๋ฅผ ์์ ํ๋ ๊ณ ๊ธ ๋ฐฉ๋ฒ์ผ ๋ฟ๋ง ์๋๋ผ ๊ฐ๋จํ ์ฌ์ฉ ์ฌ๋ก์์ ์ ๊ธฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒ์
๋๋ค. ์ด ํจํด์ ์ผ๋ฐ์ ์ผ๋ก ์์ ๋ชจ๋์์ ์ต์ ํ๋ ์ ์๋ ๋ชจ๋ ๋ฆฌํ ๊ตฌ์ฑ ์์๋ฅผ ์ต์ ํํ ์ ์๋๋ก ๋ง๋ญ๋๋ค.classes={{...}}
ํจํด์ PureComponent์์๋ ์๋ํ์ง ์์ผ๋ฉฐ MUI์์ ์คํ์ผ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์
๋๋ค. (๊ทธ๋ฆฌ๊ณ classes={classes}
๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๋งํ๋ ๊ฒ์ ์ค์ ์๋น์๊ฐ ๊ตฌ์ฑ ์์์ ๋ด๋ถ ํด๋์ค์ ๋ค๋ฅธ ํด๋์ค ์ด๋ฆ์ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ด ์๊ณ classes
๊ฐ ๋ค๋ฅธ ์์์ ์คํ์ผ์ ์ง์ ํ๋ ํด๋์ค๋ ํฌํจํ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ ์ค์ฉ์ ์ด์ง ์์ต๋๋ค. ๋์ผํ ์๋น ๊ตฌ์ฑ ์์์์)๋ฌด์์ด๋ ์ต์ ํํ๋ ค๋ฉด ์ด๋ฌํ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋จ์ํ ์ฌ๋๋ค์ด ์์ ๋ชจ๋ MUI๋ฅผ ์ฌ์ฉํ๋๋ก ํ์ฉํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ค์ ๋ก ๋ง์ด ์ต์ ํ๋์ง ์์ต๋๋ค. ๋๋ ๋ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ ์๊ฐํ ์ ์๋ค.
shallowMemoize
๋ก์ปฌ this
๋ฐ key
๋ฅผ ์ฌ์ฉํ๋ shallowMemoize
์งง์ ๊ฒ์
๋๋ค. ์์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจํํฉ๋๋ค.shallowMemoize
๋ฅผ ์ํํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ render()
์ ์ ๋ฌํ๋ ๊ฒ์
๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ ๋๋งํ ๋๋ง๋ค ์ ํญ๋ชฉ์ ์ ๋ฌํ ์ ์๊ณ key
๊ฐ ํ์ํ์ง ์๊ณ ๋ง์ง๋ง ๋ ๋๋ง์์ ๋ฉ๋ชจ์ด์ ๋ ๊ฐ์ฒด๋ฅผ ๋ค์ ์ฌ์ฉํด์ผ ํ๋์ง ํ์ธํ ๋ค์ ๋ชจ๋ ์ด์ ๊ฐ์ ๋ฒ๋ฆด ์ ์์ต๋๋ค.๋ฌผ๋ก ๋ฌธ์ ๋ ์ด๊ฒ์ด ์๋น์๋ฅผ ํจ์ฌ ๋ ํฌ๊ณ ์ง์ ๋ถํ๊ฒ ๋ง๋ค๊ณ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ์ฝ๋์์ ๋ฉ๋ฆฌ ๋จ์ด์ง ๊ณณ๊น์ง ์๋์ผ๋ก ๋ ผ๋ฆฌ๋ฅผ ๋์ด์ฌ๋ ค์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
import {createSelector} from 'reselect';
class FormPage extends PureComponent {
state = { example: '' };
change = e => this.setState({example: e.target.value});
submit = () => {
console.log('Submit: ', this.state.example);
};
runButtonClasses = createSelector(
props => props.classes.runButtonLabel,
runButtonLabel => ({runButtonLabel}));
render() {
const {title} = this.props;
const {example} = this.state;
return (
<form>
{title}
<TextField
InputProps={this.shallowMemoize('a', {
// This example assumes use of transform-react-constant-elements to make this object always the same
startAdornment: <InputAdornment position="start">Kg</InputAdornment>,
}}}
onChange={example}
value={example} />
<Button classes={this.runButtonClasses(classes)}>Run</Button>
<Button onClick={this.submit}>Submit</Button>
</form>
);
}
}
// ...
<strong i="6">@withShallowMemoize</strong>
render(memo) {
const {title} = this.props;
const {example} = this.state;
return (
<form>
{title}
<TextField
InputProps={memo({
startAdornment: <InputAdornment position="start">Kg</InputAdornment>,
}}}
onChange={example}
value={example} />
<Button classes={memo(classes)}>Run</Button>
<Button onClick={this.submit}>Submit</Button>
</form>
);
}
์ด๊ฒ์ด MUI๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ด๋ผ๋ฉด ์์ ๋ชจ๋๊ฐ ํ์ํ์ง ์์ ์๋ ์์ต๋๋ค. ๋ณด์๋ค์ํผ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ ๋ํ ์์ ๋์ฐ๋ฏธ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ค๊ธฐ ์์ํ์๋ง์ ํด๋น ๊ตฌ์ฑ ์์ ์์ฒด๋ ์ฝ๊ฒ ์์ํ ๊ตฌ์ฑ ์์๊ฐ ๋ ์ ์์ต๋๋ค. WeightTextField
์์ ์์ value
๊ฐ ์ฌ์ ํ ๋์ผํ๊ณ , withStyles, InputProps์ ํ์ํ ๋ฉ๋ชจ ์์
๋๋ InputAdornment ์ค์ ์ ์์ ํ ๊ฑด๋๋ฐ๋ ํ ์ด์ WeightTextField
๋ ๋ค์ ๋ ๋๋ง๋์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ value
๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ด์จ๋ TextField๋ฅผ ๋ค์ ๋ ๋๋งํด์ผ ํ๋ฏ๋ก ์์ํ์ง ์์ InputProps={{...}}
๋ ์ค์ํ์ง ์์ต๋๋ค.
๋๋ ์ด ๊ธธ์ด ์ข๋ค. ๋๋ ์ด๋ก ์ ๋ง์ดํฌ๋ก ๊ตฌ์ฑ ์์๋ฅผ ์ข์ํฉ๋๋ค. ๋น๋ก ๋ด๊ฐ ์๊ฐํ ์ ์๋ ๊ทธ๊ฒ๋ค์ ์์ฑํ๊ธฐ ์ํด ํ์ฌ ์ ํจํ ๋ชจ๋ ๊ตฌ๋ฌธ/ํจํด์ ์ซ์ดํ์ง๋ง. ๋๋ MyComponent = enhance(MyComponent)
๋ฅผ ์ํ์ง ์๊ณ ์ฅ์ํ๊ณ ์ถ์ง๋ง ์์ ๊ตฌ์ฑ ์์๋ฅผ ์์ฑํ๋ ์งง์ ๋ฐฉ๋ฒ ์ค ์ด๋ ๊ฒ๋ ์ฅ์ํ ์ ์์ต๋๋ค. ๋๋ ๋ํ import {TextField} from 'material-ui';
๋ฅผ import WeightTextField from '../../../ui/WeightTextField
;`๋ก ๋ฐ๊พธ๋ ๊ฒ์ ์ซ์ดํฉ๋๋ค.
```js
let WeightTextField = ({unit, InputProps, ...props}) => (
InputProps={{
์์์ฅ์:
...InputProps
}}
onChange={์์ }
๊ฐ={์์ } />
);
WeightTextField = ์์(WeightTextField);
RunButton = ์์ฑ(
withStyles(ํ
๋ง => ({
๋ ์ด๋ธ: {
fontWeight: '800',
},
})),
์์ํ
)(๋จ์ถ);
const SubmitButton = ์์(๋ฒํผ);
ํด๋์ค FormPage ํ์ฅ ๊ตฌ์ฑ ์์ {
์ํ = { ์: '' };
๋ณ๊ฒฝ = e => this.setState({์: e.target.value});
์ ์ถ = () => {
console.log('์ ์ถ: ', this.state.example);
};
๋ ๋๋ง() {
const {์ ๋ชฉ} = this.props;
const {์์ } = this.state;
return (
<form>
{title}
<WeightTextField
unit='Kg'
onChange={example}
value={example} />
<RunButton>Run</RunButton>
<SubmitButton onClick={this.submit}>Submit</SubmitButton>
</form>
);
}
}
````
ํฐ ๋ชฉ๋ก์ ํ์ด์ง์ 500-2000๊ฐ์ ํ์ธ๋์ ํ์ํด์ผ ํ๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ต๋๋ค. ๊ธฐ๋ณธ ๋ธ๋ผ์ฐ์ ํ์ธ๋์ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ ๊ด์ฐฎ์ง๋ง <Checkbox>
๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ด ๋งค์ฐ ๋จ์ด์ง๊ณ ํ์ด์ง์ ํ์ธ๋ ์์ ๋ฐ๋ผ ์ ํ์ผ๋ก ํ์ฅ๋ฉ๋๋ค. ์: https://codesandbox.io/s/5x596w5lwn
๋๋ mui@next๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค โ ์ด๊ฒ์ ์คํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ธฐ ์ํด _์ง๊ธ_ ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ์ ๋ต์ด ์์ต๋๊น?
@์์จ์ญ์จ
์ฒซ์งธ, ๋ค์์ ์ํํ์ง ๋ง์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ ๋๋งํ ๋๋ง๋ค ํ์ธ๋๋ง๋ค ์ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์์ฑ๋์ด ์ํํ๋ ค๋ PureComponent ์ต์ ํ๊ฐ ์ต์ ํ๋์ง ์์ต๋๋ค.
handleChange = index => event => {
this.setState({
๋์งธ, Checkbox๋ฅผ ๊ฐ์ธ๋ ์์ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ค๊ณ ํด๋น ๊ตฌ์ฑ ์์๋ฅผ ์์ํ๊ฒ ๋ง๋ญ๋๋ค. ์ด๊ฒ์ ๋ชจ๋ ํ์ธ๋์ ๊ณตํต์ ์ธ ์์ฑ์ ์ถ๊ฐํ ์ ์๋ ์ถ๊ฐ ์ด์ ์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ํญ๋ชฉ์ ๋ํด ๋ค๋ฅธ ๋ณ๊ฒฝ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํ์ํ๋ค๋ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๊ฐ ์์ผ๋ฏ๋ก ํด๋์ค ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๊ณ ๋ชฉ๋ก ์ปจํ ์ด๋ ๋์ ๊ตฌ์ฑ ์์์์ ์ด๋ฅผ ์ํํ ์ ์์ต๋๋ค.
๋ฌด์์ด๋ ์ต์ ํํ๋ ค๋ฉด ์ด๋ฌํ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋จ์ํ ์ฌ๋๋ค์ด ์์ ๋ชจ๋ MUI๋ฅผ ์ฌ์ฉํ๋๋ก ํ์ฉํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ค์ ๋ก ๋ง์ด ์ต์ ํ๋์ง ์์ต๋๋ค. ๋๋ ๋ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ ์๊ฐํ ์ ์๋ค.
@dantman ์ด API ์ ํ์ DX๋ฅผ ์ต๋ํ ๋น ๋ฅด๊ฒ ํ๋ฉด์ ์ต๋ํ DX๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค.
InputProps, ํด๋์ค ๋ฑ์ ์ต์ ํํ๋ ๋์ ... ์ฐ๋ฆฌ๋ ์ฌ๋๋ค์ด ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก์ ๋ํ ๋ง์ดํฌ๋ก ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ค๋๋ก ๊ถ์ฅํฉ๋๋ค.
์ ์ฐ๋ฆฌ๋ ๊ทธ๋. ๋ํ ํจํด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉ์ ์ ์ํ๋ ๋ฐ ํ์คํ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ ์ฉํ๋๋ก ํ์ฅํ ์ ์์ต๋๋ค. ๊ตฌ์ฑ ์์ ์ฌ์ฉ์ ๊ฐ๋ณ์ฑ์ด ํจ์ฌ ๋ฎ์ ์ฌ์ฉ์ ์์ญ์์ ๋ ์ฝ์ต๋๋ค. ๋ฌธ์์์ ์ด ์์ ์ ๋ํ FAQ ์ง๋ฌธ์ด๋ ๊ฐ์ด๋ ์น์ ์ ์ถ๊ฐํ ์๋ ์์ต๋๋ค.
์ ์ฐ๋ฆฌ๋ ๊ทธ๋. ๋ํ ํจํด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉ์ ์ ์ํ๋ ๋ฐ ํ์คํ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ ์ฉํ๋๋ก ํ์ฅํ ์ ์์ต๋๋ค. ๊ตฌ์ฑ ์์ ์ฌ์ฉ์ ๊ฐ๋ณ์ฑ์ด ํจ์ฌ ๋ฎ์ ์ฌ์ฉ์ ์์ญ์์ ๋ ์ฝ์ต๋๋ค. ๋ฌธ์์์ ์ด ์์ ์ ๋ํ FAQ ์ง๋ฌธ์ด๋ ๊ฐ์ด๋ ์น์ ์ ์ถ๊ฐํ ์๋ ์์ต๋๋ค.
ํ์ธ. ์ด ๊ฒฝ์ฐ:
../../../../ui/Foo
๊ฐ์ ธ์ค๊ธฐ๋ฅผ something-local/Foo
์ ๊ฐ์ ๊ฒ์ผ๋ก ๋ณํ) MUI๋ฅผ ๋ํํ๋ ๋ง์ดํฌ๋ก ๊ตฌ์ฑ ์์์ ๋ก์ปฌ ์๋ฆฌ์ฆ๋ฅผ ์ฌ์ฉํ์ฌ import {TextField} from 'material-ui';
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋งํผ ํ๋ฅญํ๊ฒ ๋ง๋ค ์ ์์ผ๋ฉฐ ๊ฐ๋ฐ์๊ฐ ์ฝ๊ฒ ํด๋ณดํ๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง์ง ์์ต๋๋ค. .@dantman ํ์์ ์ ๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
withStyles(๋๋ ์คํ๋ ค JSS)๊ฐ ๋งค์ฐ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ sCU๋ฅผ ์ ์ฉํ๋ ๋ฐ ์ฌ๋ฌ ๋ฒ ํ์ํ์ต๋๋ค. JSS์ ์ฝ๋๋ ๋ชจ๋ฅด์ง๋ง ๊ฝค ๋ง์ด ์ต์ ํ ๋ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ์ผ๋ฐ์ ์ผ๋ก styled-components ๋๋ glamorous๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๊ฒฐ๊ตญ JSS์ ์ฑ์์ ๋ค๋ฅธ ํ๋๋ฅผ ์ฌ์ฉํ๊ณ ๋ ๋ค JSS๋ณด๋ค ์ฑ๋ฅ์ด ๋ฐ์ด๋ฉ๋๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ๋ ์ฝ๊ฐ ์ฑ๊ฐ์ค ์ ์์ง๋ง ์ฑ ์์ค sCU ๋๋ ๋ ์ค๋งํธํ ์ํ ์ ๋ฐ์ดํธ๋ก ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋๋ ์์ง ๋ฌธ์ ๊ฐ ๋ ๋งํผ ๋๋ฆฐ ๋จ์ผ MUI ๊ตฌ์ฑ ์์๋ฅผ ๋ณด์ง ๋ชปํ๊ณ ์๋นํ ์๊ฐ์ด ์์๋ MUI ๋ด๋ถ์์ ์ค์ ๋ก ์ฝ๋ฉํ์ง๋ ์์์ต๋๋ค.
๋ ๋น ๋ฅผ ์ ์๊ณ ๊ฐ๋ ์ด ๋ ํ์ํ๋ค๋ฉด ๋ ์ข์ ๊ฒ์ด๋ผ๊ณ ๋งํ ์๋ ์์ง๋ง ์ ์ด๋ ๋ด๊ฐ ๋ณด๊ธฐ์๋ ์ด ๊ฒฝ์ฐ MUI๋ณด๋ค JSS๋ฅผ ์ง์ ์ต์ ํํ๋ ๋ฐ ์๊ฐ์ ๋ณด๋ด๋ ๊ฒ์ด ๋ ๋์ ๊ฒ์ ๋๋ค.
@Pajn ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค. withStyles ์ฑ๋ฅ์ ๋ฌธ์ ๊ฐ ์๊ฑฐ๋ styled-components๋ณด๋ค ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์ํฉ์ ๋ณด๋ ๊ฒ์ ์ ๋ง ์ข์ต๋๋ค.
์๋ฌด๋์ด repo https://github.com/reactopt/reactopt๋ฅผ ํ์ธ ํ์ต๋๊น?
$ click - button (text: ู
ูุงูุงุช
) => CssBaseline,TransitionGroup,TouchRipple,TransitionGroup,TouchRipple,ScrollbarSize,TransitionGroup,TouchRipple,Ripple,TransitionGroup,TouchRipple,TransitionGroup,TouchRipple,TransitionGroup,TouchRipple,TransitionGroup,TouchRipple,TransitionGroup,TouchRipple,TransitionGroup,TouchRipple,Main,ScrollbarSize,TransitionGroup,TouchRipple,Ripple,TransitionGroup,TouchRipple,TransitionGroup,TouchRipple,TransitionGroup,TouchRipple,TransitionGroup,TouchRipple,TransitionGroup,TouchRipple,TransitionGroup,TouchRipple,TransitionGroup,TouchRipple
์ด๋ฌํ ๊ตฌ์ฑ ์์๋ ๋จ์ํ ํด๋ฆญ๋ง์ผ๋ก ๋ถํ์ํ ์ฌ๋ ๋๋ง์ ์ํํฉ๋๋ค. ์ ๊ตฌ์ฑ ์์ ์ ๋ฐ์ดํธ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์๋ํ์ง ์์ต๋๊น?
@nimaa77
์๋ฌด๋์ด repo https://github.com/reactopt/reactopt๋ฅผ ํ์ธ ํ์ต๋๊น?
์๋์, ์ ๋ฐ์ดํธ๋ฅผ ์ ํ์ต๋๊น? ๋ฐ chrome/react ๊ฐ๋ฐ ๋๊ตฌ ๊ธฐ๋ฅ์ ์ฌ์ฉํฉ๋๋ค.
์ด๋ฌํ ๊ตฌ์ฑ ์์๋ ๋จ์ํ ํด๋ฆญ๋ง์ผ๋ก ๋ถํ์ํ ์ฌ๋ ๋๋ง์ ์ํํฉ๋๋ค. ์ ๊ตฌ์ฑ ์์ ์ ๋ฐ์ดํธ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์๋ํ์ง ์์ต๋๊น?
์์ ๋ ผ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ์ด๊ฒ์ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก์ ์ ํฉํ์ง ์์ต๋๋ค. ๋์๊ฒ material-ui๋ ์์ ๋ฒ์ ๊ณผ ์์ํ์ง ์์ ๋ฒ์ ์ ๊ตฌ์ฑ ์์๋ฅผ ๋ชจ๋ ์ ๊ณตํด์ผ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์ํ ๊ตฌ์ฑ ์์๋ก ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋์์ต๋๋ค.
@dantman
์ด ์์ ๋ฅผ ๋ณด๋ฉด(์ธก๋ฉด์์ ํ๋ฌ๊ทธ์ธ์ ํด๋ฆญํ๊ณ "react-constant"๋ฅผ ๊ฒ์ํ ๋ค์ "transform-react-constant-elements" ํ์ธ๋์ ํด๋ฆญ) ์ต์ ํ๋ ๊ฒ์ด ๊ฑฐ์ ์์์ ์ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ ๋ฟ์ ๋๋ค. ๋ค๋ฅธ ์ต์ , ํ๋ฌ๊ทธ์ธ ๋ฐ ๊ธฐํ ์์ผ๋ก ๋ง๋ ์ต์ ํ๋ ์์ต๋๋ค. ์คํดํ์ง ๋ง์ธ์. ํ์ง๋ง ์ต์ ํ๊ฐ ์ข์์ง ๋์์ง ์ด๋ก ์ ์ธ ๋ ผ์์๋ ๊ด์ฌ์ด ์์ต๋๋ค. WORKS์ธ ์ต์ ํ ์์ ์ ๊ด์ฌ์ด ์์ต๋๋ค. ์ ์ด๋ ๋ด ์ค์ ์์๋. ๋ด๊ฐ ์์ ์ด ๋ชจ๋ ๊ฒ์ ๋๋ฅผ ์ํด ์ผํ๊ณ ์์ผ๋ฉฐ ์ ์ด๋ ์ค์ ๊ฐ ๋ชจ๋ฐ์ผ ์ฅ์น์์ ๋ด ์ฑ์ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค. ๊ตฌ์ฑ ์์ ํธ๋ฆฌ ์ฌ์ ๋ ฌ๊ณผ ๊ฐ์ ๋ ๋ง์ ์ต์ ํ๋ฅผ ์ํํด์ผ ํ์ง๋ง ์์ํ ๊ตฌ์ฑ ์์ ๋ฐ ๊ธฐํ ์๋ ์ต์ ํ ์์ด๋ ์ฑ๋ฅ์ ๋ฌ์ฑํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์, ์ ๋ ์ด ์์ ์ ์ํํ๊ธฐ ์ํด ํ๋กํ์ผ๋ง๊ณผ ์ต์ ํ๋ฅผ ๋งค์ฐ ๋ง์ด ์ํํฉ๋๋ค.
@Bessonov ์๋ง๋ ์ฐ๋ฆฌ๋ prop์ ์ฌ์ฉํ์ฌ shouldComponentUpdate ๋ฉ์๋๋ฅผ ์์ ๋น๊ต(https://reactjs.org/docs/shallow-compare.html)๋ฅผ ์ํํ๊ฑฐ๋ ํญ์ false๋ฅผ ๋ฐํํ๋๋ก ๋ง๋ค ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ ๊ฐ์ง ๋ฒ์ ์ ๊ตฌ์ฑ ์์(์์ ๋ฐ ์ผ๋ฐ)๋ก ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ์ํค์ง ์์ต๋๋ค.
@lucasljj ์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ์ํ ์ ์ฅ ๊ตฌ์ฑ ์์์ ๋ํ ๋ํผ๋ก ์ํ๋๋ ๊ฒฝ์ฐ ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ํฌ๊ฒ ์ฆ๊ฐํ์ง ์์ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค. ์์ ํ๋กํ๋ ์ฐธ์กฐํ์ญ์์ค. ์์ํ ๊ตฌ์ฑ ์์๋ง sCU์์ return false;
๋ณด๋ค ๋น ๋ฆ
๋๋ค.
์์ ๊ตฌ์ฑ ์์ ๋๋ sCU๋ฅผ ๊ตฌํํ๋ ๊ตฌ์ฑ ์์์ ๋ฌธ์ ๋ ๋ด๋ถ์ ์์ํ์ง ์์ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ children
์
๋๋ค. ์์ ์ง์ ์ ์ฐธ์กฐํ์ญ์์ค. ํด๊ฒฐํด์ผ ํ ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ํ
๋ง ์ ํ์
๋๋ค. ํ
์คํธ๋์ง๋ ์์์ง๋ง ์ ์ด๋ Context API๋ก ๊ทน๋ณตํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@bossonov Pure Components๋ ํํฐ์ ๋ฆ๊ฒ ์๊ธฐ ๋๋ฌธ์๊ฐ ์๋ ๋ฐ์์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ํ์ ํธ๋ฆฌ์์ ๋ถ์กฑ์ ์ํํ๋ redux ์์ ์คํ์ผ ๋ํผ๋ฅผ ๋ง๋ค ๊ฒ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค.
์์ ๊ตฌ์ฑ ์์์ ์์์ ๊ดํด ์ธ๊ธํ ๋ฌธ์ ๋ ์ต์์ props๊ฐ ์์์๊ฒ ์ ํ๋์ง ์๋ ๊ฒฝ์ฐ์๋ง ๋ฐ์ํฉ๋๋ค. ๋ชจ๋ prop ๋๋ state ๋ณ๊ฒฝ์ prop์ด ์ ํ๋์ง ์๋ ์์ค๊น์ง ์์ ํธ๋ฆฌ๋ฅผ ํตํด ๋ค์ ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
์์ํ ๊ตฌ์ฑ ์์์ ์์ด๋์ด๋ ๋ชจ๋ ์ํ ๋๋ ์ํ ๋ณ๊ฒฝ์ ๋ํด ๋ค์ ๋ ๋๋ง๋๋ค๋ ๊ฒ์
๋๋ค. ๋๋ ๋ด๋ถ๋ฅผ ์ ๋ชจ๋ฅด์ง๋ง ๋ชจ๋ ์์์๊ฒ ์ ๋ฌํ๋ ๊ตฌ์ฑ ์์ ๋ณ๊ฒฝ ์์ฑ์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ด ๊ถ๊ธํ์ต๋๋ค. ์ ์ฒด ํธ๋ฆฌ๋ฅผ ํตํด ์ํ์ ์ ๋ฌํ ํ์๊ฐ ์๋๋ก ์ด ๋ชฉ์ ์ผ๋ก ์ ์ปจํ
์คํธ API๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
@oliviertassinari
์ฑ๋ฅ์ v1 ๋ฆด๋ฆฌ์ค ์ดํ์ ์ค์ ์ ๋ ๊ฒ์ ๋๋ค.
์ข์ต๋๋ค. v1์ด ์ถ์๋์์ต๋๋ค. :) ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํ๋ ์์ ์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๊น? ์ด ๋ฌธ์ ๋ v1 ์ดํ ์ด์ ํ์ ์ผ๋ถ๊ฐ ์๋๋๋ค.
@Bessonov ์๊ฐ์ ๋ด์ด ROADMAP์ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ์ฑ๋ฅ์ ๊ดํด์. ์คํ ๊ฐ๋ฅํ ๋ ๊ฐ์ง๋ฅผ ์ผ๋์ ๋๊ณ ์์ง๋ง ๋ ๋ง์ ๊ฒ์ ๋ฐ๊ฒฌํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
style = f(props)
์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค(์, ์์ง ์ง์ํ์ง ์์ต๋๋ค: #7633). ์ฐ๋ฆฌ๋ ๋งค์ฐ ํจ์จ์ ์ธ ์บ์ฑ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ด ๋ฐ๋ณต ์์ฒญ์ ๋ํ ๋น์ฉ์ 0%์ ๊ฐ๊น๊ฒ ์ค์ผ ์ ์์ต๋๋ค. SSR ์ฑ๋ฅ์ด ๋น์ฆ๋์ค ๋ฉํธ๋ฆญ์ ํด๋ฅผ ๋ผ์น๋ฉด ์ฌ๋ฌด์ค์์ ์์
ํ ์ ์์ต๋๋ค.URL์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์์ 1 ๋ฐ ๋งํฌ๋ #4305์ ์์ ํ ๋์ํฉ๋๋ค.
์ปดํ์ผ ์๊ฐ ์ต์ ํ๋ ํ๋ฅญํ ๊ฒ์ด๋ฉฐ ์ ๊ด์ ์์๋ ์ฒ์ ๋ก๋ ๋ฐ ๋ค์ ๋ ๋๋ง์ ๊ฐ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ํธ๋์ด์ผ ํฉ๋๋ค.
๋ ๋ค๋ฅธ ๊ฒ์ mui(๋ฐ babel ๋ฑ)๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋์ ์ฑ๋ฅ์ ์ป๋ ๋ฐฉ๋ฒ์ ๋ํ ์ผ์ข ์ ๋ฌธ์ ๋๋ ์์ ํ๋ก์ ํธ์ ๋๋ค.
jss-cache๋ฅผ ์ฌ์ฉํ ์ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
ISTF + ์ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ ๋ช ms๋ฅผ ๋จ์ถํ ์ ์์ต๋๋ค.
2018๋ 5์ 19์ผ ํ ์์ผ 19:06 Anton Bessonov [email protected]์ด ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
URL์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
1๊ณผ ๋งํฌ๋ #4305์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค.
https://github.com/mui-org/material-ui/issues/4305 ์.
- SSR์ ์ฒซ ํ์ด์ง ๋ก๋์ ๋์์ด ๋์ง๋ง ๋๋ฆฐ ๋ก๋์๋ ๋์์ด ๋์ง ์์ต๋๋ค.
๋ ๋๋ง ๋๋ ์ฝ๋ฅด๋๋ฐ. ๊ฐ์ธ์ ์ผ๋ก ์ฒ์ ๋ก๋ํ ๋๋ ๋ฌด์ํ ์ ์์ง๋ง
๋ฐ์คํฌํ ๋๋ ๋ชจ๋ฐ์ผ์์๋ ๋๋ฆฐ ๋ ๋๋ง์ ์ฌ์ ํ โโ๋ชจ๋ฐ์ผ ์ฅ์น์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์ฒซ ๋ก๋ฉ.์ปดํ์ผ ์๊ฐ ์ต์ ํ๋ ํ๋ฅญํ ๊ฒ์ด๋ฉฐ ๋ด ๊ด์ ์์๋
์ฒ์ ๋ก๋ํ๊ณ ๋ค์ ๋ ๋๋งํ ๋ ํฅ์๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ ํธ๋ฉ๋๋ค.๋ ๋ค๋ฅธ ๊ฒ์ mui๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ผ์ข ์ ๋ฌธ์ ๋๋ ์์ ํ๋ก์ ํธ์ ๋๋ค.
(๋ฐ babel ๋ฑ) ๋ ๋์ ์ฑ๋ฅ์ ์ป์ผ๋ ค๋ฉด.jss-cache http://cssinjs.org/jss-cache?v=v3.0.0 ์ด ๋ ์ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ฌ์ฉ ๋.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/mui-org/material-ui/issues/10778#issuecomment-390418709 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AADOWGrCxNGqrT4MijiX8r9Ad32z6RsJks5t0FEtgaJpZM4S4woq
.
๋ฒค์น๋งํฌ ์ค์ ์ ๋์์ด ๋ ์ ์์ต๋๋ค.
https://github.com/A-gambit/CSS-IN-JS-Benchmarks/blob/master/RESULT.md
์ค react-jss(material-ui์์ ์ฌ์ฉ)๊ฐ ๊ฝค ๋๋ฆฐ ๊ฒ ๊ฐ์ต๋๋ค.
@janhoeck ๊ทธ๋ ์ง ์์ผ๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฆ๋ช ํ ์ ์์ ๊ฒ์ ๋๋ค. ์ ๋ ํ์ ํฉ๋๋ค.
@kof ๋๋ ๋ง์ดํฌ๋ก ๋ฒค์น๋งํฌ๊ฐ ๋ง์ ๊ฒ์ ๋งํ์ง ์๋๋ค๋ ๊ฒ์ ๊ฝค ์ดํดํ์ง๋ง ์ํ๋ก๋ํ ์ ๋นํด 4x-6x๋ ์ ๋ง ๋๋ฆฝ๋๋ค. ์ฌ์ค material-ui์ ์ ์ฒด์ ์ธ ์ฑ๋ฅ์ ๊ทธ๋ค์ง ๋น๋์ง ์์ต๋๋ค.
4x-6x๋ ์ํ๋ก๋ํ ์ ๋นํด ์ ๋ง ๋๋ฆฝ๋๋ค.
@Bessonov ๋ฒค์น๋งํฌ ๋ฐฉ๋ฒ๋ก ์ด ํต์ฌ ์
๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์์ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์์ ์๋ํด ๋ณผ ์ ์์ต๋๋ค.
https://twitter.com/necolas/status/954024318308007937?lang=fr
๋ด ๋ธ๋ผ์ฐ์ ์ ๊ฒฐ๊ณผ:
โ ๏ธ ์์ ๊ฐ ์์ด
material-ui์ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ด ๋น๋์ง ์์ต๋๋ค.
์ฐ๋ฆฌ๋ React ์์ฒด์ ๊ตฌ์ฑ ์์ ๋น์ฉ์ผ๋ก ์ธํด ๋งค์ฐ ์ ํ์ ์ผ ์ ์์ต๋๋ค.
@Bessonov ์ฑ๋ฅ์ ํ์ธํ๋ ๋ฐ ์ฌ์ฉํ ๊ฒ์ด ๋ฌด์์ด๋ , ์ํ๋ก๋ํ ์ ๊ดํด์๋ ์ต๋ํ ๋นจ๋ฆฌ ์ฌ์ฉํ๊ณ ๋ ๋๋ง์ ์ง์ฐํ๊ธฐ ๋๋ฌธ์ ์ฌ์ค์ด ์๋๋๋ค. ๋ฐ๋ผ์ ๋๋ถ๋ถ์ ๋ฒค์น๋งํฌ๋ CPU ์๊ฐ์ ์ธก์ ํ์ง๋ง ์ต์ข ๋ ๋๋ง ์ฑ๋ฅ์ ์ธก์ ํ์ง ์์ต๋๋ค. @oliviertassinari๊ฐ ๊ฒ์ํ ๋ฒค์น๊ฐ ๊ฐ์ฅ ํ์ค์ ์ด๋ผ๊ณ ํฉ๋๋ค.
MUI ์ฑ๋ฅ๊ณผ ๊ด๋ จํ์ฌ ์ถ์ํ๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์์ ๋ ๋ ๋นจ๋ผ์ง ์ ์์ง๋ง ์์ ์ ์๋๋๋ค. MUI ๋ค์์ ๊ฝค ๋น ๋ฆ ๋๋ค. ๋งค์ฐ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ์์ ํ ์๋ชป๋ ์์ ์ ํ๊ฑฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์ฉํ์ง ์๋ ํ ์ฑ๋ฅ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค.
@kof ์๋์, MUI๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น ๋ฅด์ง ์์ต๋๋ค. ์์ฉ ๊ฐ๋ฅํ ์ฑ๋ฅ์ ์ป์ผ๋ ค๋ฉด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ตฌํํด์ผ ํฉ๋๋ค. ํ์คํ: ๊ณ ๊ธ Mac์ฉ์ด ์๋๋ผ ๋ชจ๋ฐ์ผ ์ฅ์น์ฉ์ด๋ผ๋ ๊ฒ์ ๋ณด์ง ๋ชปํ์ จ์ต๋๊น?
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ ํ ์๋ชป ์ฌ์ฉํ๊ฑฐ๋ ์ค์ฉํ์ง ์๋ ํ ์ฑ๋ฅ์ ๋ํด ๊ฑฑ์ ํ์ง ๋ง์ญ์์ค.
์, ์์ ๋ช ๊ฐ์ง codesanbox ์์ ์
๋๋ค. ์ปจํ
์ด๋์ MUI ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๊ณ ๊ตฌ์ฑ ์์ ๋ฐ๋ชจ์์์ ๊ฐ์ด ์
๋ ฅ ๊ฐ์ ์ปจํ
์ด๋ ์ํ์ ์ ์ฅํ๋ฉด ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค. PureComponent๋ก ๊ฐ์ธ๊ณ , ์ ์ด๋์ง ์๋ ๊ตฌ์ฑ ์์, ํธ๋ฆฌ ์ฌ์ ๋ ฌ, ์์ ์์, ๋ฉ๋ชจ ์์ฑ ๋ฑ์ ์ฌ์ฉํ์ฌ ํ์ฉ ๊ฐ๋ฅํ ์ฑ๋ฅ์ ์ ์งํ๋๋ก ๋์ต๋๋ค. ์๋ฅผ ๋ค์ด (atm ์ฐ๋ฆฌ๋ ๋ ์ด์ ์๋์ ์ฌ์ฉํ์ง ์์)์์ ๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด MUI๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค ์ ์์ต๋๋ค.
https://codesandbox.io/s/r1ov818nwm
@oliviertassinari ๋งํฌ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋ค์์ nexus 4์ Chrome 66์ ๋ํ ๊ฒฐ๊ณผ์ ๋๋ค. ๋ณด์๋ค์ํผ ๊ฒฐ๊ณผ๋ 10๋ฐฐ ๋ ๋์ฉ๋๋ค. ํก๋จ ๋ณด๋ 21/ํฌ๋กฌ 51์์๋ ์กฐ๊ธ ๋๋ฆด ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฐ๋ฆฌ๋ React ์์ฒด์ ๊ตฌ์ฑ ์์ ๋น์ฉ์ผ๋ก ์ธํด ๋งค์ฐ ์ ํ์ ์ผ ์ ์์ต๋๋ค.
๋ค๋ฅธ ์ฌ๋๋ค๋ ์ธ๊ธํ๋ฏ์ด IMHO๋ ๋ฐ๋์ ๊ทธ๋ฐ ๊ฒ์ ์๋๋๋ค. ๋ชจ๋ ์ฌ๋ ๋๋ฅผ ํผํ๋ฉด ์ฑ๋ฅ๊ณผ ๋ฐฐํฐ๋ฆฌ ์ธก๋ฉด์์ ํฐ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค. ์์ง ๋ง์ธ์. ์ฑ๋ฅ์ ๋ก๋๋งต์ ์ธ ๋ฒ์งธ ์์ ์ ๋๋ค.+1:
๊ทธ๋ ๊ฒ ๋ด: cssinjs๋ก ํ๋ ์ผ์ด ๋ชจ๋ฐ์ผ ์ฅ์น์์ ๋๋ฌด ๋๋ฆฌ๋ค๋ฉด ์ด ๋ฐ์๊ณผ ๋๋ถ๋ถ์ ๋ค๋ฅธ ๊ฒ๋ค์๋ ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค. cssinjs๊ฐ ์๋๋ฅผ ๋ฆ์ถ๋ฉด ๋ฐ์ ๊ตฌ์ฑ ์์๊ฐ ์๋๋ฅผ ํจ์ฌ ๋ ๋ฆ์ถฅ๋๋ค. ๋ ๋ฒจ ob ์ถ์ํ๋ฅผ ์ฌ๊ณ ํ๊ฑฐ๋ ์ต์ ํ๋ฅผ ์ ์ฉํด์ผ ํฉ๋๋ค.
@oliviertassinari ๋ ๊ทธ evtl์ ๋๋ค. ์ ๋ฐ์ดํธ ์ mui ๋ํผ๊ฐ jss ์คํ์ผ์ ๋ค์ ๋ ๋๋งํ ์ ์์ต๋๊น? ์ ์ฌ์ ์ผ๋ก ๋ถํ์ํ ์์ ์ ์ํํ๋ ์ผ๋ถ ๋์ถ์ด ์์ ์ ์์ต๋๋ค.
@kof
๊ทธ๋ ๊ฒ ๋ด [...]
๋์ ์๋๋ฅผ ์ ๊ฒ ์ด. ๊ทธ๋ฌ๋ ๋ฐ์ํ๊ณ ๋ฐ์ํ๋ (์์) ๊ตฌ์ฑ ์์๋ ๊ทธ ์์ฒด๋ก ๋ณ๋ชฉ ํ์์ด ์๋๋ฉฐ ๋งค์ฐ ์ ์ํ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, MUI๋ PureComponent๋ฅผ ์ฌ์ฉํ์ง ์์ง๋ง(์์์ ์ค๋ช ํ ์ฅ๋จ์ ์ด ์์) ์ฐ๋ฆฌ์ ์ถ์ ๋ ์์ ํ๊ฒ ํด์ค๋๋ค. @oliviertassinari ๋ ์บ์ ๋๋ ์ฌ์ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋์ ์ฑ๋ฅ์ ์ป์ ์ ์๋ ๊ธฐํ๊ฐ ์ธ๊ธ ํ์ต๋๋ค.
์คํดํ์ง ๋ง์ธ์. ์ฌ๋ฌ๋ถ์ ๋ฉ์ง ์ฌ๋๋ค์ด๋ฉฐ ๋ชจ๋ MUI ๋ฆด๋ฆฌ์ค์ ๋ํด ์ ๋ง ๋ง์กฑํฉ๋๋ค. ๋ฐ์: ํ์ง๋ง ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๊ณ ์ฑ๋ฅ ๋ฐ์คํฌํฑ์ ํตํด ์น์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ๋ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
๋ฐ์์ด ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ด ์๋๊ณ ๊ทธ๊ฒ์ ๋ํด ํ์ ํ๋ค๋ฉด JSS๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋ถํ์ํ ์์ ์ด ์งํ ์ค์ด๊ณ ์ ๋ฐ์ดํธ ์ CSS๊ฐ ์ฌ์์ฑ๋๋ ๊ฒฝ์ฐ ์ ํจ์ฑ์ ๊ฒ์ฌํด์ผ ํ๋ ๊ฒ์ ์์ํ ์ ์๋ ์ ์ผํ ๊ฒ์ ๋๋ค.
์์ ๊ตฌ์ฑ ์์๋ ์ต์ ํ๊ฐ ํ์ํ ๊ฒฝ์ฐ ์์ฉ ํ๋ก๊ทธ๋จ ์์ค ์ฝ๋์์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ์ ๋๋ค. MUI๋ ์ด๋ฅผ ์ํํ ํ์๊ฐ ์์ผ๋ฉฐ ์ผ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฏ๋ก ์ด๋ ํ ๊ฐ์ ๋ ํด์๋ ์ ๋ฉ๋๋ค. PureComponent๊ฐ ํญ์ ์ข์ ๊ฒ์ ์๋๋๋ค.
JSS๋ ์ฒซ๋ ๋ถํฐ ์ฑ๋ฅ์ ๊ณ ๋ คํ์ผ๋ฉฐ ๋ง์ดํฌ๋ก ์ต์ ํ์ ๋์๋ ์๊ฐ์ ๋ณด๋์ต๋๋ค.
์ด๊ฑด ๋ง๋ ์๋ผ. ๋ชจ๋ ๋จ์ผ ์ํธ ์์ฉ์์ ์ฌ๋ฃ UI ๊ตฌ์ฑ ์์๊ฐ ๋ค์ ๋ ๋๋ง๋๋ ๊ฒ์ ๋ง์ ์ ์์ต๋๋ค. ๋ด๊ฐ ํ๋ ์ผ์ ์ค์ํ์ง ์์ต๋๋ค.
class RowText extends Component {
shouldComponentUpdate = (nextProps, nextState) => {
return false;
};
render() {
const { title, artist } = this.props;
return <ListItemText primary={title} secondary={artist} />;
}
}
ํธ๋ฆฌ๊ฑฐ๋ ๊ธฐ๋ณธ Typography ์์๋ฅผ ๋ค์ ๋ ๋๋งํฉ๋๋ค. ์ด๋ป๊ฒ ์ด๊ฒ์ด ๊ฐ๋ฅํฉ๋๊น?
์ด๋ด, ์ด๊ฒ์ ๋ชฉ๋ก๊ณผ ๋ชฉ๋ก ํญ๋ชฉ์์๋ง ๋ฐ์ํฉ๋๋ค. ์์ ? ๋ด๊ฐ ํ ์ ์๋ ์ผ์ด ์์ต๋๊น?
@ danielo515 ์ ์ฒด ์๊ฐ ์์ผ๋ฉด ๋งํ๊ธฐ ์ด๋ ต์ต๋๋ค. List
๊ตฌ์ฑ ์์๋ ์ปจํ
์คํธ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ํด๋น ๊ฐ๋ ๋ณ๊ฒฝํ๋ฉด ๋ค์ ๋ ๋๋ง์ด ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
@eps1lon์ ์ดํดํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ปจํ ์คํธ์ ๋ณํ๊ฐ ์ด๋ป๊ฒ ์ผ์ด๋ ์ ์๋์ง ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น? ๋๋ ๋ชฉ๋ก ๊ตฌ์ฑ ์์์ ์๋ฌด ๊ฒ๋ ์ ๋ฌํ์ง ์๊ณ ๊ทธ ์์ ์์ด๋ฒ๋ฆฐ ์์์ ๋ ๋๋งํฉ๋๋ค.
@danielo515 ๊ธฐ๋ณธ์ ์ผ๋ก List
๋ ๋๋ง๋ ๋๋ง๋ค. ์๋ก์ด ์ปจํ
์คํธ API๋ ์ปจํ
์คํธ ๊ฐ์ ๋ฉ๋ชจํ์ฌ ํ์ํ ์ ์๋ ๋ช ๊ฐ์ง ์ต์ ํ ์ ๋ต์ ๊ฐ๋ฅํ๊ฒ ํ์ต๋๋ค.
ํ์ฌ ๋ฐ์ํ๋ ์ปจํ
์คํธ API๋ ๊ฐ์ด WRT๋ฅผ ์๊ฒฉํ ํ๋ฑ์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์๋น์์ ๋ํด ๋ค์ ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. List
์ ๋ํ ๋ชจ๋ ๋ ๋๋ง ํธ์ถ์์ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์๋น์๋ ๋ค์ ๋ ๋๋งํฉ๋๋ค.
๋ฐ๋ผ์ ์ง๊ธ์ ์ฝ๊ฒ ์ฑ๋ฅ ํฅ์์ ์ํด List
๋ฅผ ๋ํํ์ฌ ์์ฃผ ๋ค์ ๋ ๋๋งํ์ง ์์ต๋๋ค. ๋ฒค์น๋งํฌ๋ฅผ ๋จผ์ ์ํํ๊ฑฐ๋ ๋ ์ผ์ฐ ๋ ๋๋ง์ ์ค๋จํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ฐ๋ณต์ ์ธ ๋ ๋๋ง ํธ์ถ Typography
์ ๊ทธ๋ ๊ฒ ๋์์ง ์์ต๋๋ค.
React.memo
๊ตฌ์ฑ ์์๋ฅผ ๋ํํ๋ฉด ์์์ด ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ ์๋ํฉ๋๋ค. 3๊ฐ์ ExpansionPanel๊ณผ 14๊ฐ์ FormControl์ด ์๋ ์์์ด ์๋๋ฐ ๋ฐ์คํฌํ์์ ์ง์ฐ๋ฉ๋๋ค.
์ด๋ฌํ ์ฑ๋ฅ ๋ฌธ์ ์ ๋ํ ์๋ฃจ์ ์ด ์์ผ๋ฉด material-ui๋ฅผ ๊ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@prevostc ์๊ฐ ์์ผ๋ฉด ๋ฌด์์ด ์๋ชป๋์๋์ง ๋งํ๊ธฐ ์ด๋ ต์ต๋๋ค.
@prevostc codeandbox ์ฌ์์ฐ์ ๋ณด์ง ์๊ณ ์ด๊ฒ์ด์ด ๋ฌธ์ ์ ๊ด๋ จ์ด ์๋์ง ์ฐ๋ฆฌ๋ ๋น์ ๋ ์ ์ ์์ต๋๋ค.
@prevostc ์์์ ํ์๋ก ํ์ง ์๋ ์์ ๋ง์ ๊ตฌ์ฑ ์์๋ฅผ ๋ฉ๋ชจ ํ ์ ์์ต๋๋ค.
์ฆ, ๋ฐ์ดํฐ/์ด๋ฒคํธ ์ํ์ ์ฌ์ฉํ์ง๋ง ์์์ ์ฌ์ฉํ์ง ์๊ณ ๋จ์ผ ํ์ฅ ํจ๋์ ๋ ๋๋งํ๋ ์ญํ ์ ํ๋ ๊ณ ์ ํ ์์/memoed MyExpansionPanel
๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ญ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํด๋น <MyExpansionPanel ... />
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ํ์ฅ ํจ๋์ ๋ ๋๋งํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ค์ ๋ ๋๋ง์ ๋จ์ผ ํ์ฅ ํจ๋๋ก ์ ํ๋ฉ๋๋ค(๋๋ ๋ ํจ๋ ๊ฐ์ ์ ํํ ๋ ๋ ํจ๋).
@oliviertassinari @kof @dantman
๋ค์์ ๋ด ์ฑ๋ฅ ๋ฌธ์ ์ ์ฝ๋์๋๋ฐ์ค ์ฌ์์ฐ์
๋๋ค. https://codesandbox.io/s/yvv2y2zxxx
์ฌ์ฉ์ ์ ๋ ฅ์ ์ฝ๊ฐ์ ์ง์ฐ์ด ๋ฐ์ํ ์ ์๋ ~20๊ฐ์ ํ๋(์ผ๋ฐ์ ์ด์ง๋ ์์)๊ฐ ์๋ ์์์ ๋๋ค. ๋๋ฆฐ ์ฅ์น์์๋ ์ด ์์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฑ๋ฅ ๋ฌธ์ ๋ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ํ ๋๊ท๋ชจ ๋ค์ ๋ ๋๋ง์์ ๋ฐ์ํ์ง๋ง ์์ํ ๊ตฌ์ฑ ์์(React.memo)์ MUI ๊ตฌ์ฑ ์์๋ฅผ ๋ํํ๋ฉด ์ฌ๊ธฐ์ ์๋ ๋ชจ๋ ํญ๋ชฉ์ ์์๊ณผ ์์์ด ์์ผ๋ฏ๋ก ์๋ฌด ์์ ๋ ์ํํ์ง ์์ต๋๋ค. ์ด๋ AFAIK๋ฅผ ๋ค์ ๋ ๋๋งํด์ผ ํฉ๋๋ค(์ถ์ฒ: https:// reactjs.org/docs/react-api.html#reactpurecomponent)
์๋๋ ๋ด ์๋ ๋ฒค์น๋งํฌ์ ์ผ๋ถ ์คํฌ๋ฆฐ์ท์
๋๋ค. ํ๋๋ ์ต์ ํ๋์ง ์์ ๊ฒ, ํ๋๋ ๋ชจ๋ ๊ฒ์ ๋ฉ๋ชจํ ๊ฒ, ๋ค๋ฅธ ํ๋๋ ์ ์ฒด ์์์์ ์ํ๋ฅผ ๋๋ฌด ์์ฃผ ์ค์ ํ์ง ์๋๋ก ๋ก์ปฌ ์ํ์ ํจ๊ป ์ฌ์ฉ์ ์ง์ ์
๋ ฅ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
๊ฐ ๊ตฌ์ฑ์์ ์ฌ์ฉ์ ์
๋ ฅ ์กฐ์ ์ ์ฝ 60ms๊ฐ ๊ฑธ๋ฆฝ๋๋ค(60fps์์ ๋ ๋๋งํด์ผ ํ๋ 16ms๋ณด๋ค ํจ์ฌ ๋์ต๋๋ค.
๋๋ MUI๋ฅผ ์ฌ๋ํ๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ๋ญ๊ฐ ์๋ชปํ๋ค๋ ๊ฒ์ ๊ธฐ๊บผ์ด ์๊ฒ ๋ ๊ฒ์ด๊ณ ์ฌ์ด ์์ ์ด ์๋ค๋ฉด ์ฌํ ๊ฒ์ ๋๋ค. <3
@dantman React.ReactNode
๋ฅผ ์
๋ ฅ(์์ ๋๋ ์ํ)์ผ๋ก ์ฌ์ฉํ์ง ์๋ ExpansionPanel
๋ฅผ ์ด๋ป๊ฒ ์์ฑํ ์ ์์ต๋๊น? ๋ด ์ฑ์ ๋ชจ๋ ํจ๋์ ๋ํด ํน์ ๊ตฌ์ฑ ์์๋ฅผ ์์ฑํด์ผ ํ๋ค๋ ์๋ฏธ์ธ ๊ฒฝ์ฐ ๋ถํํ๋ ์ด๋ฌํ ๊ตฌ์ฑ ์์๊ฐ ๋๋ฌด ๋ง์ต๋๋ค.
@dantman
React.ReactNode
๋ฅผ ์ ๋ ฅ(์์ ๋๋ ์ํ)์ผ๋ก ์ฌ์ฉํ์ง ์๋ExpansionPanel
๋ฅผ ์ด๋ป๊ฒ ์์ฑํ ์ ์์ต๋๊น? ๋ด ์ฑ์ ๋ชจ๋ ํจ๋์ ๋ํด ํน์ ๊ตฌ์ฑ ์์๋ฅผ ์์ฑํด์ผ ํ๋ค๋ ์๋ฏธ์ธ ๊ฒฝ์ฐ ๋ถํํ๋ ์ด๋ฌํ ๊ตฌ์ฑ ์์๊ฐ ๋๋ฌด ๋ง์ต๋๋ค.
์, ๊น์ด ์ค์ฒฉ๋ ํจ๋ ํธ๋ฆฌ๋ก ํ๋์ ๊ฑฐ๋ํ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋๋ ๋์ ํ์ฅ ํจ๋ ์กฐ๊ฐ์ ๊ตฌ์ฑ ์์๋ก ๋ถ๋ฆฌํฉ๋๋ค. ๊ทธ๋ฐ ๊ฑฐ๋ํ ๋๋ฌด๋ฅผ ์ต์ ํํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๋ถ๊ฐ๋ฅํ์ง ์์ต๋๋ค. React ์ปดํฌ๋ํธ๋ ๋งค์ฐ ๊ฐ๋ณ์ต๋๋ค. ๋ฐฉ๋ํ ๊ตฌ์ฑ ์์์ ์ฝ๋ ๋ธ๋ก์ ๋ณต์ฌํ์ฌ ํจ์์ ๋ถ์ฌ๋ฃ์ผ๋ฉด ๊ฑฐ์ ์๋ฃ๋ฉ๋๋ค. ๊ทธ ๋ค์์๋ ์ํ์ ์ฐ๊ฒฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ธฐ๋ฅ์ ํ๊ณ props์ ์์ํ ์ต์ ํ๋ฅผ ๊นจ๋จ๋ฆฌ๋ ๊ฒ๋ค์ ์ ๋ฌํ์ง ์๋ ํ React.memo๋ ๋งค์ฐ ์ฝ๊ฒ ์ต์ ํ๋ฉ๋๋ค.
ํฐ ๊ตฌ์ฑ ์์์์ ์ฒญํฌ๋ฅผ ๋ถ๋ฆฌํ๊ธฐ ์ํด ์์ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ ๊ธฐ์ตํ์ญ์์ค. ์์ฒด ํ์ผ ๋ฐ ์์ฒด prop ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํตํด ๋ณต์กํ ํ์๋ ์์ต๋๋ค. propTypes ์์ด ์ฌ์ฉ๋๋ ๊ตฌ์ฑ ์์์ ๋์ผํ ํ์ผ์ ์๋ ๋จ์ ๊ธฐ๋ฅ ๊ตฌ์ฑ ์์์ผ ์ ์์ต๋๋ค. ์ฆ, ๋์ผํ ํ์ผ์ ๊ตฌ์ฑ ์์์์๋ง ์ฌ์ฉํ ์ ์๋ ์์ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์, Material UI๋ ๋ฎ์ ์์ค์ dom ์์๋ณด๋ค ์ฝ๊ฐ ๋๋ฆฝ๋๋ค. ๊ทธ๋ฌ๋ MUI Input
๊ฐ raw input
๋ณด๋ค 10๋ฐฐ ๋๋ฆฌ๊ณ 100 ์ดํ ๋๋ฌด ๋๋ ค์ก๋ค๊ณ ํด๋ MUI๊ฐ ์์ด๋ ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์๋ํ๋ฉด ๊ทธ๊ฒ์ด 10๋ฐฐ ๋ ๋น ๋ฅด๋๋ผ๋ raw input
๋ 1000๊ฐ๊ฐ ์๋ ๊ฒฝ์ฐ ์ฌ์ดํธ๋ฅผ ๋๊ฐ์ด ๋๋ฆฌ๊ฒ ๋ง๋ญ๋๋ค. MUI๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ์๋ React์์ ๋จ์ผ ๋ชจ๋๋ฆฌ์ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. React๊ฐ ์ต์ ํํ ์ ์๋ ๊ฒฝ๊ณ๋ฅผ ์ ์ํ ์ ์๋๋ก ์ฑ์ ์ ๋นํ ํฌ๊ธฐ์ ์ฒญํฌ๋ก ๋ถํ ํด์ผ ํฉ๋๋ค.
@prevostc ํ์ฅ ํจ๋์ ๋์ผํ ํ์ผ ๊ตฌ์ฑ ์์๋ก ๋ถํ ํ์ฌ ์ต์ ํํ ๋ฐ๋ชจ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ณด์๋ค์ํผ ์ ๋ ฅ์ด ์ ๋ฐ์ดํธ๋๋ฉด ํ๋์ ํ์ฅ ํจ๋๋ง ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค. ๊ด๋ จ ์๋ ํ์ฅ ํจ๋์ ๋ค์ ๋ ๋๋งํ๋ ๋ฐ ์๊ฐ์ด ๋ญ๋น๋์ง ์์ต๋๋ค. ์ํ๋ ๊ฒฝ์ฐ ์ ์ฌํ ํจํด์ ๊ณต์ ํ๋ ์ ๋ ฅ๊ณผ ์ ์ฌํ ์์ ์ ์ํํ ์๋ ์์ผ๋ฏ๋ก ๊ด๋ จ ์๋ ์ ๋ ฅ๋ ๋ค์ ๋ ๋๋ง๋์ง ์์ต๋๋ค.
์ด๊ฒ์ ๋จ์ง ์ข์ ์ต์ ํ ํจํด์ด ์๋๋ผ ์ข์ ์ฝ๋ฉ ํจํด์ด๋ผ๋ ์ ์ ์ฃผ๋ชฉํ๊ฒ ์ต๋๋ค. ์ค์ ์ฝ๋์์ ์
๋ ฅ ๋ฐฐ์ด์ ๋ง๋๋ ๊ฒ์ด ์๋๋ผ ์ ์๋ ์ด๋ฆ, ๋ ์ด๋ธ ๋ฐ ๋ชฉ์ ์ผ๋ก ์
๋ ฅ์ ๋ช
์์ ์ผ๋ก ์์ฑํฉ๋๋ค. ๊ฒฝ๊ณ์ ๋ฐ๋ณต ํจํด์ ์ฐพ๋ ๊ฒ์ ์ฌ๋ฌผ์ ์ต์ ํํ ๋ฟ๋ง ์๋๋ผ ์์ฉ๊ตฌ๋ฅผ ์ค์ฌ ์ฝ๋๋ฅผ ๋ ๊ฑด์กฐํ๊ณ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ์ฆ, InputWrapper
๋์ FormControl+InputLabel+FormHelperText+Input ์ฝค๋ณด๋ฅผ ์์ ๋ก์ปฌ SimpleTextInput ๊ตฌ์ฑ ์์๋ก ๋ถ๋ฆฌํ ๊ฒ์
๋๋ค. ์ด๋ ์ต์ ํ(๊ด๋ จ ์๋ ์
๋ ฅ์ด ๋ค์ ๋ ๋๋ง๋์ง ์์)ํ ๋ฟ๋ง ์๋๋ผ ์ฝ๋๊ฐ ์ถ๊ฐ ์์ฉ๊ตฌ๋ฅผ ๋ฐ๋ณตํ ํ์๊ฐ ์์์ ์๋ฏธํฉ๋๋ค.
์ด ๊ธ์ ์ฝ๊ณ ๋๋ mui๋ฅผ ์ต์ ํํ๊ธฐ ์ํด ๋ ์์ ํน์ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค๋ ๊ฒฐ๋ก ์ ๋๋ฌํ์ต๋๋ค. ๊ทธ๊ฒ์ ๋ด๊ฐ ์ด๋ฏธ ๊นจ๋ซ๊ณ ์ฑ๊ณต์ผ๋ก ์๋ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ปจํ ์คํธ api๊ฐ ๋ชจ๋ ์ ๋ ฅ props๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ ๋ชฉ๋ก ๊ตฌ์ฑ ์์๋ฅผ ์ต์ ํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ๋ ์ดํดํ์ต๋๋ค.
๋ฌธ์ ์ธ์ฌ
์ ์ฌ๊ธฐ ์ ๋ฐ์ดํธ๋ ์คํธ๋ ์ค ํ ์คํธ๊ฐ ์์ต๋๋ค. https://codesandbox.io/s/wz7yy1kvqk
์ด ์ผ๋ฐ์ ์ธ ์ ์์ @dantman ์ ๋์ํฉ๋๋ค. https://github.com/mui-org/material-ui/issues/10778#issuecomment -449153635 ํ์ง๋ง ์ด ์ ์ ์์ ๊ตฌ์ฑ ์์์์ ์ด๋ฌํ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์์ํ์ง๋ ์์์ง๋ง ์ฑ๋ฅ ๋ฌธ์ ์ ์์ธ์ ์ฐพ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด ์ค๋ ๋์ ์ด์ ์ฃผ์ ์ค ์ผ๋ถ๋ฅผ ์ฐธ์กฐํ์ฌ withStyles
๋ชจ๋ ํธ์ถ์ ์ ๊ฑฐํ๊ธฐ ์ํด ์คํธ๋ ์ค ํ
์คํธ์ ํ์ธ๋์ ์ถ๊ฐํ์ผ๋ฉฐ JSS๊ฐ ๋น ๋ฅด๋ฉฐ ์ฑ๋ฅ ๋ฌธ์ ์ ์์ธ์ด ์๋๋ผ๋ ๊ฒฐ๋ก ์ ๋๋ฌํ์ต๋๋ค. ( @kof ๊ฐ https://github.com/mui-org/material-ui/issues/10778#issuecomment-396609276์์ ์ง์ ํ๋ฏ์ด).
๋ด ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๊ฒฝ์ฐ ์ค์ ๋ก ํ๋์ ์
๋ ฅ๋ง ๋ณ๊ฒฝ๋์์์๋ ๋ถ๊ตฌํ๊ณ ์์ ์
๋ฐ์ดํธ ์ ๊ฐ ์์ ์
๋ ฅ์ด ๋ค์ ๋ ๋๋ง๋๋ค๋ ๋ฌธ์ ๋ฅผ ์ ํํ ์ง์ ํ ์ ์์์ต๋๋ค.
์๋ ์คํฌ๋ฆฐ์ท์์ FormControl๊ณผ Input์ ๋ฉ๋ชจํ๋ ๊ตฌ์ฑ ์์๋ก ๋ํํ์ฌ ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ ๋ ๋๋ง์ ๋ฐฉ์งํ์ต๋๋ค. @dantman์ ์ค์ ๋ก ๊ฐ ExpansionPanel
์ ๋ํด ํน์ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ค ๊ฒ์ ์ ์ํ์ง๋ง ์ด๊ฒ์ ๋ ์ผ๋ฐ์ ์ธ ์๋ฃจ์
์
๋๋ค. ์ฐธ๊ณ ๋ก ๊ฐ ํจ๋์ ์ฌ์ ํ โโ๋ค์ ๋ ๋๋ง๋๊ณ ์ฑ๋ฅ์ ์ต์ ๊ณผ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ์ง๋ง ์ง๊ธ์ ์ถฉ๋ถํฉ๋๋ค.
React.ReactNode
๊ตฌ์ฑ์ ํฌ๊ฒ ์์กดํ๋ ํ์ฌ API์ ๋ํ ๋๋์ ์ธ ๋ณ๊ฒฝ ์์ด material-ui ์ฝ๋ ๋ณ๊ฒฝ์ผ๋ก ์ด๋ฌํ ์ข
๋ฅ์ ๋ฌธ์ ๋ฅผ ํผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ https://github.com/mui-org/material-ui/issues/10778#issuecomment -449153635์์ @dantman์ด ์ธ๊ธํ๋ฏ์ด MUI๋ ์์๋ณด๋ค ์ฝ๊ฐ ๋๋ฆฝ๋๋ค. ์ด๊ฒ์ ์ ํ ๋ค๋ฃจ์ง ์๋ ๊ฒ์ IMHO์ ์ค์์
๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ธ์ํ๊ณ ์ฑ๋ฅ ๋ฌธ์ ๋ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ํ์ด์ง๋ฅผ ๋ง๋ค์ด์ผ ํ ์๋ ์์ต๋๋ค. ๊ทธ์ ํ์ด์ง๊ฐ ์ฃผ๋ก ๊ณต์ ๋ฌธ์(https://reactjs.org/docs/optimizing-performance.html)๋ก ๋ฆฌ๋๋ ์
๋๊ณ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ ๊ตฌ์ฑ ์์๋ฅผ ๋์ดํ๋๋ผ๋ ์์์
๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ฌ์ฉ์์๊ฒ console.warn์ ํ์ํ๋ ๊ฒ์ด ๋ ๋ซ์ง๋ง material-ui ์์ค์์ ๋ฌธ์ ๋ฅผ ๊ฐ์งํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๋ค.
@prevostc ์ด ๋ฉ์์ง๋ ๋ด ํ๋ฃจ๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ด๊ฒ์ ๋ด๊ฐ ์ฌ๋ํ๋ ์ปค๋ฎค๋ํฐ์ ์ข ๋ฅ์ ๋๋ค. ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ ์ฌ์ฉ์ ์์ญ ์ต์ ํ์ ํ์์ฑ์ ํผํ๊ธฐ ์ํด mui๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ์์ด๋์ด๊ฐ ์์ต๋๊น? API ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ ์ ์์ต๋๋ค.
๋๋ํ์ง ์์ต๋๋ค : s
๋๋ ํ์ฌ ์์ ์ฑ๋ฅ(API ๋ณ๊ฒฝ ์์ด)์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์ ๋งํผ MUI์ ๋ด๋ถ๋ฅผ ์์ง ๋ชปํฉ๋๋ค. ๋๋ ๋ช ๊ฐ์ง ์์ด๋์ด๋ฅผ ์ฐ๊ตฌํ๊ณ ์์ง๋ง ์ค๋ ๊ฒฐ์ ์ ์ธ ๊ฒ์ ์์ต๋๋ค. ๋ผ๋์ค ๊ทธ๋ฃน์ด ์ง์ ๋ถ๋ชจ๊ฐ ์๋ ๋ ๋ค์ ๋ ๋๋ง๋๋ ์ฑ์ด ์์ต๋๋ค. ์์ง ๋ก์ปฌ์์ ์ฌ์์ฑํ ์ ์์ต๋๋ค.
๋ชจ๋ API ๋ณ๊ฒฝ์ API์์ React.ReactNode
์ํ(์์ด ๋ฐ ์์ด์ฝ๊ณผ ๊ฐ์ ๊ธฐํ ์ํ) ์ ๊ฑฐ๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด์ง๋ง ๋์ผํ ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ์ ์ ์งํ๋ ์ข์ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์์ต๋๋ค.
๋ด๊ฐ ์๋ํ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. https://codesandbox.io/s/jpw36jw65 (๊ฒฝ๊ณ : ์๋ฃ๋์ง ์์).
๋ํ ๊ฐ๋ฐ ๋ชจ๋์์ ๋ฐ์์ด ํนํ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ ๋ชจ๋์์ MUI๊ฐ ํนํ ๋๋ฆฝ๋๋ค. ์ด๋ฅผ ๊ฐ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
Material-UI๊ฐ ํ์ฌ ์ง๋ฉดํ๊ณ ์๋ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ต์ ํํ๊ธฐ ์ํด ( @Bessonov๊ฐ ์ ์ํ ๊ฒ๊ณผ ๊ฐ์) ๊ธฐ๋ฅ ์ถ๊ฐ์ ์ง์ ์ด ์์ต๋๊น?
์ด ํ๋ฅญํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ๋ก์ ํธ์ ์ฌ์ฉํ๊ธฐ ์์ํ์ ๋ ํ๋ก์ ํธ๊ฐ ์ ์ ๋ ์ปค์ง ๋ ์ด๋ฌํ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ๊ฒ์ ๋ชฐ๋์ต๋๋ค. ๋ํ Material-UI ๋ฌธ์์์ Material-UI๊ฐ ๋๋ ค์ง๊ณ UX์ ํด๋ฅผ ๋ผ์น ์ ์๋ ๊ฒฝ์ฐ์ ๋ํด ์๋ ค์ฃผ๋ ์น์
์ ๋ณด์ง ๋ชปํ์ต๋๋ค.
Material-UI์ ์ง๊ฐ์ ์ ์ผ๋ก ๊ด๋ จ๋ ๋ง์ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์ด ๋ฌธ์ ์์ ๋ณด๊ณ ๋์์ต๋๋ค. ๋ชจ๋ ์ฌ๋์ด ์งํ ์ํฉ์ ์ถ์ ํ ์ ์๋๋ก ๋ค๋ฅธ ๋ฌธ์ ์ ๋์ดํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ด์ฐฎ๋ค๊ณ ์๊ฐํ์๋ฉด ์ ๋ฌธ์ ๋ฅผ ์ด โโ์ ์์ต๋๋ค.
@mkermani144 Material-UI๊ฐ ์๋ชปํ๊ณ ์๋ ๊ฒ๊ณผ ์ง์ ์ ์ธ ์๊ด๊ด๊ณ๊ฐ ์๋ ์ฑ๋ฅ ๋ณด๊ณ ์๋ฅผ ์์ง ๋ณด์ง ๋ชปํ์ต๋๋ค. ์ง๊ธ๊น์ง ์ด ๋ฌธ์ ๋ ์ด๋ ค์์ ๊ฒช๊ณ ์๋ ์ฌ๋๋ค์ ์ํ ๋์๋ง ํฌ๋ผ์ผ๋ก ์ฌ์ฉ๋์์ต๋๋ค. ๋ณด๊ณ ๋ ์กฐ์น ์ฌํญ์ด ์์์ ํ์ธํฉ๋๊น? React ์ถ์ํ์๋ ๋น์ฉ์ด ์์ต๋๋ค. ํธ์คํธ๋ฅผ ๋ํํ๋ ๊ฐ ๊ตฌ์ฑ ์์๋ ๋ ๋ ํธ๋ฆฌ์ ๊ฐ์ค์น๋ฅผ ์ถ๊ฐํ์ฌ ์๋๋ฅผ ๋ฆ์ถฅ๋๋ค. ๋ค์ดํฐ๋ธ ํธ์คํธ๋ก 100๊ฐ ์ด์์ ๋ชฉ๋ก ํญ๋ชฉ์ ๋ ๋๋งํ ์ ์์ง๋ง ํด๋์ค ๊ตฌ์ฑ ์์๋ก ๋ํํ๋ฉด ๋ฌธ์ ๊ฐ ์์๋ฉ๋๋ค. Material-UI์๋ง ๊ตญํ๋์ง ์์ต๋๋ค.
ํ ์ด๋ธ์ ์๋ฅผ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค. ์ฌ๋๋ค์ด ๋๋ฆฌ๊ฒ ์ฐพ๋ ๊ตฌ์ฑ ์์์ ๋๋ค. ๊ฐ์ํ๋ฅผ ๋ฌธ์ํํ์ผ๋ฉฐ ๋ง์ ๋์์ด ๋ฉ๋๋ค.
๋ค์ ํ ์คํธ ์ฌ๋ก์์๋ ๊ฐ๋ฐ ๋ชจ๋์์ 100๊ฐ์ ํญ๋ชฉ์ ๋ ๋๋งํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ํธ์คํธ ์์์ ๋ํด ๊ฐ๋ฐ ๋ชจ๋์์ Material-UI๋ฅผ ์ฌ์ฉํ๋ ์ค๋ฒํค๋๋ ์ฝ x4์ ๋๋ค(์์ฐ์์๋ ์ฐจ์ด๊ฐ ๋ ์์ต๋๋ค!). ๋จ์ํ ์ค๊ฐ ๊ตฌ์ฑ ์์๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๊ฒ์ด ~100๊ฐ์ ํ ์ด๋ธ ํญ๋ชฉ ๋ชฉ๋ก์ ๋ ๋๋งํ ํ ๊ฐ์ํ๊ฐ ์ค์ํ๊ธฐ ์์ํ๋ ์ด์ ์ ๋๋ค. ์ด์ ์ฐ๋ฆฌ๋ ์ ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋ํด ๋ฌด์์ ํ ์ ์๋์ง์ ๋ํด ์กฐ๊ธ ๋ ๊น์ด ํ๊ณ ๋ค
๋ฐ๋ผ์ ํ ๊ฐ์ง ํ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ชจ๋ ๊ตฌ์ฑ ์์๋ฅผ withStyles์์ makeStyles๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๊ฒ์ ๋๋ค. ๊ฐ๋ฐ ๋ชจ๋์์ ์ฝ +30%์ ์ฑ๋ฅ(262 / (262 - 70))์ ์ป์ ์ ์์ต๋๋ค.
ํ๋ก๋์ ๋ชจ๋์์ ๋์ผํ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์คํํ์ต๋๋ค.
๋ฐ๋ผ์ withStyles
์์ makeStyles
๋ก์ ๋ง์ด๊ทธ๋ ์ด์
์ ํ๋ก๋์
๋ชจ๋์์ ์ด๋ก ์ ์ฌ์ ํ +30% ์๋ ํฅ์์
๋๋ค.
๊ด์ฐฎ๋ค๊ณ ์๊ฐํ์๋ฉด ์ ๋ฌธ์ ๋ฅผ ์ด โโ์ ์์ต๋๋ค.
@ mkermani144 Material-UI๊ฐ ์๋ชปํ๊ณ ์๋ ํน์ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ฉด ํ์คํฉ๋๋ค.
์ด ๋ฌธ์ ์๋์ ์๋ ๋ชจ๋ ๋๊ธ์ ๋ํด ์ฝ์์ต๋๋ค. ๋ด ๋ฌธ์ ๋ ์์์ ์ธ๊ธํ ๋ค๋ฅธ ๋ฌธ์ ์ ๋ง์ง ์์ต๋๋ค.
List
๊ตฌ์ฑ ์์์ ListItem
์ค ํ๋๊ฐ ์ ํ๋์ด ๊ฐ์กฐ ํ์๋์ด ์์ต๋๋ค. ๋ค๋ฅธ ListItem
๋ฅผ ํด๋ฆญํ์ฌ ์ ํํ๊ณ ๊ฐ์กฐ ํ์ํ๋ฉด ์ ์ฒด ๋ชฉ๋ก(์์ ํฌํจ)์ด ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค.
์ด ๋ฌธ์ ๊ฐ ์ด์ ์๊ฒฌ ๊ณผ ์ ํํ ๋์ผํ๊ฒ ๋ณด์ผ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค. ์ ์ด๋ ๋๋ ๊ทธ๋ ๊ฒ ์๊ฐํ๋ค.
React ํ๋กํ์ผ๋ฌ์ ๊ฒฐ๊ณผ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ณด์๋ค์ํผ ์ด๋ฏธ์ง์ ์ต์์ ์์ค์ MyList
๊ตฌ์ฑ ์์๊ฐ ์์ต๋๋ค. ์ด ๊ตฌ์ฑ ์์๋ MUI List
๋ํ ๋ํผ์ผ ๋ฟ์ด๋ฉฐ ์์ํ๊ฒ ๋ง๋ญ๋๋ค.
class MyList extends React.PureComponent {
render() {
return (
<List>
{this.props.children}
</List>
);
}
}
๊ทธ์ ์๊ฒฌ ์ค ํ๋ ์์ @eps1lon ์ด List
๋ฅผ ๋ค์ ๋ ๋๋งํ๋ฉด ์ปจํ
์คํธ๊ฐ ์
๋ฐ์ดํธ๋๊ณ ์ด ์ปจํ
์คํธ ์
๋ฐ์ดํธ๊ฐ ๋ชจ๋ ์๋น์( ListItem
ํฌํจ)๋ ๋ค์ ๋ ๋๋งํ๋ค๊ณ ์ธ๊ธํ๊ธฐ ๋๋ฌธ์ ์ด ๋ํผ๋ฅผ ์ถ๊ฐ ํ์ต๋๋ค. .
๋ํ ๋ชจ๋ ListItem
์์ํ๊ฒ ๋ง๋ค๊ณ ์ฑ์ ๋ค์ ํ๋กํ์ผ๋งํ์ต๋๋ค. ๋ด ์ฌ์ฉ์ ์ง์ ๊ตฌ์ฑ ์์(์: MyListItem
)๊ฐ _itself_๋ฅผ ๋ค์ ๋ ๋๋งํ์ง ์์์ง๋ง ๊ทธ ์๋์ ๋ชจ๋ ์์์ด __did__ํ ๊ฒ์ ์ ์ธํ๊ณ ๊ฒฐ๊ณผ๋ ๋์ผํ์ต๋๋ค.
MUI๊ฐ ์คํ์ผ์ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉํ๋ ์ปจํ ์คํธ๊ฐ _somehow_๋ฅผ ๋ค์ ๋ ๋๋งํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์ด๋ฌํ ์ฌ๋ ๋๋ง์ด ๋ฐ์ํ๊ณ ์ด๋ป๊ฒ ํผํ ์ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์๋๋ฉด ๋ด๊ฐ ๋ญ๊ฐ ์๋ชปํ๊ณ ์์ต๋๊น?
์ฐธ๊ณ : ์ ๋ MUI ์๋ก์ด(์ํ) ์คํ์ผ๋ง ์๋ฃจ์
, ์ฆ @material-ui/styles
ํฉ๋๋ค. ์ด๊ฒ ์ค์ํ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@mkermani144 ๊ธฐ๋ณธ ์์๊ฐ ์๋ Material-UI๋ฅผ ์ ๊ฑฐํ๊ณ ๋ค์ ๋ ๋๋ง์ด ์ฌ์ ํ ์กด์ฌํ๋์ง ๊ด์ฐฐํ์ญ์์ค. ์์ํ ๋ ผ๋ฆฌ๋ ์ด๋ฐ ์์ผ๋ก ๋์์ด ๋์ง ์์ต๋๋ค. React.createElement๋ ๊ฐ ๋ ๋๋ง์์ ์ ์ฐธ์กฐ๋ฅผ ์์ฑํ๊ณ PureComponent๋ฅผ ๋ฌดํจํํฉ๋๋ค.
์, ์์๊ฐ ๊ฐ์ฒด์ด๊ณ ๊ฐ์ฒด๊ฐ Javascript์์ ์๊ฒฉํ๊ฒ ๋์ผํ์ง ์๋ค๋ ๊ฒ์ ์๊ณ ์์ผ๋ฏ๋ก sCU
๊ฐ ์คํจํฉ๋๋ค.
ํ์ง๋ง React.createElement
๊ฐ ๋ค์ ํธ์ถ๋๋ค๋ ๊ฒ์ ๋ฌด์จ ๋ง์ธ์ง ์ดํด๊ฐ ๋์ง ์์ต๋๋ค. createElement
ํธ์ถ List
๋ด๋ถ์ ํธ์ถ์ ์๋ฏธํ๋ ๊ฒฝ์ฐ ๋ค์ ๋ ๋๋ง๋๋ ๊ฒฝ์ฐ์๋ง ์์( ListItem
)์ ๋ํด createElement
๋ฅผ ํธ์ถํฉ๋๋ค. ๋ค์ ๋ ๋๋ง๋์ง ์์ผ๋ฉด createElement
๊ฐ ํธ์ถ๋์ง ์๊ณ ๋ค์ ๋ ๋๋ง๋์ง ์์ต๋๋ค. ๋ฌธ์ ๋ List
์์ฒด๊ฐ ๋ค์ ๋ ๋๋ง๋๋ค๋ ๊ฒ์
๋๋ค.
@mkermani144 ์ต์ํ์ ์ฌํ ์์ ๋ฅผ ๋ง๋ค ์ ์๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ ๋ณผ ์ ์์ต๋๋ค.
MyList
(๋ฐ๋ผ์ List
)๋ MyList
( MyComponent
๋ผ๊ณ ๋ถ๋ฅผ ์ ์์)๋ฅผ ๋ ๋๋งํ๋ ๊ตฌ์ฑ ์์๊ฐ ๋ค์ ๋ ๋๋ง๋๊ธฐ ๋๋ฌธ์ ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค. MyList
PureComponent๋ MyComponent
๊ฐ ๋ค์ ๋ ๋๋ง๋๊ณ MyList
๋ํ ์ ์์์ด ์์ฑ๋์ด MyList
๊ฒ์ฌ๊ฐ ์คํจํ๋ฏ๋ก ๋์์ด ๋์ง ์์ต๋๋ค.
MyComponent
์๋ง๋ ์ ํ๋ ํญ๋ชฉ์ ์ํ๋ฅผ ์ ์ฅํ๋ ๊ณณ์ด ์๊ธฐ ๋๋ฌธ์ ๋ค์ ๋ ๋๋ง๋ ๊ฒ์
๋๋ค.
List์ MUI ๊ตฌํ์ ๊ฐ ๋ ๋๋ง๋ง๋ค List ์ปจํ
์คํธ ๊ฐ์ ๋ค์ ์์ฑํ์ง ์๋๋ก ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฌ๊ธฐ: https://github.com/mui-org/material-ui/blob/fb4889f42613b05220c49f8fc361451066989328/packages/material-ui/src/List/List.js#L57
๋์ List๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ด๋๋ก ํ์ญ์์ค.
const List = React.forwardRef(function List(props, ref) {
const {
children,
classes,
className,
component: Component,
dense,
disablePadding,
subheader,
...other
} = props;
const context = React.useMemo(() => ({ dense }), [dense]);
return (
<Component
className={clsx(
classes.root,
{
[classes.dense]: dense && !disablePadding,
[classes.padding]: !disablePadding,
[classes.subheader]: subheader,
},
className,
)}
ref={ref}
{...other}
>
<ListContext.Provider value={context}>
{subheader}
{children}
</ListContext.Provider>
</Component>
);
});
๊ทธ๋ฌ๋ฉด ListItems์ sCU
๋ฒ์ ์ ๊ฐ๋จํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
MyList๋ฅผ ๋ ๋๋งํ๋ ๊ตฌ์ฑ ์์(MyComponent๋ผ๊ณ ๋ถ๋ฅผ ์ ์์)๊ฐ ๋ค์ ๋ ๋๋ง๋๊ธฐ ๋๋ฌธ์ MyList(๋ฐ ๋ฐ๋ผ์ List)๊ฐ ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค. MyList์ PureComponent๋ MyComponent๊ฐ ๋ค์ ๋ ๋๋ง๋๊ณ MyList์ ๋ํ ์ ์์์ด ์์ฑ๋์ด MyLists ๊ฒ์ฌ๊ฐ ์คํจํ๋ฏ๋ก ๋์์ด ๋์ง ์์ต๋๋ค.
@Pajn ์๋์, ๋ด React ํ๋กํ์ผ๋ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ธ์. MyList
๋ ๋ค์ ๋ ๋๋งํ์ง ์์์ง๋ง(ํ์) List
๋ ๋ค์ ๋ ๋๋งํ์ต๋๋ค(ํ๋์). ๋๋ PureComponent
๋ํด MyList
PureComponent
๋ฅผ ์ง์ํ์ง ์์ต๋๋ค. ์ฌ์ง์ด ๊ตฌํ ๋ด๊ฐ ๋น๋ก sCU
์ํด MyList
๊ทธ๋์ ๋ ๋๋ง์ ๋ค์ํ์ง ์๋, List
__does ๋ค์ render__์.
@oliviertassinari
๋๋ ์ต์ํ์ ์ฌ์์ฐ ์์ ๋ฅผ ๋ง๋ค์์ต๋๋ค.
import React, { Component } from 'react';
import StylesProvider from '@material-ui/styles/StylesProvider';
import ThemeProvider from '@material-ui/styles/ThemeProvider';
import { createMuiTheme } from '@material-ui/core';
import List from '@material-ui/core/List';
import ListItem from '@material-ui/core/ListItem';
const theme = createMuiTheme({});
const MyListItem = React.memo(ListItem, (prev, next) => prev.selected === next.selected);
class App extends Component {
state = {
selected: null,
}
render() {
return (
<StylesProvider>
<ThemeProvider theme={theme}>
<List>
{[0, 1, 2, 3, 4].map(el => (
<MyListItem
button
selected={el === this.state.selected}
onClick={() => this.setState({ selected: el })}
>
{el}
</MyListItem>
))}
</List>
</ThemeProvider>
</StylesProvider>
);
}
}
export default App;
๋ฐ์ ํ๋กํ์ผ๋ฌ ๊ฒฐ๊ณผ(4๋ฒ์งธ ๋ชฉ๋ก ํญ๋ชฉ ํด๋ฆญ ํ):
๋ณด์๋ค์ํผ ์์๋๋ก ์๋ํฉ๋๋ค. ์ฆ, ์ถ๊ฐ ์ฌ๋ ๋๋ง์ด ์์ต๋๋ค( ListItem
๋ด๋ถ์ ButtonBase
๊ตฌ์ฑ ์์ ์ ์ธ). ๋ฌธ์ ๋ ์ด ์ฌ์์ฐ์ด _๋๋ฌด ๋ฏธ๋ฏธํ๋ค๋ ๊ฒ์
๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๊ฑด๋ ๋ฐ๋ ๋ง์ ๊ฒ๋ค์ด ์์ต๋๋ค.
์ถ๊ฐ ์ฌ๋ ๋๋ง์ ์ ๋ฐํ๋ ๋ด ์ฝ๋์ ๋ฌด์์ด ๋ฌธ์ ์ธ์ง ๋งํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ํ์ง๋ง ํ ๊ฐ์ง ์ง๋ฌธ์ ๋๋ฆฌ๊ฒ ์ต๋๋ค. MUI ๊ตฌ์ฑ ์์๋ฅผ ๋ํํ๋ WithStylesInner
๊ตฌ์ฑ ์์์์ ๋ค์ ๋ ๋๋ง๋๋ ์์ธ์ ๋ฌด์์
๋๊น?
@mkermani144 ์ด ์์ ์ฌํญ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์๋์?
--- a/packages/material-ui/src/List/List.js
+++ b/packages/material-ui/src/List/List.js
@@ -40,6 +40,13 @@ const List = React.forwardRef(function List(props, ref) {
...other
} = props;
+ const context = React.useMemo(
+ () => ({
+ dense,
+ }),
+ [dense],
+ );
+
return (
<Component
className={clsx(
@@ -54,7 +61,7 @@ const List = React.forwardRef(function List(props, ref) {
ref={ref}
{...other}
>
- <ListContext.Provider value={{ dense }}>
+ <ListContext.Provider value={context}>
{subheader}
{children}
</ListContext.Provider>
ํ ๋ฆฌํ์คํธ๋ฅผ ์ ์ถํ์๊ฒ ์ต๋๊น? :) ์ฐ๋ฆฌ๋ Table ๊ตฌ์ฑ ์์์ ๋์ผํ ์ ๋ต์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ ์๋ํฉ๋๋ค. ๋ฌธ์ ๋ฅผ ์ ๊ณ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
@oliviertassinari ๋ฌผ๋ก ์ ๋๋ค. ์ด๊ฒ์ ์ ํํ @Pajn ์ด ์ด์ ์ ์ ์ํ ๊ฒ์ ๋๋ค. PR์ ์ ์ถํ์ต๋๋ค.
List
๊ตฌ์ฑ ์์๋ ์๋ฌด๋ฆฌ ์ต์ ํํ๋๋ผ๋ ์ถฉ๋ถํ ํฌ๋ฉด ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ด ๋ ์ ์์ต๋๋ค. Table
๋ฌธ์์ ์๋ ๊ฒ๊ณผ ๊ฐ์ด List
๊ตฌ์ฑ์์์ ํจ๊ป react-window
๋๋ react-virtualized
์ฌ์ฉ์ ๋ณด์ฌ์ฃผ๋ ์๋ฅผ ์ ๊ณตํด์ผ ํ์ง ์์ต๋๊น?์ฐ๋ฆฌ๊ฐ Table ๋ฌธ์์ ์๋ ๊ฒ๊ณผ ๊ฐ์ด List ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ฌ react-window ๋๋ react-virtualized์ ์ฌ์ฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋ ์์ ๋ฅผ ์ ๊ณตํด์ผ ํ์ง ์์ต๋๊น?
๋๋จํ๋ค์ :+1:
Fwiw ์ฑํ
์ฑ์ ๋ง๋ค์๊ณ ์ฑ์์ ๋ง์ ์ฐ๋ฝ์ฒ ๋ชฉ๋ก์ ๋ ๋๋งํด์ผ ํฉ๋๋ค. ๋๋ ๊ฐ์ ๋ฌธ์ ์ ๋ถ๋ช์ณค๋ค.
@mkermani144 ๊ฐ ์์์ต๋๋ค.
@henrylearn2rock ๊ฐ์ํ ์ฌ์ฉ์ ๊ณ ๋ คํด ๋ณด์ จ์ต๋๊น? ๋ชฉ๋ก์ ๋ํ ๋ฐ๋ชจ๋ฅผ ์ถ๊ฐํ์ต๋๋ค: https://next.material-ui.com/demos/lists/#virtualized -list.
์ด๊ฒ์ ๋ํ ๋๋ฅผ ์ ๋ง๋ก ๋์ด๋จ๋ ธ๋ค. ๋๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค(์ ๋ฅผ ํฌํจํ์ฌ)์ด ์์ ๊ตฌ์ฑ์์ ์๋์ ๋ชจ๋ ๊ฒ์ด ์ฌ๋ ๋๋ง์ผ๋ก๋ถํฐ ์์ ํ๋ค๊ณ ๊ฐ์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ ๋ถ๋ช ํ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ์ฐ๊ฐ ์๋๋๋ค. ๊ฐ์ฅ ์ต๊ทผ์ ์ ์ํ ๋๋ก ๊ฐ์ํ๋ฅผ ์๋ํด ๋ณด๊ฒ ์ต๋๋ค. ๊ฐ์ฌ ํด์!
๋๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค(์ ๋ฅผ ํฌํจํ์ฌ)์ด ์์ ๊ตฌ์ฑ์์ ์๋์ ๋ชจ๋ ๊ฒ์ด ์ฌ๋ ๋๋ง์ผ๋ก๋ถํฐ ์์ ํ๋ค๊ณ ๊ฐ์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ ๋ถ๋ช ํ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ์ฐ๊ฐ ์๋๋๋ค.
์ด๊ฒ์ React.PureComponent ๋๋ React.memo๊ฐ ์๋ํ๋ ๋ฐฉ์์ด ์๋๋๋ค. ๊ตฌ์ฑ ์์ ์์ฒด์๋ง ์ํฅ์ ์ค๋๋ค. ์ปจํ ์คํธ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ด๋ฆฐ์ด๋ ์ฌ์ ํ ๋ค์ ๋ ๋๋งํด์ผ ํ ์ ์์ต๋๋ค.
@pytyl PureComponent ๋ฅผ ์ฌ์ฉํ๊ณ ํ์ ํธ๋ฆฌ์์ ๋ค์ ๋ ๋๋ง๋๋ ๊ฒ์ ๋ฐฉ์งํ ๊ฒ์ผ๋ก ์์ํ ์ฝ๋๋ฅผ ๊ณต์ ํ ์ ์์ต๋๊น?
@eps1lon ๋ค์ ๋ฌธ์๋
https://reactjs.org/docs/optimizing-performance.html#shouldcomponentupdate-in-action
shouldComponentUpdate๊ฐ C2๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ํ์ ํธ๋ฆฌ์ ๋ํด false๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ React๋ C2๋ฅผ ๋ ๋๋งํ๋ ค๊ณ ์๋ํ์ง ์์์ผ๋ฏ๋ก C4 ๋ฐ C5์์ shouldComponentUpdate๋ฅผ ํธ์ถํ ํ์์กฐ์ฐจ ์์์ต๋๋ค.
๋ด๊ฐ ์ด๊ฒ์ ์๋ชป ์๊ณ ์๋ ๊ฒ์ ์๋๊น? ๋ค์์ ๋ด ํ๋กํ์ผ๋ฌ์ ์ค๋ ์ท์ ๋๋ค. ํ ์คํธ๋ฅผ ์ํด ๋ฉ๋ด ๊ตฌ์ฑ ์์์ shouldComponentUpdate์ ๋ํด ๋ช ์์ ์ผ๋ก false๋ฅผ ๋ฐํํฉ๋๋ค.
์ด๋ก ์ธํด ๋ชจ๋ ์์ ๊ตฌ์ฑ ์์(Categories, Category, CategoryItems, CategoryItem)๊ฐ ๋ค์ ๋ ๋๋ง๋์ง ์์์ต๋๋ค. ๋ง์ MUI ๊ด๋ จ ์ฌํญ์ด ํ๋จ์์ ๋ค์ ๋ ๋๋ง๋์ด ๋ง์ ์ง์ฐ์ ์ผ์ผํค๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. withStyles, Typography, ButtonBase์ ๊ฐ์ ๊ฒ๋ค. React๋ ์์ง ์กฐ๊ธ ์์ํ๋ฏ๋ก ์ ์ ๋ฌด์ง๋ฅผ ์ฉ์ํด ์ฃผ์ญ์์ค. ๋ค์์ ๋ฉ๋ด ๊ตฌ์ฑ ์์์ ๋ํ ์ฝ๋์ ๋๋ค(์ฌ๊ธฐ์ shouldComponentUpdate์ ๋ํด false๋ฅผ ๋ฐํํจ).
import React, { Component } from "react";
import Categories from "./Categories";
import { withStyles, Paper } from "@material-ui/core";
const styles = theme => ({
root: {
paddingTop: 0,
marginLeft: theme.spacing.unit * 2,
marginRight: theme.spacing.unit * 2,
marginTop: theme.spacing.unit * 1
}
});
class Menu extends Component {
shouldComponentUpdate(nextProps, nextState) {
if (nextProps.categories.length == this.props.categories.length) {
return false;
}
return true;
}
render() {
const { classes, categories } = this.props;
return (
<Paper className={classes.root}>
<Categories categories={categories} />
</Paper>
);
}
}
export default withStyles(styles)(Menu);
๋ฌธ์ ๋ฅผ ์ดํดํ๋ ค๋ฉด ์ ์ฒด ์ฝ๋ ์๋๋ฐ์ค๊ฐ ํ์ํฉ๋๋ค.
@eps1lon ๋ด์ผ ์ ์ํด
@eps1lon ์ ์ฝ๋ํ์
๋๋ค.
https://codesandbox.io/s/348kwwymj5
๊ฐ๋จํ ์ค๋ช
์๋น์ ์ํ ๊ธฐ๋ณธ ๋ฉ๋ด ์ฑ์
๋๋ค(์ข
์ข
100๊ฐ ์ด์์ ๋ฉ๋ด ํญ๋ชฉ์ด ์์). ์ฌ์ฉ์๊ฐ ๋ฉ๋ด ํญ๋ชฉ์ ํด๋ฆญํ๋ฉด "์ฃผ๋ฌธ์ ์ถ๊ฐ" ๋ํ ์์๊ฐ ์ด๋ฆฝ๋๋ค. ํ๋กํ์ผ๋ฌ๊ฐ ์ฑ๋ฅ์ด ์ข์ง ์์ ๋ช ๊ฐ์ง ์ํฉ์ ์ฒจ๋ถํ๊ฒ ์ต๋๋ค(์ด ํต๊ณ๋ ํ๋ก๋์
๋น๋์ ์์).
์ฒด๊ณ
MacBook Pro(Retina, 13ํ, 2015๋
์ด)
3.1GHz ์ธํ
์ฝ์ด i7
ํ์ด์ดํญ์ค 66.0.3
์ฌ๋ก 1(์ฌ์ฉ์๊ฐ ๋ฉ๋ด ํญ๋ชฉ์ ํด๋ฆญํจ)
๋ ๋๋ง ์๊ฐ: 218ms
์ฌ๋ก 2(์ฌ์ฉ์๊ฐ ๋ํ ์์์์ ์ฃผ๋ฌธ์ ์ถ๊ฐ ๋ฒํผ ํด๋ฆญ)
๋ ๋๋ง ์๊ฐ: 356ms
๋๋ ์ฌ๊ธฐ์์ ์ด๋ณด์ ์ค์๋ฅผํ๊ณ ์๋ค๊ณ ํ์ ํ๋ฏ๋ก ์ด๋ค ์ง์นจ์ด๋ผ๋ ํฌ๊ฒ ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
WithStyles(ButtonBase)๊ฐ ๋ค์ ๋ ๋๋ง๋จ์ ๋ฐ๋ผ WithStyles๋ ํ์ํ์ง ์๋๋ผ๋ ๋ค์ ์์ฑ๋๋ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๋๋ ์ด๊ฒ์ ์ฐพ์ ์ ์์๋ค https://github.com/mui-org/material-ui/blob/048c9ced0258f38aa38d95d9f1cfa4c7b993a6a5/packages/material-ui-styles/src/StylesProvider/StylesProvider.js#L38 ๊ทธ๋ฌ๋ ์ฅ์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค StylesProvider๋ ์ค์ ์ฝ๋์์ ์ฌ์ฉ๋์ง๋ง(GitHubs ๊ฒ์์ ๊ทธ๋ค์ง ์ข์ง ์์) ์ด์ ๊ฐ ๋ ์ ์์ต๋๋ค.
@eps1lon ์ ์ด๊ฒ์ด ์์ธ์ผ ์ ์๋์ง ์๊ณ ์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ปจํ ์คํธ ๊ฐ์ฒด์ useMemo๊ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ ๋๋ค. localOptions๊ฐ ์์ ์ ์ธ์ง ๋๋ useMemo๋ฅผ ๋ ์ ํํด์ผ ํ๋์ง ์ฌ๋ถ๋ ์ ์ ์์ต๋๋ค.
์๋ง๋. ๊ทธ๋ฌ๋ ๋จผ์ StylesProvider๋ฅผ ์ฌ์ฉํ๋ ๊ตฌ์ฑ ์์๊ฐ ๋ค์ ๋ ๋๋ง๋๋ ์ด์ ๋ฅผ ์กฐ์ฌํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ํธ๋ฆฌ ์๋จ์ ์๊ฑฐ๋ ์ผ๋ถ UI ๊ฒฝ๊ณ์ ์์ด์ผ ํฉ๋๋ค. ๋ ๊ฒฝ์ฐ ๋ชจ๋ ๊ฑฐ์ ๋ค์ ๋ ๋๋ง๋์ง ์์์ผ ํฉ๋๋ค. ๋ฐ์ ์ปจํ ์คํธ๋ ์ด์จ๋ ๋น๋ฒํ ์ ๋ฐ์ดํธ์ ์ต์ ํ๋์ด ์์ง ์๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค.
๋ ๋๋งํ๋ ๋์ ์ผ๋ถ ๊ฐ์ฒด๊ฐ ๋ค์ ์์ฑ๋๋ค๋ ์ด์ ๋ก ์ด๋ฌํ ๊ฒ๋ค์ ์ฑ๊ธํ๊ฒ ์ต์ ํํด์๋ ์ ๋ฉ๋๋ค. ๋ฉ๋ชจ์ด์ ์ด์ ์ ์์ด์์ด ์๋๋๋ค. ๊ทธ๋์ ๊ตฌ์ฒด์ ์ธ ์๊ฐ ์์ผ๋ฉด ๋ง์ ๊ฒ์ ํ ์ ์์ต๋๋ค. ์, ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค. ๋๋ก๋ ๋ ์์ฃผ ํ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ญ๋น๋ ์ฌ๋ ๋๋ง์ด ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์์ธ์์ ์๋ฏธํ์ง๋ ์์ต๋๋ค.
@pytyl ๊ทํ์ ์ฝ๋ ์๋๋ฐ์ค๋ฅผ ์ดํด๋ณด์๋๋ฐ ๋ ๋๋ง ์ํคํ ์ฒ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ฉ๋ด ํญ๋ชฉ์ ํด๋ฆญํ๋ฉด ๋ชจ๋ ๊ฒ์ ๋ค์ ๋ ๋๋งํฉ๋๋ค. GlobalContext๋ ์์ ๋ ผ๋ฆฌ๋ฅผ ์ ํํฉ๋๋ค.
@eps1lon ์ด ๋ฌธ์ ๋ฅผ ๋ซ์์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก ํ์ธ๋ ๋ฌธ์ ์ ์ด์ ์ ๋ง์ถ๋ ๊ฒ์ด ์ข์ต๋๋ค.
TL;DR: ์ปจํ ์คํธ ์ฌ๋ผ์ด์ค ์์ฑ, ์ปจํ ์คํธ ๊ฐ ๋ฉ๋ชจ, ํนํ material-ui์ ๋ฌธ์ ์์: https://codesandbox.io/s/8lx6vk2978
๋ช ๊ฐ์ง ํ๊ณ ๋ค์๊ณ ๋ฌธ์ ๋ ๋ ๋๋ง ์ค์ ๋ค์ ์์ฑ๋๋์ด ํฐ ๊ธ๋ก๋ฒ ์ปจํ ์คํธ๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ ์ญ ์ปจํ ์คํธ๊ฐ ๋ค์ ์์ฑ๋๋ ์ง์ ์ ํด๋ฆญํ๋ฉด ์ฑ์ ๋ค์ ๋ ๋๋งํฉ๋๋ค. ๊ทํ์ CategoryItem์ ๊ทํ์ ์ฑ์ 100๋ฒ ๋ํ๋๋ ๊ทธ๊ฒ์ ๋ฃ๊ณ ์์ต๋๋ค. 100๊ฐ์ material-ui MenuItem์ด ์์ผ๋ฏ๋ก ์์ฒ ์ปท์ผ๋ก ๊ณ ์ ์ ์ธ ์ฃฝ์์ ๋ง์ดํ๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์์ด๋ฌ๋ํ๊ฒ๋ ์๋ฃจ์ ์ ์ผ๋ถ๋ ์ปจํ ์คํธ ๊ฐ์ ๋ฉ๋ชจํ๋ ๊ฒ์ด์ง๋ง ์ค์ํ ๋ถ๋ถ์ ๋ณ๋์ ์ปจํ ์คํธ ์ฌ๋ผ์ด์ค๋ฅผ ์๋ณํ๋ ๊ฒ์ ๋๋ค. ์ํ ๋ฐ ๋์คํจ์น ์ปจํ ์คํธ๊ฐ ์ ์ ํ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ useReducer์ ํจ๊ป useContext๋ฅผ ์ฌ์ฉํ ๋ ๊ถ์ฅ๋๋ฉฐ ์ฌ๊ธฐ์ ๋ง๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ ๊ฝค ํฐ ๋๋ฌด๋ฅผ ๋ง๋ค๊ณ ๋ ๋ง์ ์ปจํ
์คํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ํ์ ์ง์ฅ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค. useContext
์ดํด๋ณด์๊ธฐ ๋ฐ๋๋๋ค. ์ด๋ฌํ ๋ฌธ์ ์ ์ง๋ฉดํ๊ธฐ ์์ํ๋ฉด ๋ง์ ๋์์ด ๋ ๊ฒ์
๋๋ค.
@oliviertassinari ์๋ฃจ์ ์ ๋ํ ์ผ๋ฐ์ ์ธ ํจ์ ์ ์์งํ๋ ๊ฒ์ ์ข์ ๋ฌธ์ ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๊ณผ ๋ณ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ง๋ค ๊ฒ์ธ์ง ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
@oliviertassinari @eps1lon ์์
๋ ๋๋ง ์ฑ๋ฅ์ด ๋๋ฆฐ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. <Box>
๊ตฌ์ฑ ์์์ ๋ชจ๋ ์ธ์คํด์ค๋ฅผ <div>
๋ก ๊ต์ฒดํ์ฌ ์์ ํ ํด๊ฒฐํ์ต๋๋ค. react devtools ํ์ผ ๊ทธ๋ํ๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฒ๊น
ํ๊ณ ์ฝ 420ms์์ 20ms๋ก ์ด๋ํ์ต๋๋ค.
<Box>
es;
<Box>
์์ด:
@mankittens ์คํ์ผ ์์ง์ผ๋ก styled-components๋ฅผ ์ฌ์ฉํ์ฌ Box ๊ตฌ์ฑ ์์๋ฅผ ์ ์งํ ์ ์์ต๋๋ค. ์ฑ๋ฅ์ ํจ์ฌ ๋ ์ข์ ๊ฒ์ ๋๋ค. ๊ฐ๊น์ด ์ฅ๋์ JSS๋ก ๋ ์ข์์ง ๊ฒ์ ๋๋ค https://github.com/mui-org/material-ui/pull/16858.
์ด ๋ฌธ์ ๋ฅผ ๋ซ์ต๋๋ค. ํฌ๊ด์ ์ธ ์ค๋ ๋๊ฐ ์๋ ๊ฐ์ ์ ๊ฐ ์ ์ฌ์ ์์ญ์ ๋ํ ์ ์ฉ ์ฑ๋ฅ ๋ณด๊ณ ์๊ฐ ํ์ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@oliviertassinari ํ๋ฅญํ ๊ฐ๋ฐ์๋ก์ ์ด๋ป๊ฒ ์ด๋ฐ ๊ฒ์ ์์ฑํ ์ ์์ต๋๊น? ์ฌ์ค์ด ์๋ ์ฃผ์ฅ์ผ๋ก _๊ฐ์ธ์ ์ธ ๊ฐ์ ์ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋๋ ์์์ ์ถฉ๋ถํ ์ฌ์ค์ ์ ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์ด ํ๋ก์ ํธ๋ฅผ ์ข์ํ๊ณ ๊ธฐ์ฌํ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๋ชจ๋ ๊ฒ์ ํ๋ค. ์ถฉ๋ถํ์ง ์๋ค? ์, ๊ทธ๋ผ ๋ ๋ง์ ์ฌ์ค ๊ณผ ๊ฐ์ ์ด _no_ ์์ต๋๋ค.
๋น์ ์ ์ํด 10๊ฐ์ ๋ฒํผ์ผ๋ก ์ค์ ๋๋ค. 10! ์ด๋ material-ui์ 10๊ฐ ๊ตฌ์ฑ์์(๋ ๋์ ๊ฒ์ ์ปจํ ์ด๋)๊ฐ ์ฑ์ ์ฌ์ฉํ ์ ์์ ๋๊น์ง ์ ์ฒด ์ฑ์ ์๋๋ฅผ ๋ฆ์ถ๋ ๊ฒ์ ์๋ฏธ ํฉ๋๋ค ! ์ค๋กํ ์์ด ํก๋จ๋ณด๋ 21/ํฌ๋กฌ 51์ ์ฌ์ฉํ์ฌ ์ค์ ์ฅ์น์์ ํ ์คํธ:
์ผ๋ฐ ๋ฒํผ:
ํจ์ด๋ฒํผ:
์ด๊ฒ์ ์ฌ์ ํ โโ8๋ฐฐ ๊ฐ์ ๋์์ต๋๋ค! ๊ทธ๊ฒ์ ๊ฑฐ๋ํ๋ค! ๋ชจ๋ฐ์ผ ์ฅ์น์์ ์ด๊ฒ์ด ์ผ๋ง๋ ์ค์ํ์ง ์์ํ ์ ์์ต๋๊น?
Button์ ๊ฐ์ฅ ๊ฐ๋จํ ์ปดํฌ๋ํธ ์ค ํ๋์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ต๋๋ค! ์ฑ๋ฅ ๊ด์ ์์ material-ui ๊ฐ ๊นจ์ ธ ์์์ ๋ณด์ฌ์ค๋๋ค. ์ด์ AppBar, Toolbar, List, Drawer์ ๊ฐ์ ์ปจํ ์ด๋ ๊ตฌ์ฑ ์์๋ฅผ ์์ํด๋ณด์ญ์์ค! ์ด๊ฒ์ ๋ ๋์๋ค! ๋ชจ๋ ํ์ด์ง์ 20๊ฐ์ ๊ตฌ์ฑ ์์/์ปจํ ์ด๋๋ฅผ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ป์ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ ฅํ ๋ฐ์คํฌํ/๋งฅ์์ ์ด๋ ํ ์๋ ์ ํ๋ ๋ง๋ฃ๋์ง ์๊ธฐ ๋๋ฌธ์ material-ui๊ฐ ๋ฏฟ์ ์ ์์ ์ ๋๋ก ๋๋ฆฌ์ง ์๋ค๋ ์๋ฏธ๋ ์๋๋๋ค.
์ฝ๋์๋๋ฐ์ค์ ๋ํ ์๋ฅผ ๋ณด์ฌ์ฃผ์ธ์. ์ ์ด๋ฐ ์ผ์ด ์ผ์ด๋์ผ ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๊ฒ์ ๋ฐ์ ๊ตฌ์ฑ ์์๋ฅผ ์๋ชป ์ฌ์ฉํ ๋๋ง ๋ฐ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ณต์์ ์ธ ์ ๋ react-intl ์ด ์ ์ฉ๋์ง ์์ context subscribers ์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ์๋ชป๋ ์ฌ์ฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค . ๊ทธ๋ฌ๋ ์ฑ๋ฅ์ ์ ์งํ๊ธฐ ์ํ ๋ฐ์ ์ง์นจ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก์ ์ผ์นํ๋ ๋ค๋ฅธ ๊ตฌ์ฑ ์์๊ฐ ๋ง์ด ์์ต๋๋ค.
BTW: WithStyles๋ ๋ชจ๋ฐ์ผ ์ฅ์น์ ๋ฒํผ์ ๋ํด ์ต๋ 2,27ms๋ฅผ ์๋นํฉ๋๋ค. 8๊ฐ์ ๊ตฌ์ฑ ์์์ 60fps ๋ฏธ๋ง์ ๋๋ค.