styled-components와 함께 가장 많이 사용되고 있는 CSS in JS 라이브러리 중 하나이며, 개발자 친화적인 인터페이스와 styled-components보다 빠른 성능, 조금 더 작은 번들사이즈가 장점이다.
@emotion/styled
라이브러리를 사용하면 styled-components와 동일한 방식으로 컴포넌트를 정의할 수 있지만 styled-components내에서 사용하는 심화적인 기능은 사용할 수 없다 (대표적으로 attrs)
Next.js에서도 별도의 추가설정 없이 SSR을 지원하고 있다! 그로인해 babel-plugin을 사용하지 않으므로 Next.js 12에서 추가된 SWC를 사용할 수 있다.
React.createElement
가 아닌 emotion 내의 jsx 함수를 사용해서 생성하도록 Pragma를 작성해서 바벨이 jsx구문을 해석하는 방식을 명시해줘야 한다.// 아래의 Pragma를 통해 jsx을 파싱할 때 jsx함수를 호출하도록 명시한다.
/** @jsx jsx */
import { jsx } from '@emotion/react'
// styled-components or emotion
styled.div`
color: ${({isRed}) => isRed ? 'red' : 'black'};
background-color: ${({isRed}) => isRed ? 'green' : 'white'};
// ...
`;
// only emotion
styled.div(({isRed}) => {
const [ color, backgroundColor ] = isRed ? ['red', 'green'] : ['black', 'white'];
return { color, backgroundColor }
)
// or
styled.div(({isRed}) => css`
color: ${isRed ? 'red' : 'black'};
background-color: ${isRed ? 'red' : 'black'};
`