styled-components ๋ก ์ ํํ ์ ์์ต๋๊น?
์ค๋๋ ๋น๊ต
JSS์ ๋นํด ๋ง์ ์ฅ์ ์ด ์์ต๋๋ค.
์ฌ๊ธฐ ๋น๊ต ํ์ ๋ค์ ๋ฒ์ ์ SSR ์คํ์ผ์ด ๋ค์ ๋ ๋๋ง๋๋ ๊ฒ์ ํผํ ๊ฒ์
๋๋ค!
๊ธฐ๋ฅ | ์คํ์ผ ๊ตฌ์ฑ ์์ | ๋ฐ์-jss
------------ | -------------- | --------------
๋น๋ ์๊ตฌ ์ฌํญ ์์ | โ
| โ
์๊ณ ๊ฐ๋ฒผ์ด | โ
| โ
๊ธ๋ก๋ฒ CSS ์ง์ | โ
| โ
CSS ์ ์ฒด ์ง์ | โ
| โ
์ฝ๋ก์ผ์ด์
| โ
| โ
์ ์ฐ | โ
| โ
์ธ๋ผ์ธ ์คํ์ผ์ ๊นจ๋จ๋ฆฌ์ง ์์ | โ
| โ
์ฌ์ ์ํ๊ธฐ ์ฌ์ด | โ
| โ
ํ
๋ง | โ
| โ
์๋ฒ ์ธก ๋ ๋๋ง | โ
| โ
๋ํผ ๊ตฌ์ฑ ์์ ์์ | โ | โ
ReactNative ์ง์ | โ
| โ
๋ฒ๋ก: โ
= ์, โ = ์๋์ค, ๐ = ์ฝ๊ฐ, ์ฐธ๊ณ ๋๋ ๊ดํธ ์ฐธ์กฐ
@kybarg ๋ฌธ์ ๋ฅผ ์ด์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! CSS-in-JSS๋ ์์ง์ด๋ ๋ถ์ผ์ ๋๋ค. ๊ณผ๊ฑฐ์ ์ ํํ ์ฌํญ์ ๋ฌธ์ ์ ์๋ฃจ์ ์ด ๋ณ๊ฒฝ๋จ์ ๋ฐ๋ผ ๋ ์ด์ ์ ํจํ์ง ์์ ์ ์์ต๋๋ค.
JSS๋ฅผ ์ ํํ๊ธฐ ์ ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ค์ํ ์คํ์ผ๋ง ์๋ฃจ์ ์ ๋น๊ต ํ์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก styled-components ๋ฅผ ์ ํํ์ง ์์์ต๋๋ค.
<Grid />
: #6010.์ฌ์ค @nathanmarks ๊ฐ ์ธ๋ผ์ธ ์คํ์ผ์์ ๋ฒ์ด๋๊ธฐ ์์ํ์ ๋ styled-components ๋ ์กด์ฌํ์ง๋ ์์์ต๋๋ค.
๊ธ๋ก๋ฒ CSS ์ง์
https://github.com/cssinjs/jss-global ์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ์์ฑํ ์ ์์ต๋๋ค.
const styles = {
'<strong i="35">@global</strong> body': {
color: 'green'
}
}
์ฌ์ ์ํ๊ธฐ ์ฌ์
์ด๊ฒ ์ด๋ป๊ฒ ์ฝ์ง ์์ง? Material-UI ์ธก์๋ ์ฌ์ ์ ์๋ ์ฌ์ถ ์์ ํ ์ด๋ธ์ด ์์ต๋๋ค. ์ฌ์ฉ์ ์์ญ์์๋ ํ๋ฅญํ ์ต์ ์ฌ์ ์ API๋ฅผ ๊ตฌํํ๋ ์ต์์ ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ํผ ๊ตฌ์ฑ ์์ ์์
Material-UI ์ธก์๋ ๋ํผ ๊ตฌ์ฑ ์์๊ฐ ์์ต๋๋ค. withStyles
๋ฅผ ์ฌ์ฉํ ์ ์์์ง๋ง ์ฑ๋ฅ์์ ์ด์ ๋ก ์ฌ์ฉํ์ง ์์ต๋๋ค. ์ปจํ
์คํธ ๊ตฌํ์ ์ถ์ํํ๊ธฐ ์ํด ํด๋น ๊ณ ์ฐจ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉ์์๊ฒ ๋
ธ์ถํฉ๋๋ค.
ํ ๋ง
์ฐ๋ฆฌ๋ ๋ด๋ถ์ ์ผ๋ก jss-theme-reactor๋ฅผ ์ฌ์ฉํฉ๋๋ค. JSS๋ ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ ์์ค API๋ฅผ ๋ ธ์ถํ๊ณ ์์ต๋๋ค.
ReactNative ์ง์
์ข์ ์ง์ ์ ๋๋ค. react-with-styles API๋ ๋งค์ฐ ํฅ๋ฏธ๋กญ์ต๋๋ค. ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ ํ ์ ์๋ ๊ฒ์ ๋๋ค!
์์ผ๋ก ๊ฐ์ฅ ์ ๋งํ ๊ฒฝ๋ก๋ ์คํ์ผ ๊ตฌํ์ ์ ํ ํ ์ ์๋ API๋ฅผ ๊ฐ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ ๊ฐ์ง ์ด์ ์ด ์์ต๋๋ค.
react-toolbox ๊ฐ ํด๋น ๊ฒฝ๋ก ๋ฅผ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค. ๋ด ์ ์ผํ ๊ด์ฌ์ฌ๋ ์ถ๊ฐ๋๋ ์ค๋ฒ ํค๋์ ๋๋ค. ๋ด ๋ง์, ๊ทธ๋งํ ๊ฐ์น๊ฐ ์์ต๋๊น?
๋ฃจํ์ @kof ๋ฐ @mxstbr ์ ์ถ๊ฐํ๊ณ ์์ต๋๋ค.
@kybarg ์ฌ์ค, ๋๋ ๋น์ ์ด ์ ์ํ๋ ๊ฒ์ ์์ ํ ์ดํดํ์ง ๋ชปํฉ๋๋ค.
๊ทํ์ ์ง๋ฌธ์ ๋ฐ๋ฅด๋ฉด react-jss
๋ฅผ ์ฌ์ฉํ๊ณ ์์ง ์์ต๋๋ค .
์ฐ๋ฆฌ๋ผ๊ณ ํ ๋ ์ฌ์ฉ์ ๋๋ Material-UI๋ฅผ ๋งํ๋ ๊ฒ์ ๋๊น?
๋ด ํฌ์ธํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
styled-components
๋ JSS ์ฝ์ด๋ณด๋ค ํจ์ฌ ๋์ ์์ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์
๊ณ์ธต์์ ํ์คํ ์ฌ์ฉํ ์ ์์ต๋๋ค.์ด ํ๋ ์ค์ ๋ก ๋งค์ฐ ์ฃผ๊ด์ ์ด๋ฉฐ ๋ด ๊ฒฝํ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. FWIW, styled-components
๋ ํ์ฌ ๊ตฌ์ฑ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์๋ํฉ๋๋ค.
import { Button } from 'material-ui'
const MyButton = styled(Button)`
// Only these styles will be overridden
background: red;
`
๊ตฌ์ฑ ์์๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ผ๋ถ DOM ๋
ธ๋์ className
์ํ์ ์ฒจ๋ถํ๋ ํ ์๋ํฉ๋๋ค.
const MaterialUIButton = (props) => {
/* ... */
// As long as props.className is attached, the above usage will work
return <button className={`bla ${props.className}`} />
}
์ด์จ๋ ๋ฐ์ ๋ค์ดํฐ๋ธ ์ง์์ด๋ ๋ฌด์์ ๋๊น? ์น ํ๋ซํผ์ ํ์ ์งํฉ์ด ์๋๋๊น?
์๋์, ๊ทธ๋ ๊ฒ ์ฌ์ด ์ผ์ด ์๋๋๋ค ๐ JSS์ ๋ํ ์ง์์ ์ถ๊ฐํ๋ ๊ฒ์ ์ด๋ ต์ง ์์ต๋๋ค. ์คํ์ผ ๊ฐ์ฒด๋ฅผ StyleSheet.create()
์ ์ ๋ฌํ๊ธฐ๋ง ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์
๋๋ค. CSS ๋ฌธ์์ด์ด ์๋ํ๋๋ก ํ๋ ค๋ฉด styled-components
์ธก์์ ์กฐ๊ธ ๋ ๋
ธ๋ ฅํด์ผ ํฉ๋๋ค.
๋๋ ์ง๊ธ ์ ์ @javivelasco ์ ์ด์ผ๊ธฐ๋ฅผ ๋๋์๊ณ ๊ทธ๊ฐ react-toolbox
์ ํจ๊ป ๊ฐ๋ ๊ณณ์ ์ข์ํฉ๋๋ค. ๊ทธ์ ๊ตฌํ์ ๋๋๊ณ ๋ชจ๋ ํ์ฌ ๊ตฌ์ฑ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ด๋ฅผ ์ฑํํ๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค. ๊ทธ๊ฐ ์ฌ๊ธฐ์ ๊ทธ์ ์์ด๋์ด๋ฅผ ์ฐจ์ํ ์ ์๋๋ก ๊ทธ๋ฅผ ํ!
์๋ฒ ์ธก ๋ ๋๋ง ๋์์ฑ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. JSS๋ ๊ฐ ์์ฒญ์์ ์คํ์ผ์ ์์งํ๊ธฐ ์ํด ์ ์ธ์คํด์ค๋ฅผ ์ธ์คํด์คํํ๋ ๋์ ์ฑ๊ธํค์ ์์กดํ์ฌ ์คํ์ผ์ ์์งํฉ๋๋ค. ์คํ์ ์ ๋ง ์ ํ์ ์ ๋๋ค.
์ ํ ๊ด๋ จ์ด ์์ต๋๋ค. ์ด ๋ฌธ์ ์ ๋ํด ์ด๋ฅผ ํ์ฉํ API์ ๋ํ ์์ด๋์ด์ ๋ํด ์ธ๊ธํ์๊ฒ ์ต๋๊น? ์ฐ๋ฆฌ๋ ๋ฌด์์ ํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ์ง ์์์ผ๋ฏ๋ก ๊ทํ์ ์๊ฒฌ์ ๋งค์ฐ ๊ฐ์ฌํ๊ฒ ์๊ฐํฉ๋๋ค.
์๋ ํ์ธ์, gitter์์ ์ด๊ฒ์ ๋ํด ๋ฌธ์ํ์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ ๊ฒฌํด๋ฅผ ์ป๊ธฐ ์ํด ์ฌ๊ธฐ์๋ ๊ฒ์ํฉ๋๋ค.
๋๋ material-ui _next_๊ฐ ์ปค์คํ
jss ์๋ฃจ์
์ ๋ง๋ํ ํฌ์๋ฅผ ํ๊ณ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๋ณด๋ค jss๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ฌ๊ฐํ ์ด์ ์ ๋ฐ๊ฒฌํ ์ฌ๋์ด ์์ต๋๊น?
jss๋ ๋ฐ์ฝ๋ ์ดํฐ(injectstyles) ๋ฐ ํ๋ฌ๊ทธ์ธ๊ณผ ๊ฐ์ ์ฌ๋ฌ ํจํด์ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ๋๋ฌธ์ ์ข์ง๋ง ๋ฐ์ฝ๋ ์ดํฐ, ์ฌ์ฉ์ ์ง์ ์ค์ ๋ฐ ํ๋ฌ๊ทธ์ธ์ด ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ styled-components์ ์ง์ ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด ํจ์ฌ ๊นจ๋ํ๋ค๊ณ โโ์๊ฐํฉ๋๋ค.
styled-comp์์ ๋ชจ๋ ๊ตฌ์ฑ ์์๋ ์ด๋ฏธ ์คํ์ผ์ด ์ง์ ๋์ด ์์ผ๋ฏ๋ก ์คํ์ผ์ ์ ๋ฌํ ํ์๊ฐ ์์ต๋๋ค. ๋ค๋ฅธ ์คํ์ผ์ ์์ฑํ๊ธฐ ์ํด ํ๊ฐํ ์ ์๋ ์ํ์ ์ ๋ฌํฉ๋๋ค.
์ค์ ์์(createJss)
ํ๋ฌ๊ทธ์ธ ์์(์ ๋์ฌ)
JSON DSL ์์
๋๊ตฐ๊ฐ ์ด ์ค๋ ๋๋ฅผ ์ ๊ฐ์ผ ํฉ๋๋ค.
@rainice jss์๋ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ์์ผ๋ฉฐ HOC๋ react-jss์ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ด๋ฉฐ ์ฌ๊ธฐ์์๋ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
์ ์ด๊ฒ์ ์ ๊ฐ์ผ ํฉ๋๊น? ๊ฑด์ ํ ํ ๋ก ์ ๋๋ค IMO
์ฌ๊ธฐ์ ์๋ ์ต์ข ์ฌ์ฉ์ ๊ธฐ๋ฐ ์ฝํ ์ธ (lib ๊ด๋ฆฌ์๊ฐ ์๋)๋ ๋งค์ฐ ํผ์์ ์ด๋ฉฐ ๊ทธ๋ค์ด ์ฌ์ฉํ๋ ๊ฒ ๋ค์ ์๋ ์ฝ๋ ํ ์ค๋ ์ฝ์ง ์์๊ธฐ ๋๋ฌธ์ ์ดํดํ ์ ์์ต๋๋ค.
์คํ์ผ๋ง ์๋ฃจ์ ์ ์ ํ์ ๋ํด ๊ธธ๊ฒ ๋ ผ์ํ๊ณ ๊ฒฐ์ ์ ๊ทผ๊ฑฐ๊ฐ ๋ฌธ์ํ ๋์์ผ๋ฉฐ ๋ค์ ์ฃผ์ ๋ฆด๋ฆฌ์ค๋ฅผ ์ํ ๊ฐ๋ฐ ์์ ์ด ์งํ ์ค์ด๋ฏ๋ก ์ ์ฉํ ๋ฌธ์ ๊ฐ ์๋๋ฏ๋ก ์ด๋ง ๋ง์น๊ฒ ์ต๋๋ค.
์ฌ๋๋ค์ด ๋ซํ ์ค๋ ๋์ ๊ณ์ ๊ฒ์ํ์ง ์์ ๋งํผ ์ถฉ๋ถํ ์ฑ์ํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ทธ๋ฌ๋ ํ์ํ ๊ฒฝ์ฐ ์ ๊ธ ์ ์์ต๋๋ค.
๋ ๊ฒฐํฉ๋ ์คํ์ผ๋ง ์๋ฃจ์
์ ์ฌ์ฉํ์ฌ ํด๋น ์ค๋ ๋๋ฅผ ์์ผ๋ก ์ด๋ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
๊ทธ๋ฌ๋ ์ง๊ธ ์ฐ๋ฆฌ์ ์ฐ์ ์์๋ ๊ตฌ์ฑ ์์์ ๋ง์ด๊ทธ๋ ์ด์
/์ ๋ฐ์ ์ธ ๊ฐ์ ์ ๋๋ด๋ ๊ฒ์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@mxstbr styled-components ๊ฐ์ฌํฉ๋๋ค
๊ตฌ์ฑ ์์๊ฐ className ์ํ์ ์ผ๋ถ DOM ๋ ธ๋์ ๋ด๋ถ์ ์ผ๋ก ์ฐ๊ฒฐํ๋ ํ ์๋ํฉ๋๋ค.
์ด๊ฒ์ mui:next ๊ฐ ์ถ์๋ ๋ ์ฌ์ฉ ๊ฐ์ด๋์ ์ด๋๊ฐ์ ๊ฐ์กฐ ํ์ํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ด ๋๊ธ์ด ์ ๋ฅผ ๊ตฌํ์ต๋๋ค.
IE10์ฉ Flex ์คํ์ผ์ jss์์๋ ์๋ํ์ง ์์ง๋ง ๋งค๋ ฅ์ฒ๋ผ ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์์์๋ ์๋ํฉ๋๋ค.
@yhaiovyi Material-UI๋ IE10์ ์ง์ํ์ง ์์ต๋๋ค.
๊ณต๊ธ์ ์ฒด ์ ๋์ด evtl. jss์ ๋ํด ๊ณง ์์ ๋ ์์ ์ด์ง๋ง mui๊ฐ IE10์์ ํ ์คํธ๋์ง ์์ ๊ฒฝ์ฐ ๋ชจ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ค๋ ์๋ฏธ๋ ์๋๋๋ค.
์ด์จ๋ ๋๋ ์ง๊ธ๊น์ง IE10์์ CSS flex๋ฅผ ์ฌ์ฉํ ๋ค์ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์ฐพ์ง ๋ชปํ์ต๋๋ค.
Material UI ์คํ์ผ์ Styled Components๋ก ์ฌ์ ์ํ๋ 3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค(๋ ์ฌ์ธ ์ ์์ง๋ง ๋ชจ๋ ๊ฒ์ด ๊ฝ์ ์๋๋๋ค). ์ฌ๊ธฐ ๋ด ์์ ์ด ์์ต๋๋ค.
๋ํ ๋ช ์ค์ ์ฝ๋๋ก ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์ API๋ฅผ ์ป์ ์ ์์ต๋๋ค. https://material-ui-next.com/customization/css-in-js/#styled -components-api-15-lines-
styled-jss ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค(์: https://codesandbox.io/s/32mvjyjyxq ).
์ผ๋ฐ์ ์ผ๋ก JSS์ ์ ์ผํ ๋จ์ ์ ์ฌ๊ธฐ์๋ ๋งํ๋ฏ ์ด ์ฝ๋ ํธ์ง๊ธฐ์์ ์๋ ์์ฑ ๊ธฐ๋ฅ์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด์ ์ด ์์ต๋๋ค. styled-components์์์ฒ๋ผ CSS๋ฅผ js๋ก ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒ์ ์ฝ๊ฐ ๊ณผ๋ถํ
ํธ์ง: ๋ฐฉ๊ธ ์์์ ์ธ๊ธํ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค. ํฅ๋ฏธ๋กญ์ต๋๋ค.
์ง์ฆ๋๋ ๊ฒ์ Mui์ ์ปจํ
์คํธ์ withStyles
HOC๊ฐ ํต์ฌ react-jss ๋ฐ styled-jss ThemeProvider https://codesandbox.io/s/32mvjyjyxq ์ ์ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค( Typography
ํ์ง๋ง ์๋ํ์ง ์์ต๋๋ค. ํธ์ง: nvm, ์ฌ์ ํ ๋ง์ง์๊ฑฐ๋ฆฌ๊ณ ์์)
๋์ค์(v1 ์ดํ) src/styles/withStyles
๋ฐ MuiThemeProvider + JSSProvider ์ด์ค ๋ ์ด์ด๋ฅผ ๋จ์ํํ๊ณ react-jss ๋ฐ styled-jss๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์ข ๋ ๋จ์ํ ๊ฒ์ ๊ฐ๋ ๊ฒ์ด ๊ฐ์น๊ฐ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
๊ทธ๊ฒ์ ์ํด ์์ ํ!
2018๋ 3์ 13์ผ 13์ 55๋ถ์ "Cyril Auburtin" [email protected] ์ด ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
์ง์ฆ๋๋ ๊ฒ์ Mui์ ์ปจํ ์คํธ์ withStyles HOC๊ฐ ์ฌ์๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
ํต์ฌ react-jss ๋ฐ styled-jss ThemeProvider์ ์ ์ด์ธ๋ฆฝ๋๋ค.
https://codesandbox.io/s/32mvjyjyxq๋์ค์(v1 ์ดํ) ๋จ์ํํ ๊ฐ์น๊ฐ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
src/styles/withStyles ๋ฐ MuiThemeProvider + JSSProvider ์ด์ค ๋ ์ด์ดโ
์ด ์ค๋ ๋์ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/mui-org/material-ui/issues/6115#issuecomment-372655385 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AADOWAbwLOnRoypx9ANCZnKyalZyD0M9ks5td8HNgaJpZM4L-GwD
.
styled-components์์์ ๊ฐ์ด CSS๋ฅผ js๋ก ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒ์ ์ฝ๊ฐ์ ๊ณผ๋ถํ์ ๋๋ค.
CSS์ ๋ํ ๊ฐ์ฒด ๊ตฌ๋ฌธ ๋ถ์์ด :wink์ธ ๊ฒ์ฒ๋ผ ๋ฌธ์์ด ๊ตฌ๋ฌธ ๋ถ์์ ๊ฑฐ์ ๋์ผํ ์๋์ด๋ฉฐ ์์งํ ์ค์ํ์ง ์์ต๋๋ค. https://github.com/A-gambit/CSS-IN-JS-Benchmarks/blob/master/RESULT.md
์๋ฃจ์
| CSS ์ฌ์ฉ | ์ธ๋ผ์ธ ์คํ์ผ ์ฌ์ฉ | ๋ง์ดํธ ์๊ฐ(ms) | ๋ ๋๋ง ์๊ฐ(ms)
:--- | :--- | :--- | :--- | :---
...
์คํ์ผ ๊ตฌ์ฑ ์์ | + | - | 182 | 146.84
์คํ์ผ ๊ตฌ์ฑ ์์ ๋ถ๋ฆฌ ์
| + | - | 213.53 | 152.39
...
๋ฐ์-jss | + | - | 198.97 | 297.74
@mxstbr ๋ฐํ์์ js๋ก ์์ฑ๋ ์ ์ฒด CSS ํ์๋ ํ์คํ ๊ฐ๊ฒฉ์ด ์์ต๋๋ค. ๊ทธ ๋ฒค์น๋งํฌ๋ ๋น์ฉ์ ์ธก์ ํ์ง ์์ต๋๋ค.
๋ฐํ์์ js๋ก ์์ฑ๋ ์ ์ฒด CSS ํ์๋ ํ์คํ ๊ฐ๊ฒฉ์ด ์์ต๋๋ค.
๋ฌผ๋ก , ํ์ง๋ง ๋ฌธ์์ด์ด ์๋ ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌํ๋ ์์ ํ CSS ํ์ ์ด์์ ์๋๋๋ค. ๊ฒ๋ค๊ฐ ์ค์ CSS ๋ฌธ์์ด์์ ์๋ํ๋ CSS ํ์๋ ์ค๋ซ๋์ ์ต์ ํ๋๊ณ ํ์๋์์ผ๋ฉฐ ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌํ๋ ํ์๋ ํจ์ฌ ์ ์ต๋๋ค. :๋ถํ๋ค:
ํ์๊ฐ ์๋ ๊ฐ์ฒด๋ก ๋ถํธ์คํธ๋ฉ CSS๋ฅผ ๋ฒค์น๋งํนํ๋ ๊ฒ๊ณผ ์ฐ๋ฆฌ ํ์์ธ ์คํ์ผ๋ฆฌ์ค๊ฐ ์๋ ๋ถํธ์คํธ๋ฉ CSS๋ฅผ ๋ฒค์น๋งํนํ๋ ๊ฒ์ ๋ํด ๊ถ๊ธํฉ๋๋ค.
ํ์๊ฐ ์๋ ๊ฐ์ฒด๋ก ๋ถํธ์คํธ๋ฉ CSS๋ฅผ ๋ฒค์น๋งํนํ๋ ๊ฒ๊ณผ ์ฐ๋ฆฌ ํ์์ธ ์คํ์ผ๋ฆฌ์ค๊ฐ ์๋ ๋ถํธ์คํธ๋ฉ CSS๋ฅผ ๋ฒค์น๋งํนํ๋ ๊ฒ์ ๋ํด ๊ถ๊ธํฉ๋๋ค.
์, ์ ์ ํ ๋ฒค์น๋งํฌ๊ฐ ๋ ๊ฒ์ ๋๋ค. ์ ๊ฐ ์ฝ๊ฐ ํ ์คํธ๋ฅผ ํด๋ณด๋ ๊ฐ์ฒด ์์ ์ด 10-20๋ฐฐ ๋ ๋นจ๋ผ์ก์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ค์ ๋งํ์ง๋ง ํฌํจํ jss ํ๋ฌ๊ทธ์ธ์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ ๊ตฌ๋ฌธ ์คํ ํ๋ฌ๊ทธ์ธ์ด ๋ง์ด ์์ต๋๋ค.
๋ํ TBH. ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ISTF๋ก ์ฎ๊ฒจ๊ฐ๋ ์๊ด์์ต๋๋ค.
๋๋ ์ฝ๊ฐ์ ํ ์คํธ๋ฅผ ํ๊ณ , ๊ฐ์ฒด ์์ ์ 10-20๋ฐฐ ๋ ๋น ๋ฆ ๋๋ค.
๋ฌผ๋ก ์ ๋๋ค. ํ์ง๋ง 10ms(์คํ์ผ๋ฌ์ค๊ฐ ์ ์ฒด ๋ถํธ์คํธ๋ฉ ์คํ์ผ์ํธ๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ)์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ์ฒด CSS๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐ 1ms๊ฐ ์์๋๋ ๊ฒ์ ์ ์ฒด์ ์ธ ๊ตฌ์กฐ์์ ์ค์ํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋๊ตฐ๊ฐ์ ์ฑ์ ๋ง๋ค๊ฑฐ๋ ๊นจ๋จ๋ฆฌ์ง ์์ ๊ฒ์ ๋๋ค.
์ด์จ๋ ํ์ ์ด์์ผ๋ก ๋ง์ ์๋ฆผ์ผ๋ก์ด ๋ฌธ์ ์์ ์ง์ฆ๋๋ ์ฌ๋๋ค์ ์ค์งํฉ์๋ค.
ใ ์ด ๋ฒค์น๋งํฌ๊ฐ ๋ ์ ํํ ๊ฒ ๊ฐ์ต๋๋ค. http://necolas.github.io/react-native-web/benchmarks/ ์ฒซ ๋ฒ์งธ ๊ตฌ๋ฌธ ๋ถ์ ํ ์บ์์ ์์กดํ์ง ์์ง๋ง ํ์คํ์ง ์์ต๋๋ค.
@mxstbr ์ด ๋ฌธ์ ๋ ํ์ฌ ์ ๊ฒจ ์์ง๋ง ์ฝ๊ฐ์ ๊ฑด์ ํ ๊ฒฝ์์ ๋ชจ๋์๊ฒ ์ข์ต๋๋ค. ์ธ์ ๋ ์ง ๋ค์ ์ค์ญ์์ค. ๋ฌธ์ ๊ฐ ํ ๋ก ์ ์ํ ์ ์ ํ ์ฅ์๊ฐ ์๋ ๊ฒฝ์ฐ gitter ์ฑํ ์์ ์ ํฌ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ 1๋ ์ด ๋์์ต๋๋ค. ์๋ค์, ๋๊ธ ๊ทธ๋ง ๋ฌ์. ํ ๋ก ์ ์ ํ ๋ก ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค. ํ ๋ก ์ด ์์๋ ํ ๋ง์ ๊ฒ์ด ๋ณํ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ ๊ธ ๋ฌธ์ ๋ฅผ ํผํ๋ ค๊ณ ๋ ธ๋ ฅํฉ์๋ค. ๋ ๋์ ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ธฐ ์ํด ๊ฐ๋ฅํ ํ ๋ง์ ํผ๋๋ฐฑ์ ๊ณ์ ์์งํด์ผ ํฉ๋๋ค.
๋๋ ์ด๊ฒ์ ๋ช ํํ๊ฒ ์ ๋ฌํ๊ธฐ ์ํ ๋๊ตฌ๋ก ๋ฌธ์ ๋ฅผ ์ ๊ทธ๋ ๊ฒ์ ๊ด์ฐฎ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฌด๋ ์ด์ ๋ํด ํ๋ฅผ ๋ด์ง ์์์ผ๋ฉฐ ์ธ๋ก ์ ์์ ๊ฐ ์นจํด๋์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ ๋ง ๊ด์ฐฎ์ต๋๋ค.
๋ ๋ง์ ํผ๋๋ฐฑ์ ์์งํ๊ธฐ ์ํด ์ฌ๊ฐ์ฅ ์ค์ ๋๋ค. ์ด๊ฒ์ด ์ฌ๋๋ค์ด ์ฌ์ ํ ๊ด์ฌ์ ๊ฐ๊ณ ์๋ ๊ฒ์ธ์ง ๊ถ๊ธํฉ๋๋ค.
๋ก๋๋งต์ ์
๋ฐ์ดํธํ๋ ๋ฐ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํ ๊ฐ๋ฐ์ ์ค๋ฌธ์กฐ์ฌ ๊ฐ ์งํ ์ค์
๋๋ค.
์คํ์ผ ์๋ฃจ์
์๋ ๋ค์๊ณผ ๊ฐ์ ์๊ตฌ ์ฌํญ์ด ์์ต๋๋ค.
classes
API, theme.overrides
API ๋ฐ ์ ์ญ ๊ฒฐ์ ์ ํด๋์ค ์ด๋ฆ์ ๊ฐ์ง ์ ์๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.!important
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํด๊ฒฐ์ฑ
์ด ์๋๋๋ค.๋๋ ์คํ์ผ ๊ตฌ์ฑ ์์, ๊ฐ์ ๋ฐ JSS๋ง ์ธ๊ธํ์ง๋ง linaria, SASS ๋ฑ ๋ค๋ฅธ ๋์์ ๋๋ค.
Material-UI์์ ์ฌ์ฉํ๋ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์์ ํ ์๊ฐ์ด ์์ ๋ ๊ฒฐ์ ์ ์ํฅ์ ์ค ์ ์์ผ๋ฏ๋ก ๋ค์ ๋ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@o-alexandrov JSS๋ styled-components์ ๋์ผํ ์ ๋ต์ ๋ฐ๋ฅด๊ณ ์์ต๋๊น? ๋๋ ๋น์ ์ ์์ ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ๋ช ํํ ํด์ฃผ์๊ฒ ์ต๋๊น? ์ฐจ์ด์ ์ด ๋ญ์ผ? ์ด๋ป๊ฒ ๋ ๋ซ๊ฑฐ๋ ๊ฐ์น๊ฐ ์์ต๋๊น?
@oliviertassinari
์ด์ ๋ฉ์์ง์์ styled-components
๋๋ ๋ค์๊ณผ ๊ฐ์ ์๋ฒฝํ ๊ท ํ์ ๊ฐ์ถ ๋ค๋ฅธ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฉ์ ํ๊ฐํ๋ ค๋ ์์ด๋์ด๋ฅผ ํ์ํ๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋ styled-components
์ ๋ํด ์๋ฌด ๋ง๋ ํ์ง ์์ต๋๋ค.
์์ ๋ ๊ฐ์ง ๋ฌธ์ ์ ๋ํ ๋งํฌ๋ JSS ์์
์ ํ์ฌ ๋ถ์ ์ ์ธ ์ธก๋ฉด ๋ง ๋
ผ์ํฉ๋๋ค.
๋ค์์ ์ด๋์์ ๋ณด์๋์ง ์์ด๋ฒ๋ ธ์ง๋ง ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ค๋ฉด ๋จผ์ ๋ชจ๋ ์ ํ์ ๋ฒค์น๋งํฌ๋ฅผ ์ถ๊ฐํด์ผ ๊ฒฐ์ ์ ๋ ์ฝ๊ฒ ํ๊ฐํ ์ ์๋ค๋ ์ ์ ์ ์ง์ ํ ๊ฒ์ผ๋ก ๊ธฐ์ตํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋ค์์ ์ข์ํฉ๋๋ค.
@o-alexandrov ์ข์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ ๋๊ธ์ ์ฃผ์ ์์ ๋ฒ์ด๋ ๊ฒ์ผ๋ก ํ์ํ๊ฒ ์ต๋๋ค. v5์์๋ ํต์ฌ ๊ตฌ์ฑ ์์๋ฅผ ์คํ์ผ๋ง ์๋ฃจ์ ์์ ๋ถ๋ฆฌํ๋ ค๊ณ ํฉ๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ๊ตฌ์ฑ ์์์ ๋ค์ดํค๋, JSS, ๊ฐ์ , linaria ๋ฐ styled-components(๊ธฐ๋ณธ๊ฐ์ผ๋ก) ๋ฒ์ ์ ์ ๊ณตํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ทธ๊ฒ์ด ๋น์ ์ ๋๋ค. ์ด์ ๊ตฌํ์ด ์ด๋ ค์ธ ๊ฒ์ ๋๋ค!
๋ฒ๋ค ํฌ๊ธฐ
styled-components
์ @5.0.0-beta.8 ์์ 12.3kB
๋ฅผ ๊ฐ์ ํ๋ ๊ฒ์ผ๋ก ์
์ฆ๋์์ต๋๋ค.
์ฌ์ฉ์ ์ ์ API
ํจํค์ง ๋๋ ์ธ๋ถ ํจํค์ง์ https://github.com/styled-components/styled-components/pull/2625 ๋ฅผ ๋์ ํ๋ฉด ์ธ์ ๊ฐ ํ์ํ ์๋ ์๋ ์คํ์ผ์ด ์๋ ๊ตฌ์ฑ ์์ API๊ฐ ์๊ธฐ ๋๋ฌธ์ Mui์ ๋ํ API ํจ๋ฆฌํฐ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. , ํนํ ๋ ๊ฑฐ์ ์์คํ ์์ ํ์ง๋ง Mui ์์ฒด์์ API๊ฐ ๊ทธ๋ ๊ฒ ์์ฃผ ํ์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ ๋ฐ์,
๋ด ๊ฐ์ธ์ ์ธ ๊ฒฝํ styled-components
์ด ์ฐ๋ฆฌ์๊ฒ ํ์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ด๋ค ์ ๋ณด๋ฅผ ์์งํ๊ณ ์ถ์์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ํธ ์ด์ฉ์ฑ.
์ด ๋งฅ๋ฝ์์ ๋น์ ์๊ฒ ์ด๊ฒ์ ๋ฌด์์
๋๊น? ๋ด๊ฐ ์๋ ํ ๋ค๋ฅธ ํ๋ ์์ํฌ์ ๋ง์ฐฌ๊ฐ์ง๋ก styled-components
์ ํญ๋ชฉ์ ์ฌ์ ์ํ ์ ์์ต๋๋ค.
RTL ์ง์
์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ์ฝ๋ฉํ๋ ๋ฐฉ์์ ๊ธฐ๋ฐ์ผ๋ก ํ์ง ์์ต๋๊น? styled-components
๋๋ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ํํ ๋ฌด์์ ์ ๊ณตํด์ผ ํฉ๋๊น?
์ด์ ์๋ ๋ค๋ฅธ ์๋ฃจ์ ์ ๋นํด ๋๋ ธ์ง๋ง ๊ธฐ์ฌ์๋ค์ ์ง์๊ณผ ๋๋ผ์ด ๋ ธ๋ ฅ์ผ๋ก JSS๋ณด๋ค ํจ์ฌ ๋นจ๋ผ์ก์ต๋๋ค.
v5
12.3kB
from 16.2kB
$์์ ๋งํ๋ฏ์ด v5์(๋) ์ด ์ฃผ์ ์ ๋ํ ๊ทธ๋ค์ ๋
ธ๋ ฅ์ ๋ํ๋
๋๋ค.
API๊ฐ ๊ฐ์ฅ ๋์ค์ ์ด์ด์ ์ฌ๋๋ค์ ์ต์ํ์ง๋ง, ์ค์ ๋ก styled(...) ...
API๋ฅผ ์ฌ์ฉํ ๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ์ค์ ํจํค์ง๊ฐ ์๋ API๋ฅผ ์ฐธ์กฐํ์ฌ styled-components
๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
Mui๋ ์น์ด์ง๋ง ์ฌ๋๋ค์ ๊ณ์ํด์ styled-components
๋ฅผ ์ฑํํ ๊ฒ์
๋๋ค.
Strong Core ํ์ ์ค๋ 81๊ฐ์ ์ด์์ 14๊ฐ์ PR์ด ์ด๋ ธ๊ณ , ์ด๊ฒ์ ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ์์ ๋นํด ์ข์ ์ซ์์ ๋๋ค.
๋ํ @mxstbr ๊ณผ ๊ฐ์ ์ฌ๋๋ค์ ์ค์ ๋ก spectrum
์ ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ์ค์ ๊ฒฝํ์ด ์์ต๋๋ค. ๋๋์ต๋๋ค. ์ฆ, ์ค์ ๋ก ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ๋๋์ ์๊ณ ์๋ค๋ ๊ฒ์
๋๋ค.
๊ธ์, ๋ ์ข์ ์ ์๋ค https://www.styled-components.com/docs/tooling
์ค๋๋ ๋์์ธ ์์คํ
๊ตฌ์ฑ ์์์ ๋ํ styled-components
์ ์ฑํ์ด ๋ง์ด ์ฆ๊ฐํ๊ณ ์์ต๋๋ค. Atlassian, GitHub, Orbit ๋ฑ.
์ด๊ฒ์ ๋น์ ์ด ํผ์๊ฐ ์๋๊ธฐ ๋๋ฌธ์ Mui์ ์ข์ต๋๋ค. ๊ทธ๋์ ์๋ง๋ ์ฌ๋๋ค์ ๋น์ ์ด ์ง๋ฉดํ ์ ์๋ ์ ์ฌ์ ์ธ ์ํฉ์ ์ด๋ฏธ ์ฒ๋ฆฌํ๊ณ ๊ทธ๊ฒ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์์๋์ ๊ฒ์ ๋๋ค.
์ ๋ styled-components
๋ฅผ ์ง์งํฉ๋๋ค.
CSS์ ๋ํ ๊ฐ์ฒด ๊ตฌ๋ฌธ์ด ๋ ์ฌ์์ก๊ธฐ ๋๋ฌธ์ JSS๋ฅผ ์ข์ํฉ๋๋ค. ๋๋ก๋ ๊ฒ์ผ๋ฅด๊ณ ํด๋น ์คํ์ผ์ style={{styles.dialogTitle}}
์ธ๋ผ์ธ ์คํ์ผ๋ก ์ ๋ฌํ๊ธฐ๋ ํฉ๋๋ค. ๋์ค์ ๋ฆฌํฉํ ๋งํ๊ธฐ ์ฝ์ต๋๋ค.
styled-components https://material-ui.com/styles/basics/#styled -components-api์ ๊ฐ์ ์์ ๋ํผ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
@caub https://www.styled-components.com/docs/advanced#style -objects
๋๋ styled-components๋ฅผ ์ ๋ง ์ข์ํ์ง๋ง ์ต๊ทผ์ ๊ทธ๊ฒ์ด tree-shaking ์์ ์ ์ผ๊ด๋๊ฒ ๋ง๋๋ ๊ฒ์ ์ด๋ ต๊ฒ ๋ง๋๋ ๋ง์ ๋ฌธ์ ๋ฅผ ์๊ฐํ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋๋ material-ui ํ์ด ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด tree-shaking์ด ์์ ํ ์๋ํ๋๋ก ํ๊ธฐ ์ํด ๋ง์ ์์ ์ ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ผ๋ฉฐ ๋ถ๋ช ํ ์ด์ ๋ํ ํ๊ท๋ ํผํด์ผ ํฉ๋๋ค.
๋คํํ๋ ๋๋ถ๋ถ์ ํธ๋ฆฌ ํ๋ค๊ธฐ ๋ฌธ์ ๋ babel-plugin-styled-components ๋ฅผ ์ฌ์ฉํ๊ณ pure: true
๋ฅผ ์ค์ ํ์ฌ ํด๊ฒฐ๋ฉ๋๋ค(https://www.styled-components.com/docs/tooling#dead-code-elimination ์ฐธ์กฐ). ). ๊ทธ๋ฌ๋ ์์ง ๋ช ๊ฐ์ง ๋จ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด:
https://github.com/styled-components/babel-plugin-styled-components/issues/245
๋ค๋ฅธ ํ๋๋ ์คํ์ผ ๋ด์์ ์ธ๋ถ ๋์ฐ๋ฏธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ํธ๋ฆฌ ํ๋ค๋ฆผ์ด ์ค๋จ๋ ์ ์๋ค๋ ๊ฒ์ ๋๋ค(ํน์ ๊ธฐ๋ฅ์ ๋ฌด์ํ๋๋ก terser/uglify๋ฅผ ๊ตฌ์ฑํ์ง ์๋ ํ). ์:
const Button = styled.button`
font-size: ${externalHelperFunction()};
`
๋๋ฌด ํ๋ค๊ธฐ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋ ค๋ฉด ์ด ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง๋ง ํ์คํ ๊น๋ค๋ก์ธ ์ ์์ผ๋ฉฐ ํ์ฌ ์ํฉ์์ ์ด์์ ์ธ ๋ฐฉ์์ผ๋ก ์๋ํ์ง ์์ต๋๋ค. ๋๋ ์ค์ ๋ก ์ฌ์ ํ ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๋ก ์ ํํ๋ ๊ฒ์ด ์ข์ ์๊ฐ์ผ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ์ด๋ฌํ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ์ ์๋ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅํฉ๋๋ค.
@mbrowne ํธ๋ฆฌ ํ๋ค๊ธฐ ๋ฐ ์คํ์ผ ๊ตฌ์ฑ ์์ ๋ฌธ์ ๋ฅผ ์ฌํํ ์ ์์ต๋๋ค. ๋ฌธ์ ์๋ ์ฌํ ๊ฐ๋ฅํ ์๊ฐ ํฌํจ๋์ด ์์ง ์์ผ๋ฏ๋ก ๋ค์์ ์ฌ์ฉํ์ฌ ๋ณต์ ํ๋ ค๊ณ ํ์ต๋๋ค.
// components.js
import React from "react";
import styled from "styled-components/macro";
const Wrapper = styled.div`
color: blue;
`;
export function MyComponent() {
return <Wrapper>styled</Wrapper>;
}
MyComponent.displayName = "FancyName";
export function OtherComponent() {
return "only";
}
// App.js
import React from 'react';
import { OtherComponent } from "./components";
/* code */
๊ธฐ๋ณธ create-react-app
. MyComponent
๋ ํ๋ก๋์
๋ฒ๋ค์ ํ์๋์ง ์์ต๋๋ค.
rollup
์๋ง ๋ฌธ์ ๊ฐ ์์ต๋๊น? ๋ฌธ์ ๋ฅผ ์ดํดํ๊ธฐ ์ํด ์ฌํ ๊ฐ๋ฅํ ์๋ฅผ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
@eps1lon ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์์ ์ ์ ์์ฑ์ ์ค์ ํ ๋ ๋ฌธ์ ๊ฐ ๋ํ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ํด ๋ณผ ์ ์์ต๋๊น?
const Wrapper = styled.div`
color: blue;
`;
Wrapper.displayName = "FancyName";
export function MyComponent() {
return <Wrapper>styled</Wrapper>;
}
export function OtherComponent() {
return "only";
}
@mxstbr ์, ๋ ๊ฒฝ์ฐ ๋ชจ๋ styled-components๊ฐ ๋ฒ๋ค๋ก ์ ๊ณต๋ฉ๋๋ค. MyComponent
์ displayName ์ ์ค์ ํ๋ ๋์ ๋ฒ๋ค์ MyComponent
ํฌํจํ์ง ์์์ง๋ง ์ฌ์ ํ styled-components
ํฌํจํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก MyComponent
์ ๋ํด ์ํ๋ ๋ชจ๋ ์์
์ ์ ๊ฑฐํฉ๋๋ค. ์ด๊ฒ์ด ๋ด๊ฐ ์๋ ์ ๋๋ก ํธ๋ฆฌ ์
ฐ์ดํฌ๋ผ๊ณ ์๊ฐํ ์ด์ ์
๋๋ค(๋ฐฉ๊ธ FancyName
๊ฒ์ํ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฌ์ ํ styled-components
๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. styled
ํธ์ถ์ ๋ถ์์ฉ์ด ์๋ค๊ณ ์๊ฐํ๋๋ผ๋
import React from "react";
import styled from "styled-components";
export function Wrapper() {
// nonsense
return styled.div``;
}
export function MyComponent() {
return <Wrapper>styled</Wrapper>;
}
export function OtherComponent() {
return "only";
}
{ OtherComponent }
๋ฅผ ๊ฐ์ ธ์ฌ ๋ ๋ถ์์ฉ์ด ์์ง๋ง ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๋ ์ฌ์ ํ ๋ฒ๋ค์ ๋ํ๋ฉ๋๋ค(๋งคํฌ๋ก๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค). ๊ทธ๋์ ์ด๊ฒ์ ๋ฒ๊ทธ์ด๊ฑฐ๋ ํฐ ๊ฒ์ ๋์น๊ณ ์์ต๋๋ค. ์กฐ์ฐจ
// Wrapper.js
import React from "react";
import styled from "styled-components";
export default function Wrapper() {
// side-effect free module even if styled has side-effects
const Component = styled.div``;
return <Component />;
}
// components.js
// commenting this out removes styled-components from the bundle
export { default as Wrapper } from "./Wrapper";
export function OtherComponent() {
return "only";
}
// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { OtherComponent } from "./components";
import * as serviceWorker from './serviceWorker';
ReactDOM.render(<OtherComponent />, document.getElementById('root'));
// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();
styled-components
(https://github.com/eps1lon/styled-components-shake)๊ฐ ํฌํจ๋ฉ๋๋ค.
react-scripts, webpack ๋๋ styled-components์ ๋ฒ๊ทธ์ผ ์ ์์ต๋๋ค. ์ด์จ๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ๋ ๊ฒ์ ์ฌํ ์์ด๋ ๋งค์ฐ ์ด๋ ต์ต๋๋ค.
์ดํด๊ฐ ๋ฉ๋๋ค. ์กฐ์ฌํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ด ์ฌ์ฉ ์ฌ๋ก์ ๊ฒฝ์ฐ styled-components
๊ฐ ๋ฒ๋ค์ ํฌํจ๋์ด ์๋์ง ์ฌ๋ถ๊ฐ ์ค์ํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค(๋ชจ๋ ๊ตฌ์ฑ ์์๊ฐ ์ด๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก). ์คํ๋ ค ์ฌ์ฉํ์ง ์๋ ๊ตฌ์ฑ ์์๊ฐ ํฌํจ๋๋์ง ์ฌ๋ถ๊ฐ ์ค์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฐ ๊ฒ ๊ฐ์ผ๋ ๊ด์ฐฎ๊ฒ ์ฃ ?
@mxstbr ์ค์ํ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ์คํ์ผ์ด ์ง์ ๋์ง ์์ ์ผ๋ฐ ๊ตฌ์ฑ ์์(Modal, Popper, TextareaAutosize, useMediaQueries ๋ฑ)๊ฐ ๋ช ๊ฐ์ง ์์ต๋๋ค. ๋๊ตฐ๊ฐ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
import {ย Modal } from '@material-ui/core';
SASS์ ํจ๊ป. ์ฐ๋ฆฌ๋ +20kB gzip์ด ์๋๋ผ +5kB gzip์ผ๋ก ์ฆ๊ฐํ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค(์ค๋ ํ์ฌ).
๊ทธ๋ฌ๋ @material-ui/unstyled
๋ฅผ ์์ผ๋ก ํธ์ํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ์ค์ ๋ก ์ฌ๋๋ค์ด ์ด ํจํค์ง๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ์ฐจ์ด๊ฐ ์์ ์ ์์ต๋๋ค.
@eps1lon ์ฃ์กํฉ๋๋ค. ์ ์ ์์ฑ ๋ฌธ์ ๊ฐ ๋ชจ๋ ๊ตฌ์ฑ ์์์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ฒ๋ผ ๋ณด์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ ์ฝ๊ฒ ์ฌํํ ์ ์์ ๊ฑฐ๋ผ๊ณ ์๊ฐํ์ต๋๋ค... ๋ฌธ์ ๋ฅผ ์ ๋ฐํ๋ ๋ค์ํ ์์ธ์ด ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ง๋ง ์ ์ด๋ ๋ช ๊ฐ์ง ๊ฐ๋จํ ๊ฒฝ์ฐ ์๋ํฉ๋๋ค.
์ฌ๊ธฐ์์ ์ฌํ ๊ฐ๋ฅํ ๋ฐ๋ชจ๋ฅผ ๋ง๋ค์์ต๋๋ค.
https://github.com/mbrowne/CRA-error-template/tree/styled-components-tree-shaking
git clone --single-branch --branch styled-components-tree-shaking [email protected]:mbrowne/CRA-error-template.git
Component1๋ง ํธ๋ฆฌ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ํ๋ค๋ฆฌ๋ ๋ฐฉ์์ ์ ์ํ์ญ์์ค.
์ข์ ์์์ ์ด๋ฌํ ๋ฌธ์ ๊ฐ ๋ชจ๋ ํด๊ฒฐ๋ ์ ์๋ค๊ณ ์๊ฐํ๊ณ @mxstbr ์ด ์ฌ๊ธฐ์ ๋งค์ฐ ์ฐธ์ฌํ๋ ๊ฒ ๊ฐ๋ค๋ ๊ฒ์ ๋๋ค. ์ ๋ ๊ณง ์ต์ํ ์ ์ ์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ PR ์์ ์ ํ ๊ฒ์ ๋๋ค(์ ๋ ์ด๋ฏธ ์์ฑํ ๋ณ๋์ Babel ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์ฌ ์๋ํ๋ POC๊ฐ ์์ต๋๋ค).
ํธ๋ฆฌ ํ๋ค๊ธฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด babel-plugin-styled-components์ ๋ํ PR์ ์ด์์ต๋๋ค. ์ฌ๊ธฐ ๋๊ตฐ๊ฐ๊ฐ ํ
์คํธ๋ฅผ ๋๊ณ ์ถ๋ค๋ฉด @mxstbr ์ด ๊ทธ๊ฒ์ ํ์ํ ๊ฒ์ด๋ผ๊ณ ์์ํฉ๋๋ค(๋ฌผ๋ก ์ ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค).
https://github.com/styled-components/babel-plugin-styled-components/pull/248
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ, ์ด ํฐ์ผ์ ํ์ฌ ์ด๋์ ์์ต๋๊น? ๊ทธ๊ฒ์ด ์ค์ ๋ก ํ๋ก์ ํธ๊ฐ v5์์ ํฅํ๊ณ ์๋ ๋ฐฉํฅ์ด๋ผ๋ฉด MUI์ ๋ํ ๋ช ๊ฐ์ง ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๋ฅผ ์์ฑํ๊ณ ์ฐธ์ฌํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ํ ๋ฒ์ ์ด๊ฒ์ ํ๊ณ ์ถ์ง ์๋ค๋ฉด (๋๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ์ํ๋์ง ์์ฌ์ค๋ฝ์ต๋๋ค). styled-components๊ฐ jss์ ํ ๋ง๋ฅผ ์ฝ๊ฑฐ๋ jss๊ฐ styled-components์ ํ ๋ง๋ฅผ ์ฝ๋๋ก ํ๋ ๊ฒ์ผ๋ก ์์ํด์ผ ํฉ๋๋ค. ๋ชฉํ๋ ๊ตฌ์ฑ ์์๋ณ๋ก ์คํ์ผ์ ๋ง์ด๊ทธ๋ ์ด์ ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ์๋ง๋ ๋ค๋ฅธ ๋ถ๊ธฐ์์ ๋ฐ์ํด์ผ ํฉ๋๋ค. ๋ง์คํฐ์ ๋ชจ๋ ๊ฒ์ ํ ๋ฒ์ ๋ณ๊ฒฝํ๊ณ ์ถ์ง๋ ์์ง๋ง (v5์์) ํ ๋ฒ์ ๋ณ๊ฒฝ์ผ๋ก ๋ฆด๋ฆฌ์คํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ด๊ฒ์ ๋์ฑ ํผ๋์ค๋ฌ์์ง๋๋ค.
๋๊ธ ์ญ์ ๋ฅผ ์์ฒญํ์ต๋๋ค.
์ฌ๋ฌ๋ถ, ์ ๋ ๊ธฐ์ฌํ ์ค๋น๊ฐ ๋์์ต๋๋ค... ๋ณ๋์ ๋ธ๋์น๋ฅผ ํ๋ ๊ฒ์ด ํ๋ช ํ ๊ฒ ๊ฐ์ต๋๋ค... ํด๋ณด์...!
@caprica-Six ์๋์ง์ ๊ฐ์ฌํ์ง๋ง ์ ๋ถ๊ธฐ๋ ํ์ํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์ ๋ฒ์ ์ ์ ์ง์ ์ผ๋ก ์ ๊ณตํ ์ ์์ด์ผ ํฉ๋๋ค(+ jss ๋ฐ ๊ฐ์ )(v4 ๋์ ๋ถ์์ ). ๋์์ ์คํ์ผ์ด ์ง์ ๋์ง ์์ ์คํ ๋ฆฌ๋ฅผ ์์ผ๋ก ์ด๋ํ ์ ์์ด์ผ ํฉ๋๋ค. ์ ์ถํด์ผ ํ๋ POC๊ฐ ์์ต๋๋ค. Styled-components (v5 beta) + dynamic props๋ ์ฐ๋ฆฌ๊ฐ JSS์ static ์คํ์ผ์ ๊ฐ์ง๊ณ ์๋ ๊ฒ๋ณด๋ค ์ฝ๊ฐ ๋๋ฆฌ์ง๋ง ์ด๊ฒ์ ์ฌ์ ํ โโํ์ฉ๋์ด์ผ ํฉ๋๋ค.
@oliviertassinari ์ฐ๋ฆฌ๊ฐ ์ฐธ์ฌํ ์ ์๋ ๊ณณ์ด ์์ต๋๊น? ๋๋ ์ด๋ค ์ผ์ ๋ฐ์ด๋ค๊ธฐ ์ ์ ๊ด๋ฆฌ์๊ฐ ๋๋ฅผ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ์๋ดํด์ฃผ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์์ต๋๋ค.
์คํ์ผ ๊ตฌ์ฑ ์์๋ณด๋ค ๊ฐ์ ์ ์ ํธํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๊ทธ ์ด์ ๋ "[๊ฐ์ ]์ ์์์ ์ฌ๋๋ค์ด ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๋ค. ๋ค์ด๋ก๋ ํต๊ณ๋ฅผ ๋ณด๋ฉด 80%๊ฐ ๋ํ์ฑ ์์ ๋์จ๋ค๊ณ ?"๋ผ๊ณ ํ๋๋ฐ ์ด๊ฒ์ ํ๋ ธ๋ค. ๊ทธ๊ฒ์ styled-components( ๋น๊ต )๋ณด๋ค ๋ ๋ง์ด ์ฌ์ฉ๋๋ฉฐ ๋ค์ด๋ก๋์ 80%๊ฐ ์คํ ๋ฆฌ๋ถ์์ ์ค๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ํ์คํ ๋ํ์ฑ ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ฒ ์ฑ์ฅํ๊ณ ์์ต๋๋ค.
๋๋ ์คํ์ผ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ์ง์ณค๊ณ (์ฌ๋ฌ ๋ฌธ์ ๋ก ์ธํด) ๋์์ ์ฐพ์๊ธฐ ๋๋ฌธ์ ์ด ์ง๋ฌธ์ ํ๊ณ ๊ฐ์ ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ํ ์คํธํ๊ณ ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์์ ๋น๊ตํ์ฌ ์ฅ์ ๋ง ์ฐพ์์ต๋๋ค.
๋ ๊ฐ๋ณ๊ณ ๋น ๋ฅด๋ฉฐ ๋ ๋ง์ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์์ฑ ์ ๋ฌ, TypeScript ๊ธฐ๋ณธ ์ ๊ณต(์คํ์ผ ๊ตฌ์ฑ ์์์ ๋นํด ์๋ฒฝํ๊ฒ ์ง์๋จ), ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ Next.js SSR(_app. js ๋ฐ _document.js ํ์ผ, ์ฒ์ ์ฒ๋ฆฌํ๋ ๋ฐ 1์๊ฐ ์์)
๊ฒ๋ค๊ฐ styled-component๋ณด๋ค ๋ ๋ง์ด ์ฌ์ฉ๋๋ฉฐ ๋ถ๋ช ํ ์ถ์ง๋ ฅ์ด ์์ต๋๋ค.
@lcswillems ๊ฐ์ฑ์ ์ ํธํ๋ ๋ถ๋ค์ ์ํด ๊ฐ์ฑ๋ ์ง์ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ด ๊ธฐ๋ณธ๊ฐ์ด์ด์ผํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๋ต๋ณํด ์ฃผ์๊ณ ์์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋ด๊ฐ ์ง๋ฉดํ ์ฃผ์ ๋ฌธ์ ๋ ์ํ ์ ๋ฌ/ํํฐ๋ง์ ๋๋ค. https://github.com/styled-components/styled-components/issues/439 . ๊ทธ๊ฒ์ ๋์๊ฒ ๋งค์ฐ ์์ฃผ ๋ฐ์ํ๋ฉฐ ๋งค๋ฒ ์๋์ผ๋ก ํํฐ๋ง์ ์ํํ๋ ๊ฒ์ด ์ด๋ ต์ต๋๋ค.
ํ์ง๋ง ๋น์ ์ ๋ง์ ๋ณด๋ฉด ๊ฐ์ ์ ๊ทธ๋ค์ง ์ข์ ๋์์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
"๊ฐ๋ฒผ์ด": ์ ํํ์ง ์์: https://bundlephobia.com/[email protected](12.2kB ) vs https://bundlephobia.com/result?p=@emotion/ styled + https://bundlephobia.com/result?p=@emotion/core + https://bundlephobia.com/result?p=emotion-theming (13.1 kB ์์ด
๊ฐ์ ์ ๊ฒฝ์ฐ css
์ํ + @jsx
pragma ๋์ @emotion/styled
ํจํค์ง๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค. ๋ํ emotion-theming
ํจํค์ง๊ฐ ํ์ํ์ง ์์ ์๋ ์์ต๋๋ค. ThemeContext
๋ ์ด๋ฏธ @emotion/core
์ ํฌํจ๋์ด ์์ต๋๋ค. ๋ฐ๋ผ์ 12.2KB ๋ 6.5KB์
๋๋ค.
์ธ๋ผ์ธ
๊ถ๊ธํ ์ ์ด ์์ต๋๋ค. MUI๊ฐ ์๋ ๊ตฌ์ฑ ์์์ ๋ํ @material-ui/styles
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์์๊ฒ ์ด๋ฌํ ์
๋ฐ์ดํธ๋ ๋ฌด์์ ์๋ฏธํฉ๋๊น? ์ฐ๋ฆฌ ํ์ฌ์์๋ ์ด๊ฒ์ styled-components
๋ณด๋ค ์๋์ ์ผ๋ก ์ ํํ ๋๊ท๋ชจ ๋ด๋ถ ๊ตฌ์ฑ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๋งค์ฐ ๋ง์กฑํฉ๋๋ค.
@material-ui/styles
ํจํค์ง์ ๋ํด ์ด๋ค ์ข
๋ฅ์ ์ฌ์ฉ ์ค๋จ์ด ๊ณํ๋์ด ์๋์ง ๋ฏธ๋ฆฌ ํ์ธํ์ฌ ๊ทธ์ ๋ฐ๋ผ ๊ณํํ ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
์ด์จ๋ , ๋น์ ์ด ๊ณ์ ์ ๊ณตํ๋ ๋ชจ๋ ํ๋ฅญํ ์๋ฃ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
@nickjohnson-dev react-jss๋ก์ ๋ง์ด๊ทธ๋ ์ด์ ์ ๊ฐ๋จํด์ผ ํฉ๋๋ค. ์กฐ์ง์ ํจ๊ณผ๊ฐ ์์ต๋๊น?
@oliviertassinari ๊ทธ๋ด ๊ฐ๋ฅ์ฑ์ด ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ตฌ์ฑ ์์ ์์ฒด์ ๊ณต๊ฐ API๋ฅผ ๊ฑฐ์ ๋์ผํ๊ฒ ์ ์งํ ์ ์๋ ํ( classes
prop ๊ธฐ๋ฐ ๋ก์ปฌ ์ฌ์ ์, ํ
๋ง์์ ๊ฐ๋ฅํ ์ ์ญ ์ฌ์ ์) ๊ตฌํ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
MUI๊ฐ ๋ ๋ถ๋ฆฌ๋ ํ @material-ui/styles
์์ ๋ค๋ฅธ ์คํ์ผ ์ต์
์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๊ธฐ ์ํ ๊ณต์ ๋ฌธ์๊ฐ ์์ ๊ฒ์ผ๋ก ์์ํฉ๋๊น? ์ธ๋ป ๋ณด๊ธฐ์ @material-ui/styles
์์ ํ์ฉํ๊ณ ์๋ react-jss
์ ๋ถ์กฑํ ๊ธฐ๋ฅ์ด ๋ณด์ด์ง ์์ง๋ง MUI ํจํค์ง๊ฐ ์ํํ๋ ํน๋ณํ ๊ฒ์ด ๋๋ฝ๋์๋์ง ํ์คํ์ง ์์ต๋๋ค. ๋ฌด๋ ๋ค์์.
@nickjohnson-dev ์ต์ ์ ๋คํ๊ฒ ์ต๋๋ค.
๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ฉด ๋ค์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ComponentA
๊ฐ ์์ต๋๋ค. $#$2 ComponentB
๋ฅผ ์ฌ์ฉํ๋ ComponentA
๋ฅผ ๋ง๋ญ๋๋ค.
const ComponentA = ({className}) => (
<div className={className}>
<div className='inner' />
</div>
);
const ComponentB = ({ className, classNameInner }) => (
<div className={className}>
<div className='inner'>
<ComponentA className={classNameInner} />
</div>
</div>
)
const StyledComponentB = styled(ComponentB)`
???
`;
ComponentA
๋ฐ ComponentB
์ ๋์ผํ className='inner'
$ ๊ฐ ์๋ ์์๊ฐ ์๋์ง ํ์ธํ์ธ์. ComponentB
์์๋ง .inner
์์๋ฅผ ํ๊ฒํ
ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น?
@oliviertassinari๋ , ์๋ ํ์ธ์, Material UI์ ๋ค์ ๋ฒ์ ์ ์ํ ์คํ์ผ๋ง์ ๋ํ ๋ชจ๋ ์๊ฐ์ ๊ณต์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ Material UI์๋ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ง๊ธ์ ๊ทธ ์์ ๋์์ธ ์์คํ ์ ๊ตฌ์ถํ๊ณ ์์ต๋๋ค.
styled-components
์ฑํ์ ๊ดํด์๋ ์ด๋ฏธ ๊ฒฐ์ ๋ ์ฌํญ์ด๋ฉฐ ๊ทธ ๋ชฉํ๋ฅผ ํฅํ ์์
์ ์ด๋ฏธ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ @croraf ์ @lcswillems ๊ฐ ๊ด์ฐฐํ ๋ด์ฉ ์ค ์ผ๋ถ๋ฅผ ๊ณต์ ํฉ๋๋ค.
ํ์ฌ ๋จธํฐ๋ฆฌ์ผ UI ์คํ์ผ๋ง์์ ์ข์ ์ ์ classes
์์ฑ์
๋๋ค.
classes
์
๋ ฅ์ด ๊ณต์ฉ ์ธํฐํ์ด์ค์ ์ผ๋ถ์ด๊ธฐ ๋๋ฌธ์ ์คํ์ผ ์ฌ์ฉ์ ์ ์ ๋ฐ ์ ์ง ๊ด๋ฆฌ์ ๋ง์ ๋์์ด ๋๋ ๊ฐ๋จํ ์์ด๋์ด์
๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฌด์ธ๊ฐ๋ฅผ ์ฌ์ฉ์ ์ ์ํด์ผ ํ๊ณ & .Component-root
์ ๊ฐ์ ์ ํ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Component
๊ฐ ๋ฒ์ ๊ฐ์ ํด๋น CSS ํด๋์ค๋ฅผ ์ ์งํ๋ค๋ ๋ณด์ฅ์ ์์ต๋๋ค. ์ ์ด๋ <Component classes={{root: ....}} />
๊ฐ ์์ผ๋ฉด ์ธํฐํ์ด์ค ๋ณ๊ฒฝ์ ๋ํ ์ ํ ๊ฒ์ฌ ์ค๋ฅ(TypeScript๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ)๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๊ตฌ์ฑ ์์ ์์ฑ์๋ก์ ์ ๋ ๊ณต๊ฐ๋(์ง์๋๋) ํด๋์ค๋ฅผ ๋ฌธ์ํํ๊ณ ๋๋จธ์ง๋ ๋ฌธ์ํํ์ง ์์ ์ํ๋ก ๋ ์ ์์ต๋๋ค.
style-components
๋ฅผ ์ฝ 2๋
๋์ ์ฌ์ฉํ์ต๋๋ค. ๋์ค์ ์ด๊ณ ๋ง์ด ๋ฐ์ ํ ๊ฒ์ด ์ฌ์ค์
๋๋ค. ๊ทธ๋ฌ๋ MUI ๋ฌธ์ ์์ ์์ @crod ๊ฐ ์ธ๊ธํ ๊ฒ๊ณผ ๋์ผํ ๋ฌธ์ ๋ฅผ ๋ด
๋๋ค. ํ์ ๊ตฌ์ฑ ์์์ ์คํ์ผ์ ์ ํํ ์ ์๊ธฐ ๋๋ฌธ์ ํ์ ์ ํ์ & .inner
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋งค์ฐ ์ทจ์ฝํฉ๋๋ค(๋ด ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ๊ทธ๊ฒ์ ์ฝ๋ ์ผ์ด์ค๊ฐ ์๋๋๋ค ... ๊ทธ๊ฒ์ ๋์๊ฒ ๋ช ๋ฒ ์ผ์ด๋ฌ์ต๋๋ค). ๋ ๊ฐ์ง ๊ฐ๋ฅํ ์๋ฃจ์
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
&.inner
๋ฅผ ์ฌ์ฉํ ๋ค์ ๋ชจ๋ ๊ณณ์์ ${props.className}.inner
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ฌ๋ฌ ๋ฒํ๊ณ ์ฐ๊ธฐ๊ฐ ๊ณ ํต ์ค๋ฝ์ต๋๋ค.> .inner
๋ฅผ ์ฌ์ฉํ์ง๋ง ๊ตฌ์ฑ ์์ ๊ตฌ์กฐ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ์ค๊ฐ์ div
๋ฅผ ์ถ๊ฐํ๋ฉด ๋์ด์ง๋๋ค.JSS๊ฐ ์ธ๊ธฐ๊ฐ ์๋ ๊ฒ์ ์ฌ์ค์
๋๋ค. ๋๋ MUI ๋๋ฌธ์ ๊ทธ๊ฒ์ ๋ํด ๋ฐฐ์ ์ต๋๋ค. ๊ทธ๋ฌ๋ styled-components
๋ก ์ค๋ ์๊ฐ ์์
ํ ํ MUI ์คํ์ผ์ ์ ๊ทผ ๋ฐฉ์์ด ์ ์ ํ๊ณ ์์
ํ๊ธฐ๊ฐ ๋ ์ฝ๋ค๋ ๊ฒ์ ์์์ต๋๋ค. HOC ... ์ ์ด๋ ๊ทธ๊ฒ์ ๋ด ๊ฐ์ธ์ ์ธ ๊ฒฝํ์
๋๋ค). ๊ฐ์ ์ ํ์ฌ ์ ๊ทผ ๋ฐฉ์๊ณผ ๋ค์ ์ผ์นํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทํ์ ์๊ฒฌ๊ณผ ํน์ ๊ฒฝ์ฐ์ JSS ์ฑ๋ฅ์ ๋ํ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ฅผ ์ฝ์ ํ ๋์์ธ ์์คํ
์ ๊ฐ์ ์ ์ฌ์ฉํ ์ง ํ๊ฐํ๊ณ ์์ต๋๋ค.
๊ทธ๋ฌ๋ styled-components
์ ๋ํด ํ์ ์ ๊ฐ๊ณ ์๋ ๊ฒ์ ๋ณด๋ classes
์ํ์ ์ฌ์ฉํ์ฌ ์คํ์ผ ์ฌ์ฉ์ ์ ์๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ ๋ง์ ์๋ฅผ ๋ณด๊ณ ์ถ์ต๋๋ค. ํ์ฌ MUI ๋ฌธ์์์ ์ฌ์ฉํ ์ ์๋ ๋ฌธ์๋ ์์์ ์ธ๊ธํ ๋ฌธ์ ๋ฅผ ๊ณต์ ํฉ๋๋ค.
ํด๋์ค ์ํ๊ณผ ํจ๊ป styled-components
๋ฅผ ์ฌ์ฉํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ๊ทธ๊ฒ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ธ์?
JSS๋ ์ถฉ๋ถํ ํ๋ฅญํ๊ณ ์ฌ์ฉํ๊ธฐ ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค. ์ด์ฌ๋ฅผ ๊ฐ์ผ ํ๋ ๊ฐ๋ ฅํ ์ด์ ๊ฐ ์์ต๋๊น?
๊ฐ์ธ์ ์ผ๋ก ๋๋ styled-component๊ฐ ์ผ์ข ์ ํํด๋ผ๊ณ ์๊ฐํ๊ณ JSS๊ฐ ๋ด๊ฐ ์ ์งํ๊ฒ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์์ํ ์ฃผ๋ ์ด์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@powerfulj ์คํ์ผ ๊ตฌ์ฑ ์์๋ณด๋ค JSS๋ฅผ ์ ํธํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋๋ ๋ ๊ฐ์ง ์ค ํ๋๋ฅผ ์ ํํด์ผ ํ๊ณ style-components๊ฐ ๋์๊ฒ ๋ ๋์ ๊ฒ ๊ฐ์์ต๋๋ค.
@lcswillems
๋๋ ๊ทธ๊ฒ์ด ์๋ก์ด ๊ตฌ์ฑ ์์๋ฅผ ๋์
ํ์ง ์๊ณ ๋์ ์์ฑ์ ๋ํด ์๋ํ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฒ์ ์ข์ํฉ๋๋ค. ์คํ์ผ์ด ์ง์ ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ ๊ตฌ์ฑ ์์๊ฐ ์ ๋ง๋ก ํ์ํ ๊ฒฝ์ฐ JSS ์๋ฃจ์
์ผ๋ก ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
๋ํ ์ธ๋ผ์ธ ์คํ์ผ์์ JSS ์คํ์ผ๋ก ๋ณํํ๋ ๊ฒ์ด ๋ ๋น ๋ฆ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ตฌํ ์ค์ ์ธ๋ผ์ธ ์คํ์ผ์ ์ฌ์ฉํ๊ณ ๋ ์ปค์ง๊ณ ์ฌ์ฌ์ฉ๋๋ฉด JSS๋ก ๋ณํํ๊ธฐ ๋๋ฌธ์ ์ ์๊ฒ ํธ๋ฆฌํฉ๋๋ค.
๋ถ์ ์ ์ธ ์ธก๋ฉด์ (๋ธ๋ผ์ฐ์ devtools์์์ ๊ฐ์) CSS๊ฐ ์๊ณ ์ด๋ฅผ JSS๋ก ๋ณํํด์ผ ํ๋ ๊ฒฝ์ฐ ๊ตฌ๋ฌธ์ ์กฐ์ ํ๋ ๋ฐ ๋ ๋ง์ ์๊ฐ์ ์๋นํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. styled-component๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๋น ๋ฅด๊ฒ ์งํ๋ฉ๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ๋ด ๋ฐ๊ฒฌ์ ๊ณต์ ํ๊ธฐ ์ํด.
#16947์์ ์๊ตฌํ๋ ๋๋ก ์ผ๋ถ ๋ฐ๋ชจ๋ฅผ styled-components๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ค๊ณ ํ์ต๋๋ค. ๋ฌธ์ ๋ ๊ธฐ๋ณธ ํ
๋ง์
๋๋ค. makeStyles
๋ defaultTheme๋ฅผ ์ ๋ฌํ ์ ์๋ ์ต์
์ ํ์ฉํฉ๋๋ค. defaultTheme
๋ฅผ ์ ๊ณตํ๋ makeStyles
๋ํผ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ useStyles
hook ์ ThemeProvider
๊ฐ ํ
๋ง๋ฅผ ์ ๊ณตํ๋์ง ํ์ธํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด defaultTheme
๋ฅผ ์ฃผ์
ํฉ๋๋ค.
styled-components์๋ ๊ทธ๋ฌํ ๊ธฐ๋ฅ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ThemeProvider
๊ฐ ์์ผ๋ฉด defaultTheme๋ .attrs
๋ฉ์๋๋ก๋ง ์ฃผ์
ํ ์ ์์ต๋๋ค. makeStyles
๋ํผ์ ์ ์ฌํ ๊ฒ์ ๋ง๋ค ์ ์์ต๋๋ค.
import styledWithoutDefault from 'styled-components';
import defaultTheme from './defaultTheme';
const styled = Component => {
return styledWithoutDefault(Component).attrs({ theme: defaultTheme });
};
export default styled;
๊ทธ๋ฌ๋ .attrs
๋ฉ์๋๋ ThemeProvider
์ ๊ณตํ๋ ํ
๋ง๋ฅผ ๋ฎ์ด์๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฆ
๋๋ค.
๋ ๋ค๋ฅธ ๋ฌธ์ ๋ makeStyles
๊ฐ jss-plugin-default-unit ์ฌ์ ์ค์ ์ ์ฌ์ฉํ๊ณ styled-components๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์ styled-components๋ spacing()
ํจ์์ ๊ฐ์ ๋ฐํํ๊ธฐ ์ํด px
๋ฅผ ์ถ๊ฐํ์ง ์์ต๋๋ค.
๋ง์ง๋ง ๋ฌธ์ ์ ๋ํ ๊ฐ๋ฅํ ํด๊ฒฐ์ฑ
์ styled-components๊ฐ ์๋ Styled-JSS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
์ฌ๊ธฐ์ ๊ทํ์ ์์ด๋์ด/์ ์์ด ์์ด ๊ธฐ์ฉ๋๋ค.
@fyodore82 .attrs
๋ ํจ์๋ก ์๋ํ๋ฏ๋ก(https://www.styled-components.com/docs/api#attrs ์ฐธ์กฐ) ๋ค์์ ์ํํฉ๋๋ค.
```js
.attrs(({ ํ
๋ง = defaultTheme, ...props }) => ({ ...props, ํ
๋ง }))
````
@croraf
๋๋ ๊ทธ๊ฒ์ด ์๋ก์ด ๊ตฌ์ฑ ์์๋ฅผ ๋์ ํ์ง ์๊ณ ๋์ ์์ฑ์ ๋ํด ์๋ํ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฒ์ ์ข์ํฉ๋๋ค.
Styled-components: css
prop ์ ์ ๋ง ์ข์ ์ ์ ๋์ณค๋ค๊ณ ์๊ฐํฉ๋๋ค. CSS๋ฅผ ์๋ก ๋ง๋ค ํ์ ์์ด ๊ตฌ์ฑ ์์์ CSS๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๋ํ ์ธ๋ผ์ธ ์คํ์ผ์์ JSS ์คํ์ผ๋ก ๋ณํํ๋ ๊ฒ์ด ๋ ๋น ๋ฆ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ตฌํ ์ค์ ์ธ๋ผ์ธ ์คํ์ผ์ ์ฌ์ฉํ๊ณ ๋ ์ปค์ง๊ณ ์ฌ์ฌ์ฉ๋๋ฉด JSS๋ก ๋ณํํ๊ธฐ ๋๋ฌธ์ ์ ์๊ฒ ํธ๋ฆฌํฉ๋๋ค.
CSS prop์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ CSS prop์ด ์๋ ๊ตฌ์ฑ ์์์๋ style
์์ฑ์ด ์๊ณ , ์ด๋ฏธ ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๋ก ๋ณํ๋์ด ์์ผ๋ฏ๋ก class
๊ฐ ์์ต๋๋ค. CSS๊ฐ ๋ ์ปค์ง๊ณ ์ฌ์ฌ์ฉ๋๋ฉด ์ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ค ์๋ ์์ต๋๋ค.
๋ถ์ ์ ์ธ ์ธก๋ฉด์ (๋ธ๋ผ์ฐ์ devtools์์์ ๊ฐ์) CSS๊ฐ ์๊ณ ์ด๋ฅผ JSS๋ก ๋ณํํด์ผ ํ๋ ๊ฒฝ์ฐ ๊ตฌ๋ฌธ์ ์กฐ์ ํ๋ ๋ฐ ๋ ๋ง์ ์๊ฐ์ ์๋นํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. styled-component๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๋น ๋ฅด๊ฒ ์งํ๋ฉ๋๋ค.
๋์ํ๋ค. ์ด๊ฒ์ด ๋ด๊ฐ ๊ทธ๊ฒ์ ์ฌ์ฉํ์ง ์์ ์ฃผ๋ ์ด์ ์ ๋๋ค. ์จ๋ผ์ธ์ผ๋ก ์์ฑ๋ CSS์ ๋๋ถ๋ถ์ JSS๊ฐ ์๋ CSS๋ก ์์ฑ๋ฉ๋๋ค. ๋ฐ๋ผ์ StackOverflow์ ์ผ๋ถ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ JSS๋ก ๋ณํํด์ผ ํฉ๋๋ค. ์ด๋ ๋งค์ฐ ๊ณ ํต์ค๋ฌ์ด ์์ ์ ๋๋ค.
Styled-components๋ฅผ ์ฌ์ฉํ๊ฒ ๋ง๋ ๋ค๋ฅธ ์ถ๊ฐ ์ธ์:
JSS ๋ฒ์ :
import React from 'react';
import { makeStyles, useTheme } from '@material-ui/core/styles';
import Card from '@material-ui/core/Card';
import CardContent from '@material-ui/core/CardContent';
import CardMedia from '@material-ui/core/CardMedia';
import IconButton from '@material-ui/core/IconButton';
import Typography from '@material-ui/core/Typography';
import SkipPreviousIcon from '@material-ui/icons/SkipPrevious';
import PlayArrowIcon from '@material-ui/icons/PlayArrow';
import SkipNextIcon from '@material-ui/icons/SkipNext';
const useStyles = makeStyles(theme => ({
card: {
display: 'flex',
},
details: {
display: 'flex',
flexDirection: 'column',
},
content: {
flex: '1 0 auto',
},
cover: {
width: 151,
},
controls: {
display: 'flex',
alignItems: 'center',
paddingLeft: theme.spacing(1),
paddingBottom: theme.spacing(1),
},
playIcon: {
height: 38,
width: 38,
},
}));
export default function MediaControlCard() {
const classes = useStyles();
const theme = useTheme();
return (
<Card className={classes.card}>
<div className={classes.details}>
<CardContent className={classes.content}>
<Typography component="h5" variant="h5">
Live From Space
</Typography>
<Typography variant="subtitle1" color="textSecondary">
Mac Miller
</Typography>
</CardContent>
<div className={classes.controls}>
<IconButton aria-label="previous">
{theme.direction === 'rtl' ? <SkipNextIcon /> : <SkipPreviousIcon />}
</IconButton>
<IconButton aria-label="play/pause">
<PlayArrowIcon className={classes.playIcon} />
</IconButton>
<IconButton aria-label="next">
{theme.direction === 'rtl' ? <SkipPreviousIcon /> : <SkipNextIcon />}
</IconButton>
</div>
</div>
<CardMedia
className={classes.cover}
image="/static/images/cards/live-from-space.jpg"
title="Live from space album cover"
/>
</Card>
);
}
์คํ์ผ ๊ตฌ์ฑ ์์ ๋ฒ์ :
import React from 'react';
import styled from 'styled-components';
import { useTheme } from '@material-ui/core';
import MuiCard from '@material-ui/core/Card';
import MuiCardContent from '@material-ui/core/CardContent';
import MuiCardMedia from '@material-ui/core/CardMedia';
import IconButton from '@material-ui/core/IconButton';
import Typography from '@material-ui/core/Typography';
import SkipPreviousIcon from '@material-ui/icons/SkipPrevious';
import MuiPlayArrowIcon from '@material-ui/icons/PlayArrow';
import SkipNextIcon from '@material-ui/icons/SkipNext';
export default function MediaControlCard() {
const theme = useTheme();
return (
<Card>
<Details>
<CardContent>
<Typography component="h5" variant="h5">
Live From Space
</Typography>
<Typography variant="subtitle1" color="textSecondary">
Mac Miller
</Typography>
</CardContent>
<Controls>
<IconButton aria-label="previous">
{theme.direction === 'rtl' ? <SkipNextIcon /> : <SkipPreviousIcon />}
</IconButton>
<IconButton aria-label="play/pause">
<PlayArrowIcon />
</IconButton>
<IconButton aria-label="next">
{theme.direction === 'rtl' ? <SkipPreviousIcon /> : <SkipNextIcon />}
</IconButton>
</Controls>
</Details>
<CardMedia
image="/static/images/cards/live-from-space.jpg"
title="Live from space album cover"
/>
</Card>
);
}
const Card = styled(MuiCard)`
display: flex;
`
const Details = styled.div`
display: flex;
flex-direction: column;
`
const CardContent = styled(MuiCardContent)`
flex: 1 0 auto;
`
const CardMedia = styled(MuiCardMedia)`
width: 151px;
`
const Controls = styled.div`
display: flex;
align-items: center;
padding-left: ${props => props.theme.spacing(1)}px;
padding-bottom: ${props => props.theme.spacing(1)}px;
`
const PlayArrowIcon = styled(MuiPlayArrowIcon)`
height: 38px;
width: 38px;
`
๋ง์ง๋ง์ผ๋ก JSS๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค.
css ์์ฑ์ ๋งค์ฐ ํ๋ฅญํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด๊ฐ ์ธ๊ธํ ๋จ์ ์ ํด๊ฒฐํฉ๋๋ค. (copycats form styled-components :D )
๋ ๊ฐ์ง ์์ ๋น๊ต์ ๊ด๋ จํ์ฌ ์ฝ๊ธฐ๊ฐ ์ฝ์ง ์์ผ๋ฉฐ ๊ตฌ์ฑ ์์ ์๊ฐ ๋ ๋ฐฐ๋ก ๋์ด๋ฉ๋๋ค.
@lcswillems
ํ๋์ ์๋ฃจ์ ๋๋ ๋ค๋ฅธ ์๋ฃจ์ ์ ๋ํด ๋ ผ์ํ์ง ์๊ณ ๋ช ๊ฐ์ง ์์ ์ ์ ํํ์ญ์์ค.
StackOverflow์ ์ผ๋ถ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ JSS๋ก ๋ณํํด์ผ ํฉ๋๋ค. ์ด๋ ๋งค์ฐ ๊ณ ํต์ค๋ฝ์ต๋๋ค.
ํญ์ ์๋ฒฝํ๊ฒ ์๋ํ๋ ๊ฒ์ ์๋์ง๋ง CSS๋ฅผ CSS-in-JS๋ก ๋ณํํ๊ธฐ ์ํ VSCode ํ์ฅ์ด ์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋๋ ๊ทธ๊ฒ์ ๊ณ ํต์ค๋ฝ๊ฒ ๋ถ๋ฅด์ง ์์ ๊ฒ์ ๋๋ค.
๊ตฌ๋ฌธ ๊ฐ์กฐ ํ์๊ฐ ์์ต๋๋ค.
์ ๋ ์ด ์ฃผ์ฅ์ด ์ ์ดํด๊ฐ ๋์ง ์์ต๋๋ค. JS ๊ฐ์ฒด์ผ ๋ฟ์ด๋ฏ๋ก ๋ชจ๋ ํธ์ง๊ธฐ์ ๊ตฌ๋ฌธ ๊ฐ์กฐ ํ์๊ฐ ์๋ํฉ๋๋ค.
(ํ์ง๋ง ์๋ง๋ ๋น์ ์ ๋ ๊ตฌ์ฒด์ ์ธ ๊ฒ์ ์ฐพ๊ณ ์์ต๋๊น?)
๋ ์์ ์ ๋น๊ต์ ๊ด๋ จํ์ฌ ํจ์ฌ ๋ ์ฝ๊ธฐ ์ฝ์ง ์์ต๋๋ค. className props์ ๋ถ์กฑ์ ํ๋ฆผ์์ด ๊นจ๋ํ์ง๋ง ๊ตฌ์ฑ ์์๊ฐ MUI ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์๋ฅผ ์ฐธ์กฐํ๋์ง ์๋๋ฉด styled()
๊ตฌ์ฑ ์์๋ฅผ ์ํธ ์ฐธ์กฐํ ํ์ ์์ด ์คํ์ผ์ด ๋ณ๊ฒฝ๋ ๊ตฌ์ฑ ์์๋ฅผ ์ฐธ์กฐํ๋์ง ๊ธฐ๋ณธ JSX ์ฝ๋ ๋ธ๋ก์์ ๋ช
ํํ์ง ์์ต๋๋ค. ๋ ํฐ ๊ตฌ์ฑ ์์์์๋ ์ด๊ฒ๋ค์ ๋ฉ๋ฆฌ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
styled()
ํธ์ถ์ (์ ๋ฅผ ์ํด) JSS ๊ฐ์ฒด๋ณด๋ค ์ฝ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
@powerfulj ์คํ์ผ ๊ตฌ์ฑ ์์๋ณด๋ค JSS๋ฅผ ์ ํธํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋๋ ๋ ๊ฐ์ง ์ค ํ๋๋ฅผ ์ ํํด์ผ ํ๊ณ style-components๊ฐ ๋์๊ฒ ๋ ๋์ ๊ฒ ๊ฐ์์ต๋๋ค.
์ ๋ Typescript ๊ฐ๋ฐ์์ด๊ณ Typescript ๊ฐ์ฒด์์ ๋ชจ๋ ๊ฒ์ ๋น๋ํ๋ ๊ฒ์ ์ ํธํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ํนํ ๋๋ ์คํธ๋ง์ ์ซ์ดํ๋ค.
์ฐจ์ด์ ๋๋ฌธ์ CSS ์ฝ๋๋ฅผ JSS ์ฝ๋๋ก ์ ์กํด์ผ ํ์ง๋ง ๊ตฌ์กฐ๊ฐ ๊ธฐ์กด CSS(ํด๋์ค ์งํฅ)์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ JSS ์ฝ๋๋ฅผ ์ฝ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ์ฌ๊ธฐ ์ ๊ธฐ์ ์์ ์ ์์ต๋๋ค.
๋๋ ์ฌ๋๋ค์ด ๊ณผ๊ฑฐ์ Styled-component์ ๋ํ ๊ฒฝํ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ณ๊ฒฝ์ ์ฃผ์ฅํ๋ค๊ณ โโ์๊ฐํฉ๋๋ค. "์ฐ๋ฆฌ์๊ฒ ์ต์ํ์ง๋ง ๋๋ ทํ ์ด์ ์ด ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํ๋ ๊ฒ์ ์ด๋จ๊น์?"๋ผ๋ ๋๋์ ์ค๋๋ค.
๋ด ๊ด์ ์์ JSS๋ ๊ทธ๋ฅ ํธ๋ฆฌํ ๊ฒ ๊ฐ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ๋ชจ๋ Javascript ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค
{
...๊ณต์ JSS1,
...๊ณต์ JSS2,
๋ฌด์์ด๋
}
๋ํ ์ ํ๊ณผ ํตํฉ๋ ๋งค๋๋ฌ์ด ๋์ ํ ๋ง๊ฐ ์์ผ๋ฉฐ className ๋ฐ css ์ ํ ๋ชจ๋์์ ๋ชจ๋ ์ ํ ํํธ๋ฅผ ์ป์์ต๋๋ค.
์๋ก์ด ๊ฐ๋ฐ์์ ๊ฒฝ์ฐ ํนํ Typescript ๊ฐ๋ฐ์๋ ๋จ์ํ JSS๋ฅผ ์ข์ํ ๊ฒ์ ๋๋ค.
์ฐธ๊ณ ๋ก, ๋ชจ๋ ํญ๋ชฉ์ ๋ํด ํญ์ ๋ณ๋์ ๊ตฌ์ฑ ์์๋ฅผ ์ํ์ง ์๋ ๊ฒฝ์ฐ ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์์์ ์ผ๋ถ ์ค์ฒฉ์ ์ํํ ์ ์์ต๋๋ค. ์๋ฏธ ์๋ ์ด๋ฆ์ ๊ฐ์ง ๋ณ๋์ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด styled-components ์ฒ ํ์ ๋ฐ๋ผ ๋ ๊นจ๋ํ๊ณ ์ฝ๊ธฐ ์ฌ์ด ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋์ง ์์ง๋ง ๋ฌธ์์์๋ "์ ๊ฒ ์ฌ์ฉ"ํ๋ฉด ๊ด์ฐฎ๋ค๊ณ ๋งํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌผ๋ก ๊ทธ ์ฒ ํ์ ๊ณต์ ํ์ง ์๋ ์ฌ๋์ ๋ ๋ง์ ์ค์ฒฉ์ ์์ ๋กญ๊ฒ ํ ์ ์์ต๋๋ค. ์ค์ฒฉ์ด ์๋ฏธํ๋ ๋ฐ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
const Wrapper = styled.div`
display: block;
.inner {
flex: 1;
}
`
...
<Wrapper>
<div class="inner">...</div>
</Wrapper>
์์ธํ ๋ด์ฉ์ https://www.styled-components.com/docs/faqs#can -i-nest-rules๋ฅผ ์ฐธ์กฐํ์ธ์.
์ฝ๋ฉ ์คํ์ผ ๊ธฐ๋ณธ ์ค์ ์ ๋ํ ํ ๋ก ์ ์์ํ ๊ณ์๋ ์ ์์ต๋๋ค.
์ ์ ๋์ styled-components
๋ฅผ ์ฌ์ฉํ ํ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก JSS ์ ๊ทผ ๋ฐฉ์์ด ๋ ๋ง์์ ๋ญ๋๋ค.
styled-components
๋ก๋ ๊ทธ๋ ๊ฒ ํ๊ณ useStyles
/ makeStyles
๊ฐ ์ฐ๊ธฐ, ์ฝ๊ธฐ ๋ฐ ์ ์ง ๊ด๋ฆฌ๊ฐ ๋ ์ฝ๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ์. import useStyles from './MyComp.styles'
vs import {XStyled, YStyled,...} from './MyComp.styles'
... TS์์ ์
๋ ฅํ๋ ...Styled
๋ณํ์ ์ ์งํ๋ ๊ฒ์ ์ฑ๊ฐ์ ์ผ์
๋๋ค.styled-components
๋ฅผ ์ฌ์ฉํ ๋ ๋ด๋ถ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ํํ์ง๋ง(@mbrowne์ ์์์์ ๊ฐ์ด) ๋ ๋ง์ ๋ฆฌํฉํ ๋ง ์์
์ด ํ์ํฉ๋๋ค. ์ ๋ useStyles
์ ๊ทผ ๋ฐฉ์์ด ํด๋น ์ํฌํ๋ก๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ํจ์ฌ ๋ ํธ์ํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค.ํ์ง๋ง ์ด๊ฑด ์ ๊ฐ์ธ์ ์ธ ์ทจํฅ์ด๋ ์ฌ๋ฌ๋ถ๋ค์ ์ทจํฅ์ ๋ค๋ฅผ ์ ์์ต๋๋ค.
๊ฐ์ฅ ํฐ ๋ฏธํด๊ฒฐ ์ง๋ฌธ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ classes
์ฌ์ฉ์
๋๋ค.
className
๋ฐ ๋ด๋ถ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ์์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค(์ด์ ์๊ฒฌ ์ฐธ์กฐ). $# styled-components
์ css
์ํ์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ต์
์ด ์๋๋๋ค. ๊ฐ์ ์ css
ํจ์์ ๋ฌ๋ฆฌ css
์ํ์ ๊ตฌ์ฑ ์์์ ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํฉ๋๋ค(์ฆ, useStyle/makeStyles/classes
์ฝ๋ ์คํ์ผ์์๋ ์ฌ์ฉํ ์ ์์).
๊ตฌ์ฑ ์์์ ์คํ์ผ์ ์ถ๊ฐํ๋ ๊ฒ์ ์ฌ์ํ ๋์์ธ ๊ฒฐ์ ์ด ์๋๋๋ค. ๋์๊ฒ ๊ทธ๊ฒ์ JSS์ ์ข์ ์ ๊ณผ ๋์ ์ ์ ๋๋ค. ์คํ์ผ ๊ตฌ์ฑ ์์์ ๊ฐ์ ์ Babel ํ๋ฌ๊ทธ์ธ์ ์์กดํ๊ณ SSR์ ๋ํ ์บ์ฑ ๋ฐ ํด๋์ค ์ด๋ฆ ์์ฑ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด React์ ์ํธ ์์ฉํฉ๋๋ค. JSS์ ์ข์ ์ ์ Babel ํ๋ฌ๊ทธ์ธ์ด ํ์ํ์ง ์๋ค๋ ๊ฒ์ ๋๋ค. ๋์ ๋ถ๋ถ์ JSS์ SSR์ด ๋ ๋ง์ ์์ ์ ํ์๋ก ํ๊ณ ๊ทธ ์์ญ์์ ๋ณด๊ณ ๋ ๋ฒ๊ทธ๋ฅผ ๋ณธ ์ ์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
MUI๋ก ๋์๊ฐ์ ์คํ์ผ ๊ตฌ์ฑ ์์๋ฅผ ์ฑํํ๋ค๋ ๊ฒ์ ์คํ์ผ์ ์ฌ์ฉ์ ์ ์ํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ผ๋ก className
๋ฐ ๋ด๋ถ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฏธํ๋ค๋ ์ธ์์ ๋ฐ์์ต๋๋ค. ์คํ์ผ์ ํ๋ ์์ํฌ ์ ์ฒด์์ ๋์ฑ ์ผ๊ด๋ฉ๋๋ค. ๊ตฌ์ฑ ์์๊ฐ className
๋ฅผ ์ฌ์ฉํ๋ ํ styled
๋๋ css
์ํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋์๊ฒ classes
์ํ์ ์ ๊ฑฐํ๋ ๊ฒ์ ๋ค๋ก ๋ฌผ๋ฌ๋๋ ๊ฒ์
๋๋ค. ์ด ์ํ์ ๊ฒ์ฌ ์คํ์ผ ์ฌ์ฉ์ ์ ์๋ฅผ ๋ฌธ์ํํ๊ณ ์
๋ ฅํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. styled-components๋ฅผ ์ฌ์ฉํ์ง๋ง classes
์ ๋ํ ์ง์์ ์ ์งํ๋ ๊ฒ๊ณผ ๊ฐ์ด ์ค๊ฐ ์ง์ ์ ์ฐพ๋ ๊ฒ์ด ๊ฐ๋ฅํ ์๋ ์์ต๋๋ค(๋ด๋ถ ํด๋์ค ํดํน ํ์ ์์ด). ๊ทธ๋ฐ ๊ฒฝ์ฐ์ ๋์์ด ๋๋ styled-components API์์ ์๋ฌด ๊ฒ๋ ์ฐพ์ ์ ์์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ JSS์ ๊ธฐ์ ์ ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ํ๊ฐํ๋ ๊ฒ์ด ์ข์ ์ ์์ต๋๋ค. ์ธ๊ธฐ๊ฐ ์ฃผ์ ๋ฌธ์ ๋ผ๋ฉด ๊ฐ์ ๋ ๋์คํ๋๊ณ ์์ผ๋ฉฐ(https://2019.stateofcss.com/technologies/css-in-js/#tools-section-overview ์ฐธ์กฐ) makeStyles
๋ค์ ์์ฑํฉ๋๋ค.
@dfernandez-asapp ์ด fwiw @styled-components๋ https://www.styled-components.com/docs/advanced# ๋ฌธ์์ด ๋์ jss์ ์ ์ฌํ ๊ฐ์ฒด ์ฌ์ฉ์ ์ง์ํฉ๋๋ค.
์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๊ฐ ์ผ๊ธ ์ ํ ์คํฌ๋ฆฝํธ ์ง์์ ์ ๊ฑฐํ ๊ฒ์ด ์๋นํ ์ค๋ง์ค๋ฝ๊ธด ํ์ง๋ง ์ ๋ฐ์ ์ผ๋ก ๊ทํ๊ฐ ์ค๋ช ํ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ํ ๊ฑธ์ ๋ฌผ๋ฌ๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค.
์ฐธ๊ณ ๋ก, ๋ชจ๋ ํญ๋ชฉ์ ๋ํด ํญ์ ๋ณ๋์ ๊ตฌ์ฑ ์์๋ฅผ ์ํ์ง ์๋ ๊ฒฝ์ฐ ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์์์ ์ผ๋ถ ์ค์ฒฉ์ ์ํํ ์ ์์ต๋๋ค. ์๋ฏธ ์๋ ์ด๋ฆ์ ๊ฐ์ง ๋ณ๋์ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด styled-components ์ฒ ํ์ ๋ฐ๋ผ ๋ ๊นจ๋ํ๊ณ ์ฝ๊ธฐ ์ฌ์ด ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋์ง ์์ง๋ง ๋ฌธ์์์๋ "์ ๊ฒ ์ฌ์ฉ"ํ๋ฉด ๊ด์ฐฎ๋ค๊ณ ๋งํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌผ๋ก ๊ทธ ์ฒ ํ์ ๊ณต์ ํ์ง ์๋ ์ฌ๋์ ๋ ๋ง์ ์ค์ฒฉ์ ์์ ๋กญ๊ฒ ํ ์ ์์ต๋๋ค. ์ค์ฒฉ์ด ์๋ฏธํ๋ ๋ฐ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
const Wrapper = styled.div` display: block; .inner { flex: 1; } ` ... <Wrapper> <div class="inner">...</div> </Wrapper>
์์ธํ ๋ด์ฉ์ https://www.styled-components.com/docs/faqs#can -i-nest-rules๋ฅผ ์ฐธ์กฐํ์ธ์.
์ด์ ๋ํ ์ง์ ์ ํ์ด ์์ต๋๊น? ์๋๋ฉด ๋ชจ๋ ๊ณณ์ ๋ฌธ์์ด์ ๋ฃ์ด์ผ ํฉ๋๊น?
์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์์ ๋ํด ์ ๊ทธ๋ ๊ฒ ๋ง์ ๊ณผ๋ ๊ด๊ณ ๊ฐ ์๋์ง ์ดํดํ ์ ์์ต๋๋ค. ์ ์งํ๊ฒ ํ ๋ฐ์ง ๋ฌผ๋ฌ๋ ๋๋์ ๋๋ค. TypeScript๋ฅผ ์ฌ์ฉํ๋ JSS์ ์ ํ์ด ์ง์ ๋ CSS ์์ฑ์ ํจ์ฌ ๋ ํธ๋ฆฌํ๊ณ ์ ์ง ๊ด๋ฆฌ๊ฐ ๋ ์ฌ์ฐ๋ฉฐ JS์ ์ผ๋ถ๋ก ๊ตฌ๋ฌธ ๊ฒ์ฌ๊ฐ ์์ต๋๋ค. ์ต์ /๊ตฌ์ฑ๋ ํธ์ง๊ธฐ๋ ์คํ๊ฐ ์๋์ง ์๋ ค์ฃผ๊ณ ์ํ๋ ๊ฒฝ์ฐ ์๋ ์์ฑ์ ๋์์ค๋๋ค.
ํธ์ง: ์ ๋ ฅ๋์์ต๋๋ค. ์๋ South-Paw์ ๋ต๋ณ์ ์ฐธ์กฐํ์ธ์.
@martinjlowm ์ด ๋์๊ฒ ํ์ดํ์ ํ ๊ฒ ๊ฐ์ต๋๊น?
์ฐธ์กฐ: https://styled-components.com/docs/advanced#style -objects
๋น์ ์ ๊ณผ๋ ๊ด๊ณ ๋ฅผ ์ดํดํ์ง ๋ชปํ๋ค๊ณ ๋งํ์ง๋ง... ์ ๋ ๊ทธ๊ฒ์ด ๋ฐ๋ ๋ชจ๋ ์ฆ์ค๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ๐คทโโ
๊ฐ์ ๋ฐ ์คํ์ผ ๊ตฌ์ฑ ์์๋ CSS ์คํ์ผ ๊ฐ์ฒด์ ๋นํด ํฌ๊ฒ ๊ฐ์ ๋์์ต๋๋ค. IMO
@martinjlowm ์ด ๋์๊ฒ ํ์ดํ์ ํ ๊ฒ ๊ฐ์ต๋๊น?
...
์ฐธ์กฐ: https://styled-components.com/docs/advanced#style -objects
๋น์ ์ ๊ณผ๋ ๊ด๊ณ ๋ฅผ ์ดํดํ์ง ๋ชปํ๋ค๊ณ ๋งํ์ง๋ง... ์ ๋ ๊ทธ๊ฒ์ด ๋ฐ๋ ๋ชจ๋ ์ฆ์ค๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ๐คทโโ
๊ฐ์ ๋ฐ ์คํ์ผ ๊ตฌ์ฑ ์์๋ CSS ์คํ์ผ ๊ฐ์ฒด์ ๋นํด ํฌ๊ฒ ๊ฐ์ ๋์์ต๋๋ค. IMO
๋ด๊ฐ ์ฐธ์กฐ! ๋๋ ๊ทธ๊ฒ์ด ๊ทธ๋ฐ ๊ฐ์ฒด๋ฅผ ์ง์ํ๋ค๋ ๊ฒ์ ์์ง ๋ชปํ์ต๋๋ค. ๋ด ๊ด์ฌ์ฌ๋ ํ ํ๋ฆฟ ๋ฌธ์์ด์ CSS์ ๊ด๋ จ์ด ์์ง๋ง ๊ฐ์ฒด๊ฐ ์ต์ ์ด๋ผ๋ฉด ๋ฐ๋ํ ๊ฒ์ด ์์ต๋๋ค!
๋ถ๋ช ํ JSS๋ ์๋ฒฝํ์ง ์์ต๋๋ค. ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ฒ ์์ฑ ์ํธ๊ฐ โโํฌ๋ฌ ๊ธฐ๋ฅ์ด ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๋๋ค. styled-component๋ ์ด๋ป๊ฒ๋ ์ด๋ฅผ ์ง์ํฉ๋๊น? ์๋ ์ฌ๋ ์๋์?
์ง๊ธ ๋น์ฅ์ ์๋ฒ์์ ์์ฑํ ์คํ์ผ์ํธ๋ฅผ ์ญ์ ํ๊ณ ํด๋ผ์ด์ธํธ๊ฐ ๋ชจ๋ ์คํ์ผ์ ๋ค์ ๋ ๋๋งํ๋๋ก ํ๋ ๊ฒ์ ์ด๋ฆฌ์์ ์ผ์ ๋๋ค.
@martinjlowm ์ด ๋์๊ฒ ํ์ดํ์ ํ ๊ฒ ๊ฐ์ต๋๊น?
...
์ฐธ์กฐ: https://styled-components.com/docs/advanced#style -objects
๋น์ ์ ๊ณผ๋ ๊ด๊ณ ๋ฅผ ์ดํดํ์ง ๋ชปํ๋ค๊ณ ๋งํ์ง๋ง... ์ ๋ ๊ทธ๊ฒ์ด ๋ฐ๋ ๋ชจ๋ ์ฆ์ค๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ๐คทโโ
๊ฐ์ ๋ฐ ์คํ์ผ ๊ตฌ์ฑ ์์๋ CSS ์คํ์ผ ๊ฐ์ฒด์ ๋นํด ํฌ๊ฒ ๊ฐ์ ๋์์ต๋๋ค. IMO๋ด๊ฐ ์ฐธ์กฐ! ๋๋ ๊ทธ๊ฒ์ด ๊ทธ๋ฐ ๊ฐ์ฒด๋ฅผ ์ง์ํ๋ค๋ ๊ฒ์ ์์ง ๋ชปํ์ต๋๋ค. ๋ด ๊ด์ฌ์ฌ๋ ํ ํ๋ฆฟ ๋ฌธ์์ด์ CSS์ ๊ด๋ จ์ด ์์ง๋ง ๊ฐ์ฒด๊ฐ ์ต์ ์ด๋ผ๋ฉด ๋ฐ๋ํ ๊ฒ์ด ์์ต๋๋ค!
๋ถ๋ช ํ JSS๋ ์๋ฒฝํ์ง ์์ต๋๋ค. ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ฒ ์์ฑ ์ํธ๊ฐ โโํฌ๋ฌ ๊ธฐ๋ฅ์ด ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๋๋ค. styled-component๋ ์ด๋ป๊ฒ๋ ์ด๋ฅผ ์ง์ํฉ๋๊น? ์๋ ์ฌ๋ ์๋์?
์ง๊ธ ๋น์ฅ์ ์๋ฒ์์ ์์ฑํ ์คํ์ผ์ํธ๋ฅผ ์ญ์ ํ๊ณ ํด๋ผ์ด์ธํธ๊ฐ ๋ชจ๋ ์คํ์ผ์ ๋ค์ ๋ ๋๋งํ๋๋ก ํ๋ ๊ฒ์ ์ด๋ฆฌ์์ ์ผ์ ๋๋ค.
๋ํ ํ๊ทธ๊ฐ ์ง์ ๋ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด๋ ์ ๋ ฅํ ์ ์์์ ๋ช ํํ ํ๊ณ ์ถ์ต๋๋ค. TypeScript๋ ์๋ชป๋ ๊ฒ์ผ๋ก ์ฌ๋ฐ๋ฅด๊ฒ ํ์ํ๊ณ ์ธ์ด ์๋น์ค๋ ์๋ ์์ฑ ์ ์ ๋ฑ์ ์ ๊ณตํฉ๋๋ค.
@์ข์ ํฌ์
๊ฐ์ ๋ฐ ์คํ์ผ ๊ตฌ์ฑ ์์๋ CSS ์คํ์ผ ๊ฐ์ฒด์ ๋นํด ํฌ๊ฒ ๊ฐ์ ๋์์ต๋๋ค. IMO
๋๋ ์ฌ์ ํ ์ด๋ค React ๊ฐ๋ฐ์๊ฐ ์ด๊ฒ์ ์ฐธ์ฌํ๋์ง ํผ๋์ค๋ฝ์ต๋๋ค. CSS๋ฅผ ํ ํ๋ฆฟ ๋ฌธ์์ด์ ๋ฃ์ผ๋ ค๋ฉด Angular๋ฅผ ์ฌ์ฉํ๊ณ HTML๋ ํ ํ๋ฆฟ ๋ฌธ์์ด์ ๋ฃ์ง ์์ต๋๊น? React์ ์ฅ์ ์ JSX ์์๊ฐ ์ค์ ๋ก๋ ๊ฒ์ฌํ๊ณ ๋ณํํ ์ ์๋ ์์ฒญ๋ ๊ถํ์ด ์๋ JS ๊ฐ์ฒด์ด๋ฉฐ JSS๋ ๋ง์ฐฌ๊ฐ์ง๋ผ๋ ๊ฒ์ ๋๋ค.
JS ์์ง์์์ CSS๋ฅผ ์ฃผ๋ํ๋ ๋ชจ๋ ๊ฒ์ JS๊ฐ ๋์ ์์ ์ ์ํํ๋ CSS๋ณด๋ค ํจ์ฌ ๋ฐ์ด๋๊ณ JS ๊ฐ์ฒด์ ํ์ด ์์ ๋ถ๋ถ์ด ์๋๋ผ๋ ์ฌ์ค์ ๋๋ค.
styled-components
๊ฐ ๊ฐ์ฒด๋ฅผ ์ง์ํ๋ค๋ ์ฌ์ค์ ์ผ์ข
์ ๋ถ์ ์ฒญ์ด์
๋๋ค.
{
color: 'black',
'&$error': {
color: 'red'
}
}
์ฌ์ง์ด ๊ฐ์ ์ ์คํ์ผ ๊ฐ์ฒด์ ๊ฐ์น๋ฅผ ์กด์คํ๊ณ ์ด๋ฅผ ์ผ๋ฅ ์๋ฏผ์ผ๋ก ์ทจ๊ธํฉ๋๋ค.
์ฌ๋ฌผ๋ก ์คํ์ผ์ ์ฐ๋ ๊ฒ์ ๊ฐ์ ์ ํต์ฌ์ ์ง์ ๊ตฌ์ถ๋ ๊ฐ๋ ฅํ ํจํด์ ๋๋ค.
@lcswillems ๋น์ ์ ์ด ๋ชจ๋ ์์ HOC๋ฅผ ํญ์ ์์ฑํ๋ ๊ฒ์ด ์ผ๋ง๋ ๋ฒ๊ฑฐ๋ก์ด์ง ๊ณผ์ํ๊ฐํ๊ณ ์์ต๋๋ค(๊ทธ๋ฆฌ๊ณ ๋๋ถ๋ถ์ ์๋ ๊ฐ์ ธ์ค๊ธฐ ์์คํ
์ด @material-ui/core/Card
๋ฅผ Card
๋ก ๊ฐ์ ธ์ฌ์ง ์ฌ๋ถ๋ฅผ ์๋งํผ ๋๋ํ์ง ์๋ค๋ ์ฌ์ค) MuiCard
(๊ทธ๋ฆฌ๊ณ ์ฌ์ ํ import ๋ฌธ์ ์ง์ ์์ฑํ๋ ๊ฒฝ์ฐ ์๊ฐ์ ์ฌ๊ฐํ๊ฒ ๋ญ๋นํ๊ณ ์๋ ๊ฒ์
๋๋ค))
const Card = styled(MuiCard)`
display: flex;
`
const Details = styled.div`
display: flex;
flex-direction: column;
`
const CardContent = styled(MuiCardContent)`
flex: 1 0 auto;
`
const CardMedia = styled(MuiCardMedia)`
width: 151px;
`
์ด๋ฌํ ์ข ๋ฅ์ ์ผ์ ๊ฐ ๋ํผ์ ๋ํ๋ ๊ตฌ์ฑ ์์์ ์ด๋ฆ์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ์ง์์ ์ผ๋ก ๊ฒฐ์ ํด์ผ ํ๋ฏ๋ก ๋์ฐํ ๊ฒฐ์ ํผ๋ก๋ฅผ ์ ๋ฐํฉ๋๋ค.
์ด๊ฒ์ด @dfernandez-asapp์ด ๋ค์๊ณผ ๊ฐ์ด ๋งํ ๋ ๋งํ๋ ๊ฒ์ ๋๋ค.
(์ ์ ํ์ Styled HOC๋ฅผ ์ฌ๋ฐฉ์ ๋๋ ๊ฒ์ ๋ง์ ์ถ๊ฐ ์์ ์ ์ถ๊ฐํ๊ณ ๋๋ ๊ทธ HOC๋ฅผ ์ซ์ดํ๊ธฐ ์์ํ์ต๋๋ค... ์ ์ด๋ ๊ทธ๊ฒ์ ์ ๊ฐ์ธ์ ์ธ ๊ฒฝํ์ ๋๋ค)
HOC๋ ๊ฑฐ์ ์ฃฝ์ด์ผ ํฉ๋๋ค. ๊ตฌ์ ํจํด์
๋๋ค. ์๋ฅผ ๋ค์ด, react-redux
๋ connect
HOC๋ณด๋ค 100๋ฐฐ ๋ ํธ๋ฆฌํ useSelector
ํํฌ์ ํจ๊ป ๋์๊ณ Apollo๋ HOC์์ ํํฌ๋ก ์ด๋ํ์ผ๋ฉฐ useStyles
๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ withStyles
๋ณด๋ค ๋ ํธ๋ฆฌํฉ๋๋ค.
๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์ CSS๋ฅผ JSS๋ก ๋ณํํ๋ ๋ฒ๊ฑฐ๋ก์์ ํจ์ฌ ๋ ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ์ ๋๋ค. ๊ด์ฌ์ด ์๋ค๋ฉด ์๋ํ ๋๋ ์น์ฌ์ดํธ๋ฅผ ์ํ VSCode ํ์ฅ์ ๋ง๋ค ์๋ ์์ต๋๋ค.
๊ด์ฌ์ด ์๋ค๋ฉด ์๋ํ๋ฅผ ์ํด VSCode ํ์ฅ์ ๋ง๋ค ์๋ ์์ต๋๋ค.
@jedwards1211 paulmolluzzo.convert-css-in-js
๊ฐ ์์ง๋ง JSS์ฉ์ผ๋ก ๊ฐ์ ํ ์ ์๋ค๋ฉด ํ์ํ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค.
์, ํ์คํ ๊ฐ์ ํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ท์น๊ณผ ์ ํ๊ธฐ๊ฐ ์๋ CSS ์์ฑ๋ง ๋ณํํฉ๋๋ค.
@jedwards1211 ๋๋ ๋น์ ์ด ๋งํ ๊ฒ์ ์ฝ๊ณ ์ ์ ์ด ๋ชจ๋ ๊ฒ์์ ํ ๊ฑธ์ ๋ฌผ๋ฌ์์ ๊ณต๋ฐฑ ์์ ํญ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด ๋ ผ์ํ๋ ์ฌ๋๋ค์ ๋๊ธ์ ์๊ฐ๋๊ฒ ํฉ๋๋ค. ์ค์ ๋ก๋ ๋ง์ง๋ง์ ์ ์ฉํ ์ ํ์ ์์ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฌด์์ ์ฌ์ฉํ๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
Twitter ๋๋ Reddit์ ์๊ฒฌ/ํซ ํ ์ดํฌ๋ฅผ ๋จ๊ฒจ์ฃผ์๋ฉด ๊ฑฐ๊ธฐ์ ํ ๋ก ํ ์ ์์ต๋๋ค. ํ์ง๋ง ํ ํ๋ฆฟ ๋ฌธ์์ด๊ณผ CSS ๊ฐ์ฒด์ ๋ํ ๋ฌด์๋ฏธํ ๋ถ๊ฝ ์ ์์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ๊ณ์ ํ์ ์ํค์ง ๋ง์... ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์ฐ๋ฆฌ๊ฐ ๋ ๋ซ๋ค๋ ๋ฐ ๋์ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ๋ณด๋ค ๐
MUI์์ ํ์ ์ ์ง๋ฅผ ๋ณ๊ฒฝํ ๊ฐ์น๊ฐ ์๋ค๋ ์ ์ ์ง์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๐
๋ด ์ฃผ์ ๊ด์ฌ์ฌ๋ ๋ด webpack ๋ฒ๋ค์ด styled-components ์ฝ๋์ JSS ์ฝ๋์ ํผํฉ์ผ๋ก ๋ถํ์ด ์ค๋ฅด๋ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด ์ฑ์ ๊ธฐ์กด JSS๊ฐ ๋๋ฌด ๋ง์์ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋์ฒดํ๊ฑฐ๋ ๋นผ๋ด๊ณ ์ถ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด์จ๋ ์ฐ๋ฆฌ ์คํ์ผ์ ์ํ JSS.
๊ณต์ ํ๊ฒ ๋งํด์, ๋๋ ํญ๊ณผ ๊ณต๋ฐฑ์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์์ง๋ง, ๋ด๊ฐ ๋ง๋๋ ๊ฐ ๊ตฌ์ฑ ์์์ ๋ํด 6๊ฐ์ HOC๋ฅผ ์์ฑํด์ผ ํ๋ค๋ฉด ๋ด ์ผ์ ์ฆ๊ธฐ์ง ๋ชปํ ๊ฒ์ ๋๋ค. ์กด์ฌํ๋ ๋ชจ๋ ๋๊ตฌ์๋ ์ ์ฉํ ์ ํ์ ์์ฐํ ์ ์๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ๋ชจ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๊ธฐ์ ์ ๋ง ์๋ฒฝํ๊ฒ ํธ๋ฆฌํ ๊ฒ์ด ์๋ค๋ฉด ์ํ๊ณ์ ๋์์๋ ๋ณํ๊ฐ ์์ ๊ฒ์ด๊ณ ์ฐ๋ฆฌ๋ ์ด๋ฌํ ๋ ผ์์ ํ์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋์ ์๊ฐํด๋ณด๋ฉด ์ ๋ง ์ฐจ์ด๊ฐ ๋ฉ๋๋ค.
@jedwards1211 ๊ฐ์ ๋ก Styled Components๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ v4
์ ๋์
๋ ๋์ฒด css prop
๊ตฌ๋ฌธ์ด ์์ต๋๋ค. ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ต์ํ ์ด๋ ๊ฒ ํ๋ฉด ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค. ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์(MuiCard, StyledCard ๋ฑ)์ ์ ๋์ฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
import { Avatar } from '@material-ui/core';
// CSS is separate from the markup ๐
const avatarStyle = css`
width: 32px;
height: 32px;
border-radius: 50%
`;
// No wrappers, prefixes in the markup (such as <MuiAvatar>, <StyledAvatar> etc.) ๐
function SomeComponent(props) {
return <div> ... <Avatar css={avatarStyle} /> ... </div>
}
@jedwards1211 ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์์ ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋จ์ํํ ์๋ ์์ต๋๋ค.
const Card = styled(MuiCard)`
display: flex;
${MuiCardContent} {
flex: 1 0 auto;
}
${MuiCardMedia} {
width: 151px;
}
`
const Details = styled.div`
display: flex;
flex-direction: column;
`
@koistya css
์ํ์ ๋ฉ์ง ํธ์ด์ง๋ง, ์ค์ํ ์ฃผ์ ์ฌํญ์ ์ด๊ฒ์ด Babel ํ๋ฌ๊ทธ์ธ์ผ๋ก ๊ตฌํ๋์ด ๋ชจ๋ ์ฌ๋, ํนํ tsc๋ฅผ ์ฌ์ฉํ์ฌ tsx ํ์ผ์ ์ปดํ์ผํ๋ ์ฌ๋๋ค์ ์ํ ๊ฒ์ ์๋๋๋ค. ๋ํ TypeScript ๋๋ ์ ์ด๋ Flow๊ฐ ๊ตฌ์ฑ ์์์ css
์ํ์ด ์๋ค๊ณ ๋ถํํ๊ฒ ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๋๋ ์ด๊ฒ์ด ๋ด ์ฑ์์ ๋ฐ์ํ ์ ์๋ ์ ์ฌ์ ์ธ ์ค๋จ์ ๋ํด ์ฃผ๋ก ๋ถํํ๋ค๊ณ ์๊ฐํฉ๋๋ค. @oliviertassinari ๋ ์ ์ MUI v5์์ styled-components
๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ง๋๋ ๊ฒ์ ๋ํด ์๊ฐํ๊ณ ์๋ค๊ณ ์ธ๊ธํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ ํ ์ฌํญ์ด๊ธธ ๋ฐ๋ผ๊ณ JSS๋ฅผ ๊ณ์ ์ฌ์ฉํ ์ ์์ง๋ง ์ฐ๋ฆฌ๋ ๊ทธ๋ค์ด ๊ทธ๊ฒ์ ํด๋ผ ์ ์๋์ง ๋ณด๊ฒ ๋ ๊ฒ์
๋๋ค. ๊ทธ๊ฒ์ ์ถฉ๊ฒฉ์ด์์ต๋๋ค. ์ ์ฒด ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ์ ํธ๋์ ๋ํ ์ฒ ์ ํ ๊ตญ๋ฏผ ํฌํ๊ฐ ์ค์ ๋ก ์์์ต๋๊น? ์ง๊ธ์ ํจ์ฌ ๋ ๋์ค์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ ๊ฐ์ ์ ๊ธฐ๋ํ์ ๊ฒ์
๋๋ค.
๋ํ TypeScript ๋๋ ์ ์ด๋ Flow๊ฐ ๊ตฌ์ฑ ์์์ CSS ์ํ์ด ์๋ค๊ณ ๋ถํํ๊ฒ ํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
๊ตฌ์ฑํ ์ ์์ต๋๋ค.
์ ์ฒด ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ์ ํธ๋์ ๋ํ ์ฒ ์ ํ ๊ตญ๋ฏผ ํฌํ๊ฐ ์ค์ ๋ก ์์์ต๋๊น?
์ด๊ฑด ๋ถ๊ฐ๋ฅ ํด. GitHub์ ์ฐธ์ฌํ๋ ์ฌ๋๋ค์ด "์ฐ๋ฆฌ" ์ฌ์ฉ์๋ผ๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ๊ฐ์ฅ ๋ง์ ํฌํ ๋ฅผ ๋ฐ์ ๋ฌธ์ ์ ๋๋ค.
์ง๊ธ์ ํจ์ฌ ๋ ๋์ค์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ ๊ฐ์ ์ ๊ธฐ๋ํ์ ๊ฒ์ ๋๋ค.
์ธ๊ธฐ๋๋ ์ด๋ป๊ฒ ์ธก์ ํ๋์?
โ ๏ธ ๊ฐ์ ์ ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๋ณด๋ค ๊ฐ๋ฐ์๊ฐ ํจ์ฌ ๋ ์ ํํฉ๋๋ค(์ ๊ธฐ์ต์ผ๋ก๋ /6). npm์์์ ๋ค์ด๋ก๋๋ฅผ ๊ณ ๋ คํ๋ค๋ฉด ์คํ ๋ฆฌ๋ถ์ ์ ๊ฑฐํ๊ณ ๋ฐ์ ์ ํ ๋ค์ด๋ก๋ ์(์์ฒญ๋ ์)๋ฅผ ์ ํํ์ญ์์ค.
@eps1lon ์ ๋ด๊ฐ ๋ณด๊ณ ์๋ ๊ฒ์ ๋๋ค: https://2019.stateofcss.com/technologies/css-in-js/
๋ด๊ฐ ํ๋ ธ์ง๋ง ๋ถํํ๋ ์ด๊ฒ์ด ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ธ๊ธฐ์๋ ์ฐจํธ๋ ์๋์ง๋ง (๋งค์ฐ ์์ฌ์ค๋ฌ์ด ์ฐจํธ ๋์์ธ) ์์น ์ถ์ธ ๋ง ๊ธฐ์ตํ์ต๋๋ค.
๊ตฌ์ฑ ๊ฐ๋ฅ
์ค์ ๋ก TypeScript๊ฐ ๋ชจ๋ JSX ์์๊ฐ css
์ํ์ ์ง์ํ๋ค๊ณ ๊ฐ์ ํ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ๊ทธ๋ ๊ฒ ํ๋๋ก Flow๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
ํธ์ง : ๋คํ์ค๋ฝ๊ฒ๋ TypeScript์ ๋ํ ๋ฐฉ๋ฒ์ ์ฐพ์์ง๋ง Flow์ ๋ํ ๋ฐฉ๋ฒ์ด ์๋์ง ํ์คํ์ง ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ๊ฒ ์ค ๊ฐ์ฅ ๋ง์ ํฌํ๋ฅผ ๋ฐ์ ๋ฌธ์ ์ ๋๋ค.
๋ด๊ฐ ์ฐธ์กฐ. ํ์จ์ ์ฌ๋ค
styled-components
์ ์ฃผ์ ๊ธฐ์ฌ์ ์ค ํ๋์ธ FWIW๋ ์ ํ ์์คํ
์ ๋ํด ๋น์ฐํธ์ ์ธ ํ๋๋ฅผ ๋ณด์ด๋ ๊ฒ ๊ฐ์ต๋๋ค.
https://github.com/styled-components/styled-components/issues/3012#issuecomment -583878486
์คํ์ผ ๊ตฌ์ฑ ์์๊ฐ TS/Flow ์ฌ์ฉ์์ ๊ฐ๋ฐ ๊ฒฝํ์ ๊ด์ฌ์ด ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค๋ฉด ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ์์ด๋์ด์ ๋ํด ํจ์ฌ ๋ ์์ฌํ ์ ์์ต๋๋ค...
@jedwards1211 ๋์์ด๋๋ค๋ฉด css
์ ๋ํ Babel ๋งคํฌ๋ก๊ฐ ์์ต๋๋ค. ํนํ css/scss/less์์ ๋์ค๋ ๋ชจ๋ ์ฌ๋๋ค์ด "์คํ์ผ๋ง๋" ๋ฐฉ์์ผ๋ก ์ด๋ํ๋ ๊ฒ์ ์ข์ํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ชฉํ๋ ๋ฌด์์ ๋๊น? ์ฑ๋ฅ์ ์ด๋ป์ต๋๊น? ์๋ฅผ ๋ค์ด ์ผ๋ถ ์์คํ ์ ์์ CSS๋ฅผ ์ง์ํฉ๋๋ค. Tailwinds์์ ์ ๊ณตํ๋ฏ๋ก ํจ์ฌ ๋ ๊นจ๋ํ๊ณ ๋นจ๋ผ์ง ์ ์์ต๋๋ค.
@hc-codersatlas packages/material-ui-benchmark
์์ ๋ช ๊ฐ์ง ๋ฒค์น๋งํฌ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
@koistya ์ ๋๋ก ์ฝ์ผ๋ฉด ๊ฐ์ ์ด ๋ค๋ฅธ ๊ฒ๋ณด๋ค ํจ์ฌ ๋นจ๋ฆฌ ๋ณด์ ๋๋ค.
@oliviertassinari ๋๋ถ๋ถ์ ๊ฐ๋ฐ์๊ฐ ์ค์ ๋ก ์ด ์ ํ์ "์ ํ"ํฉ๋๊น? react-select ๋ฐ ์คํ ๋ฆฌ๋ถ์ ๋ํ ๊ทํ์ ์ธ๊ธ์ ๋ฐ๋ผ ๋๋ถ๋ถ์ ๊ฐ๋ฐ์๋ UI ๊ตฌ์ฑ ์์์ ํจ๊ป ๋ฒ๋ค๋ก ์ ๊ณต๋๋ ๋ชจ๋ ๊ฒ์ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฉฐ material-ui๊ฐ ํฐ 1์ด ๋ฉ๋๋ค. UI ํ๋ ์์ํฌ๊ฐ ์ด๋ฏธ ์ฌ์ฉํ๊ณ ์๋ ๊ฒ ์ธ์ ๋ค๋ฅธ ์์คํ ์ผ๋ก ๋ ๋ง์ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ ๋๋ค.
์ด๋ฌํ UI ํ๋ ์์ํฌ์ ๋๋ถ๋ถ์ ๋๊ธฐ์ ์์ ๊ฐ์ ธ์จ ๊ฒ์ ๋๋ค. ์ฆ, ์์์ ์ฌ๋๋ค์ด ์ค์ ๋ก ์ด "์ ํ"์ ํ๊ณ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ๊ทธ๋ก๋ฐ์ ๋ง์ ํ์ฌ๋ค์ด 1ํฌ์ธํธ์์ ์ฌ์ฉํ๊ณ ์๋ styled-components๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ฉ๋ชจ์์ npm ๋ค์ด๋ก๋๋ ๋ฌด์์ ์๋ฏธํฉ๋๊น? ํ์ฌ ์ฌ์ฉ์ ๋ฐฉํ๋ฒฝ ๋ฐ ๋ด๋ถ npm ์บ์ฑ์ ์๋ฏธํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ด๋ฌํ ๋ฉํธ๋ฆญ์ ์๊ณกํฉ๋๋ค.
๋ณํ๊ฐ ์๋ค๋ฉด ์ธ๊ธฐ๋ณด๋ค๋ ๊ธฐ์ ์ ์ธ ๋ฉด์์ ๋ฒ ์คํธ 1๋ก ๋ฐ๊ฟ์ฃผ์ธ์. ๋๋ material-ui๊ฐ ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ mui ์์ฒด๊ฐ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ui ํ๋ ์์ํฌ ์ค ํ๋์ด๊ธฐ ๋๋ฌธ์ ์ธ๊ธฐ ์๋ 1์ด ๋ ๊ฒ์ด๋ผ๊ณ ์์ธกํฉ๋๋ค.
@South-Paw ์ ์ํ ๋จ์ํ๊ฐ ์๋ํ์ง ์์ต๋๋ค. MuiCardContent
๋ ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์์ ์์ ${MuiCardContent}
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
https://styled-components.com/docs/advanced#referring -to-other-components
๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๊ฐ๋ณ HoC ๋ํผ๋ฅผ ํผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ์ ์ ๋์ ๊ทธ๊ฒ์ ๋ํด ์๊ฐํ ํ์ JSS๋ก ํด์ผ ํ๋ ๊ฒ๊ณผ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผํ ์์ ํ์ดํ/๋ค์ด๋ฐ ๊ฒฐ์ ์ด๋ผ๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค.
@mbrookes @oliviertassinari ์กฐ๊ฑด๋ถ ์คํ์ผ๊ณผ ๋ด๋ถ ๊ตฌ์ฑ ์์ ์คํ์ผ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋ฉ๋๊น?
์๋ฅผ ๋ค์ด styled-components
๊ธฐ๋ฐ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๋ฌด์์
๋๊น?
// conditional class name
<MenuItem classes={{selected: classes.selectedItem}}>...</MenuItem>
// inner component class name
<Dialog classes={{paper: classes.dialogPaper}}>...</Dialog>
styled-components
๋ก์ ์ ํ ์์ด๋์ด์ ๋ํด ์ง์ ํ์ง๋ง ์ด๋ฌํ ์ข
๋ฅ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ํ์คํ ๊ณํ์ด ์๋์ง ํ์ธํ๊ณ ์ถ์ต๋๋ค. API๊ฐ ๋งค์ฐ ๋ค๋ฅด๊ฑฐ๋ ์์กดํด์ผ ํ๋ค๊ณ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์
๋๋ค. BEM ์คํ์ผ ํด๋์ค ์ด๋ฆ์.
@jedwards1211 ์ ์ ์ค์์ ๋๋ค. ๋๋ ์์ ๊ฐ ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์์ธ ๊ฒฝ์ฐ๋ผ๋ ์ธ์์ ๋ฐ์์ง๋ง ์ค์ ๋ก ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ํ์ง ์์ต๋๋ค ๐
@ jedwards1211 clsx ๋ ๊ณผ๊ฑฐ์ ์กฐ๊ฑด๋ถ ํด๋์ค์ ๋ํด ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์์ ์ง์ ์ด๋ฃจ๋ ๊ฒ์ ๋ณธ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ์ข ๋ฅ์ ์๋ฏธ์ ๋๊น?
ํ์ฌ ํ๊ณ ์๋ ํ๋ก์ ํธ๋ ํ์์ ๋ฐ๋ผ MUI ๊ตฌ์ฑ ์์๋ฅผ ๋ํํ๋ styled-components๋ฅผ ์ฌ์ฉํ๋ฏ๋ก MUI ์กฐ๊ฑด๋ถ ์คํ์ผ๋ง์ ์ฌ์ฉํ์ง ์์์ต๋๋ค.
@South-Paw (๋๋ classnames
)๋ ์๋ฃจ์
์ ๋ด๋ถ ์ธ๋ถ ์ฌํญ์ด ๋ ์ ์์ง๋ง styled-components
๋ํผ๋ ๋จ์ผ className
AFAICT๋ง ์ฃผ์
ํ๊ธฐ ๋๋ฌธ์ ๋ด ๋ง์ ์ค์ ๋ก ์ฌ๋ฌ ์ฌ์ ์ ํด๋์ค ์ด๋ฆ์ ๊ตฌ์ฑ ์์์ ์ ๋ฌํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ด ์๋๋๋ค. ๋์ <Dialog Paper={StyledPaper}>...</Dialog>
์ ๊ฐ์ ์์
์ ์ํํด์ผ ํ ์ ์์ผ๋ฉฐ ์ ํํ MenuItem
ํด๋์ค ์์ ์ ๊ฒฝ์ฐ์๋ ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@jedwards1211 ์ค๋ช ํ๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ๋ฌด์์ด๋ฉฐ ๋ฌธ์ ๊ฐ ์ด๋์ ์๋ค๊ณ ์๊ฐํ๋์ง ๋ ์ ์ดํดํ ์ ์๋๋ก ๊ฐ๋จํ ์๋ฅผ ๋ค์ด ์ฃผ์๊ฒ ์ต๋๊น? ์๋ฃจ์ ์ ๋ํ ๋์์ ๋ฐ๊ณ ์ถ์ง๋ง ์ด๊ฒ์ด ์์ง ๋ฌด์์ ์ ์ฉ๋๋์ง ์ดํดํ์ง ๋ชปํฉ๋๋ค ๐
๋ค, ์ค๋์ ์๊ฐ์ด ์์ง๋ง ๋ด์ผ์ ํ ๊ฒ์.
๋ํ jss-codemorphs ์ ๋ํ ์์
์ด ์งํ ์ค์ด๋ฉฐ, ๊ถ๊ทน์ ์ผ๋ก ๋ถ์ฌ๋ฃ์ CSS๋ฅผ JSS๋ก ๋ณํํ๊ธฐ ์ํ VSCode ํ์ฅ์ ๋ง๋ค ๊ณํ์
๋๋ค.
์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์ ๊ตฌ๋ฌธ์ด๋ ํจํค์ง๊ฐ ์ ์ง๋๋ ๋ฐฉ์์ ์ข์ํ๋ ์ฌ๋์ด ์๋์๊ณ ์ด ์ ์์ ์ข์ํ๋ ์ฌ๋์ด ์๋๋๋ค. Material ui์์ ๊ฐ์ฅ ์ข์ํ๋ ๊ฒ ์ค ํ๋๋ ํ์ฌ ์คํ์ผ๋ง ์๋ฃจ์ ์ ๋๋ค.
Facebook์ด CSS-in-JS ์๋ฃจ์ ๋ ์คํ์์ฑํ ์ ์๋ค๋ ๊ฒ์ ์ฝ์๋ค๋ ์ ์ ํฅ๋ฏธ๋กญ์ต๋๋ค. ๊ทธ๊ฒ๋ ๋์์ ๋ ํ ๋ฒ ์ดํด๋ณด๋ ๊ฒ๋ ์๋ฏธ๊ฐ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๋น๋ฉดํ ์ค์ ์ฃผ์ ์ ๋ํด. ๋๋ Typescript ๊ฒฝํ์ด ์ข์ง ์๊ธฐ ๋๋ฌธ์ styled-components๋ฅผ ์ซ์ดํฉ๋๋ค. ์ ํ์ ์ข
์ข
๋๋ ๊ฒ๋ณด๋ค ๋ ํด๋ฅผ ๋ผ์นฉ๋๋ค. ๋๋ฆฐ ์ปดํ์ผ ์๊ฐ, ๋ฏธ์น ์ธํฐํ์ด์ค(์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๊ฐ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์๋ํ๋ ๋ฐฉ์์ ์ดํดํ๋ ค๋ ์๋๋ ์ค์ฒฉ๋ Pick
๋ง๋ฒ์ผ๋ก ์ธํด ์
๋ชฝ์
๋๋ค). styled-components์ ์ด๋ฌํ ์ ํ์ DX๊ฐ ์๋ ํ material-ui๊ฐ ์ด๋ฅผ ์ฑํํ๋ ๊ฒ์ ํ ๋ฐ์ง ๋ค๋ก ๋ฌผ๋ฌ๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง ๊ฒ์
๋๋ค.
Facebook์ด CSS-in-JS ์๋ฃจ์ ๋ ์คํ์์ฑํ ์ ์๋ค๋ ๊ฒ์ ์ฝ์๋ค๋ ์ ์ ํฅ๋ฏธ๋กญ์ต๋๋ค.
@venikx ๊ทธ๋ด ๊ฐ๋ฅ์ฑ์ ์ผ๋ง๋ ๋ฉ๋๊น? ๋ด๊ฐ ๋ง์ง๋ง์ผ๋ก https://reactpodcast.simplecast.fm/75 ์ ์๋ค๋ ๊ฒ์ ์์ํ ์ ์๋ ๋ฌด์ธ๊ฐ์ ๋ํด ๋ค์์ ๋ 5๋ ๋์์ ๋ชฉํ์ธ ๊ฒ ๊ฐ์์ต๋๋ค.
์ค ์ ๋ง? ๋๋ ๊ทธ๋ค์ด ์ด๋ฏธ "ํ์ ๋ผ์ธ"์ ์ ๊ณตํ๋์ง ๋ชฐ๋์ต๋๋ค. ์ด๋ค ์ด์ ๋ก ๋๋ ๊ทธ๊ฒ์ด ๋์ ๋ชจ๋์ ๊ฐ์ ์๊ธฐ์ ์ฌ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ๋๋ฌด ๋๋น .
ํ์ง๋ง styled-components์ ๋ํ ์ ์์ ์ ์ฌ์ ํ โโ์ ํจํฉ๋๋ค. ๋๋ styled-components๋ฅผ ์ฌ์ฉํ๋ ๋์ ์์ material-ui์ ์คํ์ผ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. styled-components์ ํ์ดํ์ ์ปดํ์ผ๋ฌ๋ฅผ ์ํ ๊ฒ์ด์ง ๋ฌธ์๋ฅผ ์ํ ๊ฒ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ ๋ค๋ฅธ ์ฑ๊ฐ์ ์ผ(ํ์ง๋ง ๋ค์ ๊ฐ์ธ์ ์ธ ์ทจํฅ์ผ ์ ์์)์ ๊ตฌ์ฑ ์์์ ๋์ ์ผ๋ก ์คํ์ผ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์์ ํด๋น ๋ ผ๋ฆฌ๋ฅผ ํฌํจํ๋ ๊ฒ๋ณด๋ค className์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ๋ ๊ฒ์ ๋งค์ฐ ์ ํธํฉ๋๋ค.
Material-ui api๋ ์๊ฐ ์ ๋ง ๊นจ๋ํฉ๋๋ค.
๋๋ Typescript ๊ฒฝํ์ด ์ข์ง ์๊ธฐ ๋๋ฌธ์ styled-components๋ฅผ ์ซ์ดํฉ๋๋ค.
๋๋ ์ง๊ธ๊น์ง ์ ์ด๋ 4๊ฐ์ ๋ํ ํ๋ก์ ํธ์์ styled-components์ Typescript๋ฅผ ํจ๊ป ์ฌ์ฉํ์ผ๋ฉฐ ์ ํ์ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. - ์๋น์ ์ชฝ์ด ์๋๋๋ค.
๋๋ฆฐ ์ปดํ์ผ ์๊ฐ
๋๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ์ด๋ค ํ๋ก์ ํธ์์๋ ์ด๊ฒ์ ๊ฒฝํํ์ง ๋ชปํ์ต๋๋ค. ๋น์ ์ด ์๋ฏธํ๋ ๋ฐ์ ๋ํ ์๊ฐ ์์ต๋๊น?
๋ฏธ์น ์ธํฐํ์ด์ค (์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๊ฐ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์๋ํ๋ ๋ฐฉ์์ ์ดํดํ๋ ค๊ณ ์๋ํ๋ ๊ฒ์ ๋ชจ๋ ์ค์ฒฉ๋ Pick ๋ง๋ฒ์ผ๋ก ์ธํด ์ ๋ชฝ์ ๋๋ค)
์ด๋ป๊ฒ๋ ๊ฐ์ ํ ์ ์๋ค๊ณ ์๊ฐํ๋ค๋ฉด @types ํ๋ก์ ํธ์ ๊ธฐ์ฌํ๋ ๊ฒ๋ ๊ณ ๋ คํ ์ ์์ต๋๋ค. ์ง๊ธ๋ณด๋ค ๊ฐ์ ๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ๋ชจ๋๊ฐ ๊ฐ์ฌํ ๊ฒ์ ๋๋ค!
์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์์ ํด๋น ๋ ผ๋ฆฌ๋ฅผ ํฌํจํ๋ ๊ฒ๋ณด๋ค className์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ๋ ๊ฒ์ ๋งค์ฐ ์ ํธํฉ๋๋ค.
styled-components์ ํจ๊ป ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ง๋ ๊ฒ์ ์์ต๋๋ค.
const Box = styled.div`
height: 160px
width: 160px;
background-color: black;
.red {
background-color: red;
}
`;
// simple usage
<Box className="red" />
// get more complex with conditionals and using something like clsx (https://www.npmjs.com/package/clsx)
const isRed = true;
<Box className={clsx({ red: isRed })} />
๋ค๋ฅธ ์๊ฒฌ์ ์ฃผ์ฅํ๋ ์ผ๋ถ ๋๊ธ์๋ ๋ถ๊ตฌํ๊ณ ์์ ๋ฌธ์ ์๋ 150 ๐ ๋ฐ 27 ๐๊ฐ ์๊ณ 18 ๐ ๋ฐ 9 ๐๋ง ์๋ค๋ ์ ์ ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ด ํ ๋ก ์ ์ซ์ดํ๋ ๋ชฉ์๋ฆฌ๊ฐ ์์์ด๊ณ ๊ธ์ ์ ์ธ ์กฐ์น๋ผ๊ณ ์๊ฐํ๋ ๋ค์๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค ๐คทโโ
@South-Paw ํฌํ์ ๋ฌธ์ ๋ ์ ์ผํ ์ ํ์ด JSS ๋ styled-components๋ผ๋ ๊ฒ์ ๋๋ค. ๋ณด์ปฌ ๋ถ๋ถ์ ์คํ์ผ ๊ตฌ์ฑ ์์๋ฅผ ์ข์ํ์ง ์๊ณ JSS๋ฅผ ์ข์ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์๋ง ํฌํํ๋ฉด
๊ฒฐ๊ตญ JSS๋ณด๋ค ๋์ ๊ฒ์ ์์ต๋๋ค. ๊ทธ๊ฑด ์ค๋ ๋ฌ์ด. ๋๋ฆฌ๊ณ ๋ถํผ๊ฐ ํฌ๋ฉฐ(๋ฒ๋ค ํฌ๊ธฐ) ๊ณ์ ์ด๋ํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ํฌํ๋ ๊ทํ์ ๊ฒฐ๋ก ์ ์ ํ ์ง์งํ์ง ์์ต๋๋ค.
๋ ผ์์ ์น์๋ฅผ ๋ณด๊ธฐ ์ํด ์๋ก ์ธ์ฐ๋ ์ฌ๋๋ค์ ๋ํ ์์์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ์ฑ์ฐ์ง ์๋ Spectrum ์ฑํ ์ด๋ ๋ค๋ฅธ ๊ฒ์ผ๋ก ์ด๋ํ ์ ์์ต๋๊น?
ํต์ฌ ํ์์ ์ด ์ฃผ์ ์ ๋ํ ํ ๋ก ์ ์ํด ์ค๋ ๋๋ฅผ ํ๋ก์ฐํ๊ณ ์์ต๋๋ค.
ํต์ฌํ์ ํ๋จ์ ๊ณผ์ํ๊ฐํ๊ณ ๊ณ์ ๊ฒ ๊ฐ์๋ฐ, ๊ฐ์ธ์ ์ผ๋ก ์ด ์ฃผ์ ์ ๋ํ ๋ ผ์์ ๊ทธ๋งํ๊ณ ํต์ฌํ์ ๋ ๋ฏฟ์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ฒฐ๊ตญ ๋จธํฐ๋ฆฌ์ผ UI์ ๋ฐฉํฅ์ ๊ฒฐ์ ํ๋ ๊ฒ์ ์ฝ์ด ํ์ ๋ชซ์ ๋๋ค.
๋ง์ฝ ๋น์ ์ด ์ ๋ง๋ก ๊ทธ๊ฒ์ ๋ํด ๊ฐํ ์๊ฒฌ์ ๊ฐ๊ณ ์๋ค๋ฉด, Material UI๋ ๋๋๊ฒ๋ MIT ๋ผ์ด์ ์ค๋ฅผ ๋ฐ์๊ณ , ๊ทธ๊ฒ์ ํฌํฌํ๊ณ , ๋น์ ์ด ๊ฐ์ง ๋น์ ์ ๊ณ์ ์ ์งํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ทธ๋ ๊ฒ ํ๊ธฐ๋ฅผ ๊ถ์ฅํฉ๋๋ค. ์๋ง๋ ์ฐ๋ฆฌ๋ ๋ค์ํ ํ๊ฒฝ์์ ๋ฏธ๋์ ๋ฐฐ์ธ ๊ฒ์ ๋๋ค.
ํ์ง๋ง, ์ ๋ฐ, ํต์ฌ ํ์ด ๊ทธ๋ค์ ์ผ์ ํ๊ฒ ํ๊ณ , ๊ทธ๋ค์ ๋ฏฟ์ผ์ญ์์ค. ๊ทธ๋ค์ ๋๋ผ์ด ๊ธฐ์ ์ ๊ฐ์ง ์ ๋ง ์ ๋ฅํ ์ฌ๋๋ค์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฌ๊ธฐ ๋ณผ ์์๋ ์๋ฆ๋ค์ด ๊ฒ์ด ์์ต๋๋ค
๊ฒฐ๊ตญ JSS๋ณด๋ค ๋์ ๊ฒ์ ์์ต๋๋ค. ๊ทธ๊ฑด ์ค๋ ๋ฌ์ด.
@hc-codersatlas old == ์ฑ์ํ -- ๊ทธ๊ฒ์ด ์ ๋ฌธ์ ์ธ์ง ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
์ข์, ๋จ๊ฑฐ์ด ๋ฌธ์ ์ฒ๋ผ ๋ณด์ด์ง๋ง ๋๊ตฐ๊ฐ ์ด ๊ฐ๋จํ ์ ๋ณด๋ฅผ ํ์ธํด ์ค ์ ์์ต๋๊น? ํ์ฌ Mui ๋ฒ์ (4 ๋๋ 5)์์ CSS์ฒ๋ผ ๋ณด์ด๋ ํ๊ทธ๊ฐ ์ง์ ๋ ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด๊ณผ ํจ๊ป styled-components
์ ๊ฐ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๊น? ?
์ด ์ง๋ฌธ์ ๋ํ ๋ช
ํํ ์ ๋๋ ์๋์ค ๋๋ต์ ์ฐพ์ ์ ์์์ต๋๋ค. ์ ๋ ๊ธฐ๋ณธ ๊ธฐ์ ์ ๋ํด์๋ ๋ณ๋ก ์ ๊ฒฝ ์ฐ์ง ์๊ณ ๊ฐ๋ฐ์์ ํธ์์๋ง ๊ด์ฌ์ด ์์ต๋๋ค. InVision์์ CSS๋ฅผ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ๋ ๊ฒ์ ์ด๋ค ๊ฒฝ์ฐ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
์ด ๋ฌธ์ ๋ Material-UI์์ ์ฌ์ฉ๋๋ ์คํ์ผ๋ง ์๋ฃจ์ ์ ๊ดํ ๊ฒ์ ๋๋ค. ๊ทํ์ ์ง๋ฌธ์ ์ฑ์ ์คํ์ผ์ ์ง์ ํ๊ฑฐ๋ ๊ตฌ์ฑ ์์์ ์คํ์ผ์ ๋ค์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ์ด๋ค ์๋ฃจ์ ์ด๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
https://material-ui.com/guides/interoperability/
JSS๋ ํ๋ฌ๊ทธ์ธ์ผ๋ก ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํฉ๋๋ค.
๋ฐฉ๊ธ ๋งค์ฐ ํฌ๊ด์ ์ธ CSS์์ JSS๋ก์ ๋ณํ๊ธฐ ๊ตฌํ์ ๋ง์ณค์ต๋๋ค.
CSS๋ฅผ ๋ณต์ฌํ์ฌ JSS ์คํ์ผ์ ๋ถ์ฌ๋ฃ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@jedwards1211 ์ด๊ฑฐ ๋ด
https://css2js.dotenv.dev/
@nainardev ๋ค๋ฅธ ์ ํธ๋ฆฌํฐ๋ ๋งค์ฐ ์ ํ์ ์ด๋ฉฐ CSS ์์ฑ์ ๋ณํํ์ง๋ง ์ ํ๊ธฐ, ์ค์ฒฉ ์ ํ๊ธฐ, ์ ๋๋ฉ์ด์ ํคํ๋ ์, ๋ฏธ๋์ด ์ฟผ๋ฆฌ ๋ฑ์ ๋ณํํ์ง ์๋๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ์ด ๋๋ฌธ์ ๋๊ตฌ๋ฅผ ๋งค์ฐ ํฌ๊ด์ ์ผ๋ก ๋ง๋ค์๊ธฐ ๋๋ฌธ์ ๋ณํํ ์ ์์ต๋๋ค. ๋ฐ๋ผ๊ฑด๋ ๋น์ ์ด ๊ทธ๊ฒ์ ๋์ง ๋ณธ๊ฒฉ์ ์ธ CSS๊ฐ ๋ ๊ฒ์ ๋๋ค.
์ด ๋ต๋ณ์ ์ด๋๊ฐ์์ ๋์ณค์ ์๋ ์์ง๋ง ์ด์จ๋ ๊ทธ๊ฒ์ ๋์ด๊ณ ์ถ์ต๋๋ค. Material UI ๊ตฌ์ฑ ์์๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๊ณ ์คํ์ผ๋ง ์๋ฃจ์
( less
vs makeStyles
vs styled-components
)์ ํ๊ฐํ๋ ์ค์ด๋ฉฐ ๋๋ถ๋ถ์ ์คํ์ผ๋ง์ ๋ค์์ ํตํด ์ํ๋ฉ๋๋ค. ํ์ผ๊ณผ ๋๋ถ๋ถ์ ์๋ก์ด MUI ์ฝ๋๋ makeStyles
๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ช
ํํ ์๊ณ ์ถ์ ๊ฒ์ ์ด๊ฒ์ด v5์ ์ผ๋ถ๊ฐ ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์คํ์ผ๋ง๊ณผ ๊ด๋ จ๋ ๊ธฐ์ ์ ์ธ ๋ถ์ฑ๋ฅผ ์ค์ด๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ๋ฌด์์ ํ ์ ์์ต๋๊น?
makeStyles
๊ฐ ์์ต๋๊น? styled-components
๋ฐ ํ
๋ง์ ์ด๋ป๊ฒ ์๋ํฉ๋๊น? ์๋ฅผ ๋ค์ด styled-components
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.const useStyles = makeStyles((theme) => ({
paper: {
padding: theme.spacing(2),
textAlign: 'center',
color: theme.palette.text.secondary,
},
}));
theme
๊ฐ์ฒด๋ฅผ ๊ฒ์ํ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์์ผ๋ฏ๋ก ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ ์ ์์ต๋๊น?const StyledContainer = styled.div`
color: ${({ theme }) => theme.palette.primary.main};
padding: ${({ theme }) => theme.spacing(1)};
background-color: ${({ theme }) => theme.palette.background.paper};
`;
makeStyles
๊ฐ v5์ ์๋ค๊ณ ๊ฐ์ ํ๊ณ ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค์ ๋ํด styled-components
ํ
๋ง ์ ๊ณต์์ Material UI ํ
๋ง ์ ๊ณต์๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฑ๋ฅ ์ ํ๋ฅผ ์์ํด์ผ ํฉ๋๊น?Material UI ์ฌ์ฉ์ ์ข์ํฉ๋๋ค. ๋ชจ๋ ์๊ณ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
@egilsster
const StyledContainer = styled.div`
${({ theme }) => `
color: ${theme.palette.primary.main};
padding: ${theme.spacing(1)};
background-color: ${theme.palette.background.paper};
`}
`;
๋น ๋ฅธ ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
- ์ material-ui.com/guides/interoperability/#theme
์ด๊ฒ์ ๊ฝค ๋ฉ์ง๋ค. ๋๊ตฌ์ ๋ํ ์ผ๋ถ ์์
์ ์๋ง๋ ์ด๊ฒ์ ๋ฐ๋ฅผ ๊ฒ์
๋๋ค. ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ํ๋ก์ ํธ๋ TS๋ฅผ ์ฌ์ฉํ์ง ์์ง๋ง VSCode/์ธ์ด ์๋ฒ๋ ์ด ๊ฒฝ์ฐ theme
๊ฐ ๋ฌด์์ธ์ง ์ ํ ๋ชจ๋ฅด๋ ๊ฒ ๊ฐ๊ณ styled-components
๋ฅผ ์์ต๋๋ค. ๊ตฌ๋ฌธ ๊ฐ์กฐ๋.
๋ค์ ํ ๋ฒ ๊ฐ์ฌํฉ๋๋ค. ์ด ๊ฐ๋ฐ์ ๊ณ์ํ ๊ฒ์ ๋๋ค.
@oliviertassinari ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๋ก์ ๋ง์ด๊ทธ๋ ์ด์
์ด ์๋ ๊ฒฝ์ฐ <ListItem classes={{ selected: myCustomClassName}}>
์ ๊ฐ์ CSS API์ ๋ ์ด์ ์์กดํ ์ ์๊ฒ ๋ฉ๋๊น?
@jedwards1211 classes
API๋ ์ ์ง๋ฉ๋๋ค.
๊ด์ฐฎ์. styled-components๋ ๋ฃจํธ ์์์ ๋จ์ผ ํด๋์ค๋ง ์ ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ MUI๊ฐ ๋ด๋ถ์ ์ผ๋ก styled-components๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์ฝ๊ฐ ํผ๋์ค๋ฝ์ต๋๋ค.
const MyRoot = styled('div')`
// some nice styles
`;
const MyAwesomeChild = styled('div')`
// some nice styles
`;
export function AwesomeRoot(props) {
return (
<MyRoot className={props.classes?.root}>
<MyAwesomeChild className={props.classes?.child}/>
{props.children}
</MyRoot>
);
}
@jedwards1211 ์ด ๋ง์ด ๋๋์?
@yordis ๊ฐ๋จํด ๋ณด์ด์ง๋ง https://github.com/mui-org/material-ui/blob/master/packages/material-ui/src/Button/Button.js ์ ๊ฐ์ ๋ณตํฉ ์ ํ๊ธฐ๋ฅผ ์ด๋ป๊ฒ ๋ฆฌํฉํ ๋งํ์๊ฒ ์ต๋๊น?
styled-components
๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๊ธฐ์กด ๋์์ ๋ณด์กดํ ๋ฐฉ๋ฒ์ด ์๊ฐ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฌ๋๋ค์ด ์์ํ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
outlined: {
'&$disabled': {
border: `1px solid ${theme.palette.action.disabledBackground}`,
},
},
๊ธฐ์กด ์ฝ๋์ ์ฌ์ฉ์ ์ ์ ์ฌ์ ์๋ ๊ฒฝ์ฐ์ ๋ฐ๋ผ CSS ํน์ฑ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์๋ ์์ต๋๋ค.
์๋ง๋ ์ด๊ฒ์? ์ด๊ฒ์ด ๋์๊ฒ ๊ธฐ๋ณธ์ ์ผ๋ก ๋๊ปด์ง๊ธฐ ๋๋ฌธ์ ๋ฐ๋ผ๊ฐ์ง ํ์ ์ด ์์ง ์์ต๋๋ค. ์๋ง๋ ์ผ๋ถ ์ปจํ ์คํธ ๋ฐ/๋๋ ์ ๋ณด๊ฐ ๋๋ฝ๋์์ ๊ฒ์ ๋๋ค.
const MyOutlinedComponent = styled('div')`
${props.disabled && `
border: `1px solid ${({ theme }) => theme.palette.action.disabledBackground}`,
`}
`;
<MyOutlinedComponent disabled/>
@yordis ๊ฐ๋ฅํฉ๋๋ค. ๋ด๊ฐ ๋งํ๋ฏ์ด ์ฌ๋๋ค์ ์ด๊ฒ์ด ์ฌ์ฉ์์๊ฒ ์ผ๋ง๋ ๋ง์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ด๋ํ ๊ฒ์ธ์ง์ ๋ํด ์๊ฐํ์ง ์์ ์ ์์ง๋ง ์ ๋ ๊ทธ ์๊ฐ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐฉ์งํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์ค์ ์ฌ๋ก์ ์ค์ ์ ์ฌ์ ์ธ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ณต์ ํ์๊ฒ ์ต๋๊น?
๊ฐ๋ ฅํ ์ฌ๋ก๋ฅผ ๊ณต์ ํ์ง ์์ผ๋ฉด ํ๋ก์ฐํ๊ธฐ ์ด๋ ต์ต๋๋ค. ๊ทํ์ ๋ฉ์์ง์ ๋ฐ๋ฅด๋ฉด ๊ทํ๊ฐ ์ด ์ฃผ์ ๋ฅผ ์์ ํ ์ดํดํ์ง ๋ชปํ๊ฑฐ๋ ์ ๊ฐ ์๋ชป๋ ํ๋จ์ ๋ด๋ฆด ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ดํด๋ฅผ ๋์์ฃผ์ธ์, ์ ๊ฐ ํ๋ฆด ์๋ ์์ต๋๋ค.
@oliviertassinari ํ
๋ง ์ฌ์ ์๊ฐ v5์์ ์์ ์์ด ๊ณ์ ์๋ํฉ๋๊น? ๋ค์ ์ฌ์ ์ ์์ ๊ฐ ์๋ํ๋ ค๋ฉด MUI๊ฐ styled-components
์์ฑ ๋ฃจํธ ํด๋์ค ์ด๋ฆ ์ธ์ JSS ์์ฑ ํด๋์ค ์ด๋ฆ์ ์ ์ฉํด์ผ ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
const theme = createMuiTheme({
overrides: {
MuiButton: {
root: {
'&$disabled': {
color: myCustomColor,
},
},
},
},
});
@yordis ๋ ๋ ์๊ฐํด ๋ณธ ๊ฒฐ๊ณผ classes
prop์ ํตํด ์ ๋ฌ๋ ์คํ์ผ์ ๋ํ ๋ณตํฉ ์ ํ๊ธฐ๊ฐ ์ด ์ข๊ฒ๋ ์ฌ์ ํ ์๋ํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ํ
๋ง ์ฌ์ ์ ์คํ์ผ์ ๋ํด์๋ ํ์คํ์ง ์์ต๋๋ค.
style={object}์ ์ฌ์ฉํ์ฌ ์คํ์ผ์ด ์ง์ ๋ ์ผ๋ฐ MUI์ ํจ๊ป MUI๋ฅผ ํตํด ๋ ์คํ์ผ ๊ตฌ์ฑ ์์๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๋ ๊ธฐ์จ์ ๋๋ ธ์ต๋๋ค.
๊ฐ๊ฐ ๋ฏธ๋์ด ์บ๋ฌ์ , ์ ๋ณด, ํด๋ฆญ ํธ๋ค๋ฌ, ๋ฒํผ ๋ฑ์ด ์๋ 50๊ฐ์ ์นด๋๊ฐ ํฌํจ๋ ๊ฒฐ๊ณผ ๋ชฉ๋ก ํ์ด์ง๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๋๋ง ์๊ฐ์ ๊ฑฐ์ 0.5์ด๊ฐ ์ถ๊ฐ๋ฉ๋๋ค. const useStyles = makeStyles
๋๋ style={object}์ ๋นํด.
์ด ๋ก๋๋งต ๊ณํ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์๋ค์ฌ์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์์ ํ ํํฅ์์ผ๋ก ์ฌ์ ์ํ ์ ์๋ ๊ฒฝ์ฐ UI ์ฑํ์ ๋ํ ๊ณํ์ด ๊ผฌ์ผ ๊ฒ์ ๋๋ค.
@Icehunter ์ฌ๋๋ค์ด ๋ณผ ์ ์๋๋ก ๊ฒฐ๊ณผ์ ์ํ ํ๋ก์ ํธ๋ฅผ ์จ๋ผ์ธ์ ๊ฒ์ํ ์ ์์ต๋๊น?
@Icehunter ์ฌ๋๋ค์ด ๋ณผ ์ ์๋๋ก ๊ฒฐ๊ณผ์ ์ํ ํ๋ก์ ํธ๋ฅผ ์จ๋ผ์ธ์ ๊ฒ์ํ ์ ์์ต๋๊น?
์ํ ํ๋ก์ ํธ๋ ๋ ์ ์ฝ๋๋ฅผ ํฌํจํ๊ธฐ ๋๋ฌธ์ ์ด๋ ค์ธ ๊ฒ์ ๋๋ค. ๋ ๋๋ง๋ ์ด๋ฏธ์ง์ ์ฑ๋ฅ ํญ์ ํ์ด๋ฐ ๊ฒฐ๊ณผ ์น์ ์ ๊ณง ๊ฒ์ํ๊ฒ ์ต๋๋ค.
๊ฐ๊ฐ ๋ฏธ๋์ด ์บ๋ฌ์ , ์ ๋ณด, ํด๋ฆญ ํธ๋ค๋ฌ, ๋ฒํผ ๋ฑ์ด ์๋ 50๊ฐ์ ์นด๋๊ฐ ํฌํจ๋ ๊ฒฐ๊ณผ ๋ชฉ๋ก ํ์ด์ง๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
@Icehunter ๊ทธ๋ฐ ์คํ์ผ์ ์ํ์ ๋ณด๋ด๋ ๊ฑด๊ฐ์? 50์ฅ์ด๋ 500์ฅ์ด๋ ์์ฑ๋๋ ํด๋์ค์ ์๋ ๊ฐ์์ผ ํฉ๋๋ค. ๊ทํ์ ํน์ ์์ ๊ณต์ ํ ์ ์๋ ๋ ์ ์ฝ๋๊ฐ ํฌํจ๋์ด ์๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฌ์ง๋ง ๊ณต์ ํ ์ ์๋ ์ฝ๋๋ก ์ด ๋ฌธ์ ๋ฅผ ์ฌํํ ์ ์์ต๋๊น?
styled()
/ styled.div
API๋ _๋ชจ๋ _ ์์์ ๋ ๋๋ง์ ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํ๋ฏ๋ก ํด๋์ค ์ด๋ฆ์ ์บ์ฑํ๋๋ผ๋ ์๋๊ฐ ๋๋ ค์ง ์ ์์ต๋๋ค. makeStyles
๋ฅผ ์ฌ์ฉํ๋ฉด ์คํ์ผ ๊ทธ๋ฃน์ ํ ๋ฒ ์ฒจ๋ถํ ๋ค์ ํด๋์ค ์ด๋ฆ์ ์๋์ผ๋ก ์ ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ์ข
์ข
ํจ์ฌ ๋ ๋น ๋ฆ
๋๋ค.
์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์ styled
์ ์์กดํ๋ ์๋ฃจ์
์ด MUI makeStyles
๋ณด๋ค 3-4๋ฐฐ ๋๋ฆด ์ ์์์ ์ค๋ช
ํ๊ธฐ ์ํด CodeSandbox ์์ ๋ฅผ ์์ฑํ์ต๋๋ค.
styled
API๋ ํธ์์ ํ๋ฅญํ์ง๋ง ๋ชฉ๋ก/ํ
์ด๋ธ์์ ๋ง์ด ์ฌ์ฉ๋ ๋ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค๋ @Icehunter ์ ์๊ฒฌ์ ๋ฐ์ํฉ๋๋ค. makeStyles
์ ๋ฐฑ์
์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@schnerd ์ด๋ฌํ ์๋ฅผ ์กฐํฉํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด ์์ ๋ ์ฐ๋ ค ์ฌํญ์ ์ ๋ง ์ ๋ณด์ฌ์ค๋๋ค. ์ฐธ๊ณ ๋ก ๊ฒ์๋ฌผ ์์ "๋ณด๊ธฐ๊ฐ ์ด๋ ต์ง ์์ต๋๋ค..."๋ ์ผ์ข ์ ๊ฒฝ๋ฉธ์ฒ๋ผ ๋ณด์ผ ์ ์์ผ๋ฉฐ ๋ค๋ฅธ ํ๋ฅญํ ์์ ์ค์ ๋ก ์ถ๊ฐ๋์ง๋ ์์์ต๋๋ค.
@tuxracer ์ฌ๊ณผ โ ์ ๋ฐ์ดํธ๋์์ต๋๋ค.
@Icehunter ๋ฌด์จ ๋ง์ธ์ง ์ดํด๊ฐ ์ ๊ฐ๋๋ฐ SC๋ JSS์์ ๊ณตํต ์คํ์ผ์ ์ฌ์ฉํ์ จ๋์?
@Icehunter ๋ฌด์จ ๋ง์ธ์ง ์ดํด๊ฐ ์ ๊ฐ๋๋ฐ SC๋ JSS์์ ๊ณตํต ์คํ์ผ์ ์ฌ์ฉํ์ จ๋์?
๋ ๋ค ์ฌ์ค. ์ฐ๋ฆฌ๋ ๊ฒฐ๊ตญ makeStyles๋ฅผ ์ฌ์ฉํ์ง๋ง styled={object}๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋์ผํ ์ฑ๋ฅ ๊ฒฐ๊ณผ๋ฅผ ์ป์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ ์ฒด ๊ตฌ์ฑ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ณธ ์ฌ์ดํธ์์ ๋ ๋์ ์ฑ๋ฅ์ ์ป๊ธฐ ์ํด ๋ง์ด๊ทธ๋ ์ด์ ํ๋ก์ธ์ค๋ฅผ ์งํ ์ค์ ๋๋ค.
ํ๋ช ํ ์คํ์ nextjs๋ก ์์ฑ๋์์ต๋๋ค.
๋ช ํํ๊ฒ(ํธ์ง):
SC๋ฅผ ์๋ํ ๋๋ก ์ฌ์ฉํ์ฌ mui ๊ตฌ์ฑ ์์๋ฅผ ๋ํํ์ต๋๋ค. ๋งค์ฐ ๋๋ฆฌ๊ฒ ๋ฐํ์ก์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ๊ณต์ ํ์ผ ์ค์ ์์ makeStyles ๋ฐ/๋๋ style={object} ๋ฐ ๋ก์ปฌ(์๋ฎฌ๋ ์ดํธ๋ ๊ณ๋จ์)์ ์ฌ์ฉํ์ฌ mui ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ํจ์ฌ ๋ ๋น ๋ฆ ๋๋ค.
๋๋ ์ด ์์ด๋์ด๋ฅผ ์ ํ ์ฐจ๋จํ๊ณ ์ถ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ๋ณธ๊ฐ์ธ ๊ฒฝ์ฐ; ๊ทธ๋ฐ ๋ค์ ์ ์ญ์ ์ผ๋ก ํํฅ์ ๊ธฐ๋ณธ ์ ํ์ ์ฌ์ ์ํ๊ณ ์์ฒด์ ์ผ๋ก dep ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ์ด ์์ด์ผ ํฉ๋๋ค.
์๋ง๋ ์ด๊ฒ์? ์ด๊ฒ์ด ๋์๊ฒ ๊ธฐ๋ณธ์ ์ผ๋ก ๋๊ปด์ง๊ธฐ ๋๋ฌธ์ ๋ฐ๋ผ๊ฐ์ง ํ์ ์ด ์์ง ์์ต๋๋ค. ์๋ง๋ ์ผ๋ถ ์ปจํ ์คํธ ๋ฐ/๋๋ ์ ๋ณด๊ฐ ๋๋ฝ๋์์ ๊ฒ์ ๋๋ค.
const MyOutlinedComponent = styled('div')` ${props.disabled && ` border: `1px solid ${({ theme }) => theme.palette.action.disabledBackground}`, `} `; <MyOutlinedComponent disabled/>
์ด ๊ฒ์์ ๋ฆ์ ์๋ ์์ต๋๋ค. ํ์ง๋ง @jedwards1211 ์ ์ด๊ฒ์ SC๋ก ํํํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. https://codesandbox.io/s/magical-snow-5bzd8
๋๋ ๋ด ์์ ์ด ์ด๋ค ๊ณณ์์ ์ด๊ฒ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ ๋ ์ด ์ค๋ฉด v5๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๊ฒ์ด ๊ฐ๋จํ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
์ฌ์ค ์คํ์ผ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ๊ฐ์ ๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์๋ฅผ ๋ค์ด ๋จธํฐ๋ฆฌ์ผ UI๊ฐ ๋ฏธ๋์ Typography
์ ๊ธฐ๋ณธ ๋ณํ ์ฌ์ ์๋ฅผ ์ง์ํ๋ค๋ฉด JSS๊ฐ styled-components๋ณด๋ค ์ฝ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@heb-mm ์ฌ๊ธฐ์ @oliviertassinari ๊ฐ 3์ 7์ผ์ ์ด ์ค๋ ๋๋ฅผ ์ธ๊ธํ ์์ธํ RFC ๊ฐ ์์ต๋๋ค.
์๋ก ์คํฌ๋กคํ์ฌ ์ธ๊ธ์ ๋ณด๋ ๋ฐ 1๋ถ ๋ฏธ๋ง์ด ๊ฑธ๋ ธ์ต๋๋ค.
ํธ์ง: ๊ถ๊ธํ์ ๋ถ๋ค์ ์ํด heb-mm์ด ์ง๊ธ ๋๊ธ์ ์ญ์ ํ์ต๋๋ค.
์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์
styled
์ ์์กดํ๋ ์๋ฃจ์ ์ด MUImakeStyles
๋ณด๋ค 3-4๋ฐฐ ๋๋ฆด ์ ์์์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด CodeSandbox ์์ ๋ฅผ ์์ฑํ์ต๋๋ค.
@schnerd styled-components
๋ฅผ ๋ชจ๋ฐฉํด์ผ ํ๋ Material-UI inhouse styled
API๋ฅผ ํฌํจํ๋๋ก ๋ฒค์น๋งํฌ๋ฅผ ์
๋ฐ์ดํธํ์ต๋๋ค. ๋ค๋ฅธ ์ต์
์ ๋นํด ์์ฒญ๋๊ฒ ๋๋ฆฐ ๊ฒ์ ๋ณด๊ณ ๋๋์ต๋๋ค. https://codesandbox.io/s/css-in-js-comparison-ljtjz?file=/src/App.js ๋ฅผ ์ฐธ์กฐํ์ธ์.
@emotion/styled
(๊ธฐ๋ณธ์ ์ผ๋ก styled-component์ ๋์ผํ API๋ฅผ ๊ฐ์ง)๊ฐ ๋๊ฐ์ด ๋๋ฆด์ง ์๋ ์ฌ๋์ด ์์ต๋๊น? ๊ตฌํ์ ๋ํด ๋ ์ต์ ํํ ์ ์๋ ๋ถ๋ถ์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค.
@emotion/styled
(๊ธฐ๋ณธ์ ์ผ๋ก styled-component์ ๋์ผํ API๋ฅผ ๊ฐ์ง)๊ฐ ๋๊ฐ์ด ๋๋ฆด์ง ์๋ ์ฌ๋์ด ์์ต๋๊น? ๊ตฌํ์ ๋ํด ๋ ์ต์ ํํ ์ ์๋ ๋ถ๋ถ์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค.
https://codesandbox.io/s/css-in-js-comparison-sej1m
์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๋งํผ ๋น ๋ฆ ๋๋ค. ์ฌ์ ํ makeStyle๋งํผ ๋น ๋ฅด์ง ์์ต๋๋ค. ๋ด๊ฐ ๊ฐ์ฅ ๋ง์ด ๋ณด๋ ๋ฌธ์ ๋ ๊ฐ์ฒด ์์ฑ๊ณผ ๊ฐ์ฒด ์บ์ฑ/๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฐจ์ด์ ์ ๋๋ค.
ํ , ์ด๊ฒ์ MUI๋ก์ ๋ง์ด๊ทธ๋ ์ด์
๊ณํ์ ์๋นํ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ํ์ฌ CSS, ํ
๋ง ๋ฐ ์ฑ๋ฅ์ ๊ด๋ฆฌํ๋ ๋ฐ ๋ง์ ๋ฌธ์ ๋ฅผ ๊ฒช์ ํ Material UI ์คํ์ผ๋ง ์์คํ
์ ์ํด styled-components
์์ ๋ฉ์ด์ง๊ณ ์์ต๋๋ค. styled components
์ฒ์์๋ ๊ด์ฐฎ์๊ณ ๊ทธ ์์ ์์ฒด ํ
๋ง ์๋ฃจ์
์ ๊ตฌ์ถํ์ง๋ง UI๊ฐ ์ปค์ง๋ฉด์ CSS๋ ์ปค์ก์ต๋๋ค. ์ฐ๋ฆฌ๋ TypeScript๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์ธ๋ผ์ธ CSS ๋ฌธ์์ด ๋์ JS ๊ฐ์ฒด๋ฅผ ์ฝ๊ฒ ๋ฆฌํฉํ ๋งํ ์ ์๋ค๋ ์ฌ์ค์ด ํฐ ์ฅ์ ์ด์์ต๋๋ค. ๐
๊ทธ๋์ ์ ๋ Material UI๋ฅผ ์ฒ์ ์ ํ๊ณ v5์ ์ํ ๋ฆด๋ฆฌ์ค๋ ๋ณด์์ต๋๋ค. @ ldiego08 ๋น์ ์ ๋งํ๋ค :
์ฐ๋ฆฌ๋ ํ์ฌ Material UI ์คํ์ผ๋ง ์์คํ ์ ์ํด styled-components์์ ๋ฉ์ด์ง๊ณ ์์ต๋๋ค.
๋๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์์ผ๋ก ์์ ํ ๋ ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋จธํฐ๋ฆฌ์ผ UI ์คํ์ผ๋ง ์์คํ ์ด๋ ๋ฌด์์ด๋ฉฐ, ์์ผ๋ก ๋จธํฐ๋ฆฌ์ผ UI์์ ์คํ์ผ๊ณผ CSS๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๊ถ์ฅํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ธ๊ฐ์? ๋๋ ์ด ํ์ด์ง๋ฅผ ์ฝ์๊ณ CSS-IN-JS์ ์ฐฌ์ฑํ๋์ง ์๋์ง ๋ช ํํ์ง ์์ต๋๋ค: https://material-ui.com/system/basics/. ์ ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฒด ๊ตฌ๋ฌธ์ด ์๋ CSS๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ ํธํ๋ฉฐ "์ผ๋ฐ CSS ๊ตฌ๋ฌธ"์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ CSS-IN-JS๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ๋๋ ธ์ง๋ง ์์ JS์ ํ๋ ์์ต๋๋ค.
์์ํ๋ ๋ฐ ๋์์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
styled-components API๊ฐ ์ ๊ทธ๋ ๊ฒ ์ธ๊ธฐ๊ฐ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ ๋๋ฆฌ๋ฏ๋ก ํด๋์ค ์ด๋ฆ์ ์์ฑํ๋ ๋์ ๋ชจ๋ ๊ฒ์ ๊ตฌ์ฑ ์์๋ก ๋ํํด์ผ ํฉ๋๋ค. ๋ํ ํ๊ทธ๊ฐ ์ง์ ๋ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ๋ฌด์์ ๋๊น? ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ์์ด๋ก ์์ฑํ๋ ๊ฒ์ด ํจ์ฌ ๋ซ๊ธฐ ๋๋ฌธ์ CSS ํ์ผ์ CSS๋ฅผ ์์ฑํ๊ณ ์ถ์ง ์์์ต๋๋ค. :D ๊ฐ์ฒด ๊ตฌ๋ฌธ์ ๊ตฌ์ฑ ๋ฐ ๋ฆฌํฉํ ๋ง ๋ฑ์ ๊ฒฝ์ฐ ํจ์ฌ ๋ ๊ฐ๋ ฅํฉ๋๋ค. ์ ์๊ฒ๋ CSS ๊ฐ์ฒด๋ฅผ ์ทจํ๊ณ ํด๋์ค ์ด๋ฆ์ ๋ฐํํ๋ ํ๋ฒํ ๊ฐ์ css ๋ฐ cx ํจ์๊ฐ ๊ฐ์ฅ ์ ์ฐํ๊ณ ๊ฐ๋ ฅํ API์ ๋๋ค. ๋ฐ๋ผ์ ๋จ์ํ ๊ฐ์ ์ด ํฌํจ๋ ํด๋์ค ์ด๋ฆ์ ์์ฑํ๊ณ ํด๋์ค API๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋งค์ฐ ์ ์ฐํ๊ณ ๊ฐ๋ ฅํฉ๋๋ค. ๊ทธ๋์ ์ "๋ ํธ๋ฆฌํ ๊ฐ๋ฐ์ API"๋ฅผ ์ํด ์ฑ๋ฅ๊ณผ ์ ์ฐ์ฑ์ ๊ตํํ๋์ง ์ดํดํ ์ ์์ต๋๋ค(์ด๋ค ์ฌ๋๋ค์๊ฒ๋ ๋์ฐํ API์ ๋๋ค).
styled-components API๊ฐ ์ ๊ทธ๋ ๊ฒ ์ธ๊ธฐ๊ฐ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ ๋๋ฆฌ๋ฏ๋ก ํด๋์ค ์ด๋ฆ์ ์์ฑํ๋ ๋์ ๋ชจ๋ ๊ฒ์ ๊ตฌ์ฑ ์์๋ก ๋ํํด์ผ ํฉ๋๋ค. ๋ํ ํ๊ทธ๊ฐ ์ง์ ๋ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ๋ฌด์์ ๋๊น? ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ์์ด๋ก ์์ฑํ๋ ๊ฒ์ด ํจ์ฌ ๋ซ๊ธฐ ๋๋ฌธ์ CSS ํ์ผ์ CSS๋ฅผ ์์ฑํ๊ณ ์ถ์ง ์์์ต๋๋ค. :D ๊ฐ์ฒด ๊ตฌ๋ฌธ์ ๊ตฌ์ฑ ๋ฐ ๋ฆฌํฉํ ๋ง ๋ฑ์ ๊ฒฝ์ฐ ํจ์ฌ ๋ ๊ฐ๋ ฅํฉ๋๋ค. ์ ์๊ฒ๋ CSS ๊ฐ์ฒด๋ฅผ ์ทจํ๊ณ ํด๋์ค ์ด๋ฆ์ ๋ฐํํ๋ ํ๋ฒํ ๊ฐ์ css ๋ฐ cx ํจ์๊ฐ ๊ฐ์ฅ ์ ์ฐํ๊ณ ๊ฐ๋ ฅํ API์ ๋๋ค. ๋ฐ๋ผ์ ๋จ์ํ ๊ฐ์ ์ด ํฌํจ๋ ํด๋์ค ์ด๋ฆ์ ์์ฑํ๊ณ ํด๋์ค API๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋งค์ฐ ์ ์ฐํ๊ณ ๊ฐ๋ ฅํฉ๋๋ค. ๊ทธ๋์ ์ "๋ ํธ๋ฆฌํ ๊ฐ๋ฐ์ API"๋ฅผ ์ํด ์ฑ๋ฅ๊ณผ ์ ์ฐ์ฑ์ ๊ตํํ๋์ง ์ดํดํ ์ ์์ต๋๋ค(์ด๋ค ์ฌ๋๋ค์๊ฒ๋ ๋์ฐํ API์ ๋๋ค).
๋๋ ๊ฐ์ ์ฐ๋ ค๋ฅผ ๊ฐ์ก์ต๋๋ค :) ์๋ง๋ ์ํฉ์ด ์กฐ๊ธ ์ ๋ฆฌ๋ ๊ฒ์
๋๋ค.
https://github.com/mui-org/material-ui/issues/6115#issuecomment -580449539
@martinjlowm ๋ค, ์ฐ๋ฆฌ๋ ๊ฐ์ ํ์ด์ง์ ์์ต๋๋ค :) ๋จธํฐ๋ฆฌ์ผ UI ํ์ผ๋ก ๊ฐ๋ ๊ฐ์ฅ ํ๋ช ํ ๋ฐฉ๋ฒ์ ์ผ์ข ์ ํ๋ฌ๊ทธ์ธ ๊ฐ๋ฅํ ์๋ฃจ์ ์ ๊ตฌํํ๊ณ js ์๋ฃจ์ ์ CSS์ ๊ฒฐํฉํ์ง ์๊ณ ์ฌ๋๋ค์ด ๋ฌด์์ ์ฌ์ฉํ ์ง ์ ํํ๊ฒ ํ๊ณ ๊ทธ๋ฐ ์์ผ๋ก ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ ์ฅํ์ญ์์ค. ๋ํ ํด๋์ค์ createMuiTheme API๋ฅผ ์ ์งํ๋ ๊ฒ์ด ๊ฐ์ฅ ๊ฐ๋ ฅํ ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ์๊ฒ js์ css๋ ๊ตฌ์ฑ ์์ ์ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์์ฌ์ด ๋์ ์คํ์ผ, CSS ๋๋ ์ ์ฒด ๊ตฌ์ฑ ์์๋ฅผ ๋ฆฌํฉํ ๋งํ๊ฑฐ๋ ์ญ์ ํ ๋์ ์์ ๊ฐ(๊ฐ์ฒด ์ ๊ทผ ๋ฐฉ์์ด ์ฐ์ํ ๊ณณ), ์ฑ๋ฅ(์ธ๋ถ ์คํ์ผ์ํธ์์ ์ฌ์ฉํ์ง ์๋ ์คํ์ผ์ ๋ค์ด๋ก๋ํ์ง ์์)์ ๊ดํ ๊ฒ์ ๋๋ค. , ๋ฑ๋ฑ. ๊ทธ๋ฆฌ๊ณ ๋ค์, ๋๋ ์ ์ฌ๋๋ค์ด ์ผ๋ถ ํธ์ง๊ธฐ ๊ฐ์กฐ ํ์์ ํจ๊ป ๋ฌธ์์ด์ ์ฐ๋ ๊ฒ์ ์ข์ํ๋์ง ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ปจํ ์คํธ์์ props์ ์ก์ธ์คํ๋ ค๋ฉด ${}๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๋ฐฐ๊ฒฝ od div ์์๋ฅผ ์ค์ ํ๋ ๊ฒ๋ณด๋ค ๋ ๋ณต์กํ ๊ฒฝ์ฐ ๊ทธ ์ ๊ทผ ๋ฐฉ์์ ์ง์ ๋ถํ๊ณ ๋ด ์๊ฒฌ์ผ๋ก๋ ์ฝ์ ์ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๊ฐํํ๋ ๊ฒ์ด ์๋๋๋ค. ๋จ์ง ๋ด ์๊ฐ์ ๋งํ๊ณ ๋ชจ๋ ๊ฐ๋ฐ์๊ฐ ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๋ฅผ ์ข์ํ์ง ์๋๋ค๋ ์ ์ ์ฆ๋ช ํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ผ๋ฉฐ, ๊ทธ๋ ๋ค๊ณ ํ๋๋ผ๋ ์ฑ๋ฅ๊ณผ ์ ์ฐ์ฑ์ ๊ตํํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ข์ ๊ฑฐ๋์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. :)
@vdjurdjevic ์ค์ ๋ก js ์๋ฃจ์ ์์ material-ui๋ฅผ ํ๋์ css์ ๊ฒฐํฉํ๋ ๊ฒ์ css-in-js ๊ดํ์ด ๋ถ๊ฐํผํ๊ฒ ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ์ฑ์ฅํ ๋ ์ถฉ๋์ ๋ํ ๊ฑฐ์ ๋ณด์ฅ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
ํน์ css-in-js ๊ณต๊ธ์๋ก ์คํ์ผ์ ์ ์ฉํ๋ ์ด๋ํฐ ํจํด์ ์ด๋ป์ต๋๊น? ์คํ์ผ ์์ฒด๋ material-ui ํจํค์ง ๋ด์์ ์ผ๊ด๋ ํ์์ผ๋ก ์ ์๋์ด์ผ ํฉ๋๋ค. ํด๋น ์ด๋ํฐ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ํ๋๋ ์คํ์ผ์ ์ ์ฉํ๋ ๊ฒ์ ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ด ์์ต๋๋ค.
import {EmotionAdapter, StyledComponentAdapter, ThemeProvider} from "@material-ui/core/styles";
...
return
(<ThemeProvider theme={theme} adapter={EmotionAdapter}>
...
</ThemeProvider>)
@vdjurdjevic https://github.com/mui-org/material-ui/issues/6115#issuecomment -652762320์ ๋ํ ๊ทํ์ ์๊ฐ์ ๊ฑฐ์ ๋์ํฉ๋๋ค. ๋ด๊ฐ ์ต๊ทผ์ https://github.com/mui-org/material-ui/issues/16947#issuecomment -653797178์์ ๊ณต์ ํ ๋ฐฉํฅ์ ๋ํ ์์ฝ์ด ๋ง์์ ๋์ค ๊ฒ์ ๋๋ค.
๋๋ ์ ์ฌ๋๋ค์ด ์ผ๋ถ ํธ์ง๊ธฐ ๊ฐ์กฐ ํ์๋ก ๋ฌธ์์ด ์ ์์ฑํ๋ ๊ฒ์ ์ข์ํ๋์ง ์ดํดํ์ง ๋ชปํฉ๋๋ค.
๋ด ๊ด์ ์์ ๋ช ๊ฐ์ง ์ด์ :
React.createElement('div', {})
๋ฅผ ์ฐ์ง ์๋ ์ด์ ์ ๊ฐ๊น์ต๋๋ค.@oliviertassinari ์ข์, ์ด๊ฒ๋ค์ ๋ช ๊ฐ์ง ํ์คํ ์์ ์ ๋๋ค. ์ ๋ ๋์ํฉ๋๋ค. :) ํ์ง๋ง ์ฌ์ ํ ์ ์๊ฒ(๋์์ด๋, ์ด์ฌ์, ์ ์ ๊ฐ๋ฐ์๊ฐ ์๋) ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์์ ํ๊ทธ๊ฐ ์ง์ ๋ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ์ ๋ ์ ํ ์ฌํญ์ด ์๋๋๋ค. ์ถ๊ฐ ๊ฐ๋ฐ ๋ฐฉํฅ์ ๋ํ ์์ฝ์ ์ฝ์์ผ๋ฉฐ CSS ์์ง์ด ์ ํ ์ฌํญ์ด๋ผ๋ ์์์ ๋ฃ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ ํํ ์ ์๋ ํ styled-components๋ฅผ ๊ธฐ๋ณธ๊ฐ(๋๋ถ๋ถ์ ์ฌ์ฉ์๊ฐ ์ข์ํ๋ ๊ฒฝ์ฐ)์ผ๋ก ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค. ์์งํ ๋งํด์ ๋ค์ ํ๋ก์ ํธ๋ฅผ ์ํด v4์์ JSS๋ฅผ ๊ณ ์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ช ๊ฐ์ง ๋ฉ์ง ๊ธฐ๋ฅ(์: ํ์ฅ ๋ฐ ๊ตฌ์ฑ ํ๋ฌ๊ทธ์ธ)์ด ์์ต๋๋ค. ๊ฐ์ ์ ์ํด ์คํ์ผ๋ฆฌ์ค ํ๋ฌ๊ทธ์ธ์ ์์ฑํด์ผ ๋น์ทํ ๊ฒ์ ๊ฐ์ง ์ ์์์ต๋๋ค.
์ถ์ . ์ ๋ JSX์ ํฌ๋ ์๋๋๋ค. :) ๊ธ๋ฐฉ ์ง์ ๋ถํด์ง๊ณ ๊ฒฐ๊ตญ ํ์ดํ ์ฝ๋๊ฐ ํ์๋๊ณ ๋์ ์์๋ฅผ ๋ ๋๋งํด์ผ ํ๋ ๊ตฌ์ฑ ์์์ ๊ฒฝ์ฐ createElement๋ฅผ ์ฌ์ฉํ ์ ๋ฐ์ ์์ต๋๋ค. createElement๋ก ์ง์ ์์ ํ๋ ๊ฒ์ด ๋ ๋ซ๋ค๋ ๊ฒ์ด ์๋๋ผ JSX๊ฐ ์ด์์ ์ด์ง ์๋ค๋ ๊ฒ์ ๋งํ๋ ๊ฒ์ ๋๋ค. ๋ด ์๊ฐ์ Flutter๋ ์ต๊ณ ์ DX๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์ธ์ ๊ฐ๋ ์น ํ๋ซํผ์ ์ ๋ค๋ฃฐ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@oliviertassinari https://github.com/mui-org/material-ui/issues/6115#issuecomment -643398897์ ์ธ๊ธ๋ ๋๋ก ์งํ ์ค์ธ ์ฑ๋ฅ ํ ์คํธ์ ๋ฐ๋ผ ๋จธํฐ๋ฆฌ์ผ ํ์ด ์ธ๊ธฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๋ฅผ ์ ํํ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋๋ฆฝ๋๋ค. ํญ์ ๊ทธ๋์๋ค. ๊ฐ์ธ์ ์ผ๋ก CSS์ JS ํ๊ธฐ๋ฒ ๊ฐ์ ๊ฒ์ ๋ฐฐ์์ผ ํ๋ ๊ฒ์ด ๊ฐ๋ฐ์๊ฐ ๋๋ ์์ ์ ๋๋ค.
๊ทธ๊ฒ์ ์์ ์ ์ผ๋ถ์ ๋๋ค.
๊ฐ๋ฐ์์ ์ถ์ ๋ ์ฝ๊ฒ ๋ง๋๋ ๊ฒ์ ํจํค์ง ์ ์ง ๊ด๋ฆฌ์๋ก์ ์ฐ๋ฆฌ๊ฐ ํ๋ ์ผ์ ์ผ๋ถ์ด์ง๋ง(๋ด ํ๋ก์ ํธ์ ๊ฒฝ์ฐ) ์ด๋ฅผ ์ฝ๊ฒ ๋ง๋๋ ๊ฒ๊ณผ ์ฑ๋ฅ์ ๋์ด๋ ๊ฒ ์ฌ์ด์๋ ์ ์ด ์์ต๋๋ค.
์ด๊ฒ์ด ๋ด๊ฐ makeStyles๋ง ์ฌ์ฉํ๊ณ ๋์ ๋ ์ดํ๋ก ํญ์ ์ฌ์ฉํ๋ ์ด์ ์ ๋๋ค.
๋ด ๋ง์ง๋ง ํ ๊ฑด์ถ๊ฐ๋ ๋ฃ์ง ์๊ณ ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ฌ ์ง๊ธ ์ฌ์ดํธ๊ฐ ๋๋ฆฝ๋๋ค. ํ ์คํธ ๋ธ๋์น์์ makeStyles๋ก ์ ํํ์ฌ ๋ชจ๋ฐ์ผ ์ฅ์น์ TTI์์ 50%(10์ด)๋ฅผ ์ ์ฝํ์ง๋ง, ๊ทธ ๋๊ธ์์ ๋งํ๋ฏ์ด JS ํ๊ธฐ๋ฒ์ ๋ชจ๋ ์ฌ๋์๊ฒ ์๋ ค์ ธ ์์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐ์๋ค์ฌ์ง์ง ์์์ต๋๋ค.
๋ด๋ถ์ ์ผ๋ก ์ฌ๋ฃ๋ ์ํ๋ ๋๋ก ์ ํํ ์ ์์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๋ฅ์ ๋ฐํํ๋๋ก ํ์ญ์์ค.
[์ง๋ฌธ์ด StackOverflow๋ก ์ด๋ํ์ต๋๋ค.]
@haysclark ์ง์ ์ง๋ฌธ์ ๋ํด์๋ RFC์ ๋ตํ์ง ๋ง๊ณ StackOverflow๋ฅผ ์ฌ์ฉํ์ธ์.
@haysclark ์ง์ ์ง๋ฌธ์ ๋ํด์๋ RFC์ ๋ตํ์ง ๋ง๊ณ StackOverflow๋ฅผ ์ฌ์ฉํ์ธ์.
@mbrooks ๋ฏธ๋ฆฌ ์๋ ค ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
@emotion/styled
(๊ธฐ๋ณธ์ ์ผ๋ก styled-component์ ๋์ผํ API๋ฅผ ๊ฐ์ง)๊ฐ ๋๊ฐ์ด ๋๋ฆด์ง ์๋ ์ฌ๋์ด ์์ต๋๊น? ๊ตฌํ์ ๋ํด ๋ ์ต์ ํํ ์ ์๋ ๋ถ๋ถ์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค.https://codesandbox.io/s/css-in-js-comparison-sej1m
์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๋งํผ ๋น ๋ฆ ๋๋ค. ์ฌ์ ํ makeStyle๋งํผ ๋น ๋ฅด์ง ์์ต๋๋ค. ๋ด๊ฐ ๊ฐ์ฅ ๋ง์ด ๋ณด๋ ๋ฌธ์ ๋ ๊ฐ์ฒด ์์ฑ๊ณผ ๊ฐ์ฒด ์บ์ฑ/๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฐจ์ด์ ์ ๋๋ค.
Box ์ปดํฌ๋ํธ์ ์ฑ๋ฅ์ด ๋น์ ์ ํ๋กํ์ผ๋ง๊ณผ ๋น๊ต๋ ์ง ๊ถ๊ธํด์ Chakra-UI์ Box๋ฅผ ์ถ๊ฐํ์ฌ ์ข์ ์ธก์ ์ ํ๊ณ ๊ฒฐ๊ณผ๋... ์์ธ์์ต๋๋ค :P
https://codesandbox.io/s/css-in-js-comparison-forked-mg3gx?file=/src/App.js
@Nvveen Chakra-UI v1์ ์ฌ์ฉํด ๋ณด์ จ์ต๋๊น? ๋ค์ ์์ฑ๋์์ผ๋ฉฐ ์๋ง๋๋ฉด ๋ ๋์์ง ๊ฒ์ ๋๋ค. ์์ง ๋ฒ ํ ๋ฒ์ ์ด์ง๋ง ๊ฐ์ v11๋ ์์ต๋๋ค.
@Nvveen Chakra-UI v1์ ์ฌ์ฉํด ๋ณด์ จ์ต๋๊น? ๋ค์ ์์ฑ๋์์ผ๋ฉฐ ์๋ง๋๋ฉด ๋ ๋์์ง ๊ฒ์ ๋๋ค. ์์ง ๋ฒ ํ ๋ฒ์ ์ด์ง๋ง ๊ฐ์ v11๋ ์์ต๋๋ค.
์ต์ RC๋ก ๋ฐฉ๊ธ ์๋ํ์ง๋ง ๋์ ๋๋ ์ฐจ์ด๋ ์์์ต๋๋ค. ์ฌ์ ํ ์ผ๋ฐ SC๋ณด๋ค ์ฝ 1.5~2๋ฐฐ ๋๋ฆฝ๋๋ค. ๋์๊ฒ ๊ฐ์ฅ ํฐ ์ง๋ฌธ์ MUI Box๊ฐ ์ ๊ทธ๋ ๊ฒ ๋๋ฆฐ๊ฐ์ ๋๋ค.
@Nvveen Chakra-UI v1์ ์ฌ์ฉํด ๋ณด์ จ์ต๋๊น? ๋ค์ ์์ฑ๋์์ผ๋ฉฐ ์๋ง๋๋ฉด ๋ ๋์์ง ๊ฒ์ ๋๋ค. ์์ง ๋ฒ ํ ๋ฒ์ ์ด์ง๋ง ๊ฐ์ v11๋ ์์ต๋๋ค.
์ต์ RC๋ก ๋ฐฉ๊ธ ์๋ํ์ง๋ง ๋์ ๋๋ ์ฐจ์ด๋ ์์์ต๋๋ค. ์ฌ์ ํ ์ผ๋ฐ SC๋ณด๋ค ์ฝ 1.5~2๋ฐฐ ๋๋ฆฝ๋๋ค. ๋์๊ฒ ๊ฐ์ฅ ํฐ ์ง๋ฌธ์ MUI Box๊ฐ ์ ๊ทธ๋ ๊ฒ ๋๋ฆฐ๊ฐ์ ๋๋ค.
Jss๋ฅผ ์ฌ์ฉํฉ๋๋ค. SC๋ ์ ์ด๋ ๋ค์ ๋ซ์ต๋๋ค.
๋ด ์ปดํจํฐ์์ ํ ์คํธ ์ผ์ด์ค๊ฐ ์คํ๋๋ ์์๋ ๊ฒฐ๊ณผ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๋น๊ตํ๋ค
@oliviertassinari ๊ฐ๋น์ง ์์ง ๋ฐ v8์ jit๊ฐ ์์ธ์ ๋๋ค. ํ ์คํธ ์คํ์ ๋ถ๋ฆฌ/๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋์ค ํ ์คํธ๋ ๋ ๋์ ์งํธ๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง ๋๋๋ก ๊ฐ๋น์ง ์์ง์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
๊ฐ์ , SC ๋ฐ ์ฐจํฌ๋ผ๋ ๊ฐ๊ฐ์ ์์ ๊ตฌ์ฑ ์์์ ์ฅ์ฐฉํ ๊ณ ์ ํ ์คํ์ผ์ด ์๊ณ MUI ์คํ์ผ์ด ์์ง ์์ ํ ์ต์ ํ๋์ง ์์ ๊ฒฝ์ฐ ์ด๋ก ์ ์ธ ์ต๋ ์ฑ๋ฅ์ ๊ทผ์ ํ ๊ฒ ๊ฐ์ต๋๋ค. makeStyles/pure CSS์์์ ๊ฐ์ด ์ ์ฒด ๊ตฌ์ฑ ์์ ํธ๋ฆฌ์ ๋ํด ํ๋์ ์คํ์ผ ์ํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ๋์ ์ฑ๋ฅ์ ์ป์ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฐ์ , SC ๋ฑ์ ์ํ ์ถ๊ฐ 30ms๋ ์คํ์ผ์ด ๋ง์ดํธ๋์๋์ง ํ์ธํด์ผ ํ๋ ๊ฐ ์์ ๊ตฌ์ฑ ์์์ ํผํ ์ ์๋ ์ค๋ฒํค๋์ ๋๋ค.
@jedwards1211 dx๋ฅผ ์ ์งํ๋ ๊ฒ์ด๋ผ๋ฉด Atlassian์ ์ด๋ฅผ css๋ก ์ปดํ์ผ ํ๋ lib๋ฅผ ๋ง๋ค์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@oliviertassinari https://github.com/mui-org/material-ui/issues/6115#issuecomment -643398897์ ์ธ๊ธ๋ ๋๋ก ์งํ ์ค์ธ ์ฑ๋ฅ ํ ์คํธ์ ๋ฐ๋ผ ๋จธํฐ๋ฆฌ์ผ ํ์ด ์ธ๊ธฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๋ฅผ ์ ํํ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋๋ฆฝ๋๋ค. ํญ์ ๊ทธ๋์๋ค. ๊ฐ์ธ์ ์ผ๋ก CSS์ JS ํ๊ธฐ๋ฒ ๊ฐ์ ๊ฒ์ ๋ฐฐ์์ผ ํ๋ ๊ฒ์ด ๊ฐ๋ฐ์๊ฐ ๋๋ ์์ ์ ๋๋ค.
๊ทธ๊ฒ์ ์์ ์ ์ผ๋ถ์ ๋๋ค.
๊ฐ๋ฐ์์ ์ถ์ ๋ ์ฝ๊ฒ ๋ง๋๋ ๊ฒ์ ํจํค์ง ์ ์ง ๊ด๋ฆฌ์๋ก์ ์ฐ๋ฆฌ๊ฐ ํ๋ ์ผ์ ์ผ๋ถ์ด์ง๋ง(๋ด ํ๋ก์ ํธ์ ๊ฒฝ์ฐ) ์ด๋ฅผ ์ฝ๊ฒ ๋ง๋๋ ๊ฒ๊ณผ ์ฑ๋ฅ์ ๋์ด๋ ๊ฒ ์ฌ์ด์๋ ์ ์ด ์์ต๋๋ค.
์ด๊ฒ์ด ๋ด๊ฐ makeStyles๋ง ์ฌ์ฉํ๊ณ ๋์ ๋ ์ดํ๋ก ํญ์ ์ฌ์ฉํ๋ ์ด์ ์ ๋๋ค.
๋ด ๋ง์ง๋ง ํ ๊ฑด์ถ๊ฐ๋ ๋ฃ์ง ์๊ณ ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ฌ ์ง๊ธ ์ฌ์ดํธ๊ฐ ๋๋ฆฝ๋๋ค. ํ ์คํธ ๋ธ๋์น์์ makeStyles๋ก ์ ํํ์ฌ ๋ชจ๋ฐ์ผ ์ฅ์น์ TTI์์ 50%(10์ด)๋ฅผ ์ ์ฝํ์ง๋ง, ๊ทธ ๋๊ธ์์ ๋งํ๋ฏ์ด JS ํ๊ธฐ๋ฒ์ ๋ชจ๋ ์ฌ๋์๊ฒ ์๋ ค์ ธ ์์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐ์๋ค์ฌ์ง์ง ์์์ต๋๋ค.
๋ด๋ถ์ ์ผ๋ก ์ฌ๋ฃ๋ ์ํ๋ ๋๋ก ์ ํํ ์ ์์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๋ฅ์ ๋ฐํํ๋๋ก ํ์ญ์์ค.