공부 중이라 잘못된 정보가 있을 수 있습니다. 정정해주시면 감사드리겠습니다 🙏
Styled-Components 장단점을 정리하다가, CSS의 문제점부터 한번 다시 정리해보는 게 좋을 것 같아서 글을 쓴다 🌷
Global namespace
모든 스타일이 global에 선언되어 중복되지 않는 class 이름을 적용해야 함
Dependencies
css 간의 의존관계를 관리하기 힘듦
Dead Code Elimination
기능 추가, 변경, 삭제 과정에서 불필요한 CSS를 제거하기 어려움
Minification
클래스 이름의 최소화가 어려움
Sharing Constants
JS 코드와 상태 값을 공유할 수 없음
Non-deterministic Resolution
CSS 로드 순서에 따라 스타일 우선 순위가 달라짐
Isolation
CSS와 JS가 분리된 탓에 상속에 따른 격리가 어려움
이러한 문제점을 해결하려고 CSS-in-CSS, CSS-in-JS 방식이 등장
CSS의 문제점을 해결하기 위해 등장한 CSS-in-CSS는 대표적으로 SASS(SCSS), CSS Modules 가 있다.
대표적인 차이는, SASS는 들여쓰기 문법을 쓰고 SCSS는 중괄호 문법을 쓴다. 공식 페이지에서도 SCSS 문법을 기준으로 설명하고 있고, 개발자에게 더 친근한 문법이 SCSS 이므로 SCSS가 더 선호되는 것 같다. 때문에 아래에서는 SCSS로만 정리했다.
.section {
background-color: pink;
.div {
.name {
font-size: 20px;
}
}
}
$bg-color: blue;
$bg-img: "/assets/images/";
.box {
background: $bg-color url($bg-img + "bg.jpg");
}
@mixin replace-text($image, $x: 50%, $y: 50%) {
text-indent: -99999em;
overflow: hidden;
text-align: left;
background: {
image: $image;
repeat: no-repeat;
position: $x $y;
}
}
.mail-icon {
@include replace-text(url("/images/mail.svg"), 0);
}
.list {
li {
&:last-child {
margin-right: 0;
}
}
}
하지만 SCSS도 여전히 클래스 중복의 문제점을 해결해주진 못했고, 이를 해결할 수 있는 방법으로 CSS Modules 가 등장한다.
중복 클래스명을 더 이상 신경쓰지 않아도 됨( 모든 CSS 선택자에 고유한 해시값을 부여함으로써 속성 중첩을 방지함 )
css, scss, sass 파일에 모두 사용 가능함
// App.jsx
// 아래와 같이 import 해서 사용
import styles from "./styles.module.css";
function App() {
return (
<div id={styles.container}>
<button className={styles.button}>버튼</button>
</div>
);
}
export default App;
그러나 CSS Modules 도 다음과 같은 단점이 있다.
중복 클래스를 써도 상관 없으니 클래스명을 성의없이 작성해도 동작한다
각 컴포넌트별로 css 파일을 생성하다 보니 프로젝트 규모가 커졌을 때 너무 많은 CSS 파일을 관리해야 한다
이로써 더 발전한 CSS-in-JS 방식이 등장한다. 대표적인 CSS-in-JS 라이브러리인 Styled-Components 의 장점은 다음과 같다.
CSS를 컴포넌트 레벨로 추상화한다
js 환경을 최대한으로 활용 가능하다( JS와 CSS에서 상수, 함수를 공유한다 )
const Button = styled.a`
background: transparent;
color: white;
${props =>
props.primary &&
css`
background: black;
color: palevioletred;
`}
`;
Styled-Components 의 단점은 다음과 같다.
러닝 커브(Learning curve)가 느리다
컴포넌트가 렌더링 될 때 CSS가 적용되기 때문에, FOUC 가 발생할 수 있다
( FOUC( Flash of unstyled content ) : 스타일 시트가 적용되기 전 마크업 된 그대로의 모습이 잠깐 보이는 현상 )
별도의 라이브러리 설치에 따라 번들 크기 증가, CSS-in-CSS에 비해 느린 속도
둘 중 뭐가 더 좋다기 보다, 프로젝트의 규모, 성격에 맞게 잘 선택해야 할 것이다.
보여줄 게 많은 인터랙티브한 페이지에서는 CSS-in-CSS 방식이 더 나을 수 있고, 컴포넌트 위주의 페이지에서는 컴포넌트가 랜더링 될 때 CSS 가 로드되는 CSS-in-JS 방식이 나을 수 있다.
CSS-in-JS 도 계속 발전하고 있으니, 잘 학습해서 적용하는 것이 중요해 보인다.
CSS의 진화 과정
CSS를 대체할 CSS in CSS, CSS in JS
웹 컴포넌트 스타일링 관리
CSS-in-JS 에 대해서