인포메이트 8주차 공유(프레임워크 & 라이브러리)
인포메이트 8주차 공유(프레임워크 & 라이브러리) 모음입니다.
CSS 전처리기 및 라이브러리 - 윤해진
스타일링 시간 단축하려면 Tailwind를 쓰세요 - 김하나
한글 초성 검색 구현 어렵지 않아요 - 곽승주
style-dictionary로 디자인 토큰 활용하기 - 김민재
CSS 전처리기 및 라이브러리 - 윤해진
들어가는 말)
개발을 하며 다양한 css 전처리기 및 라이브러리를 사용한 경험이 있습니다. 그러나 각각의 특징에 대해서는 깊게 생각해 본 적이 없었습니다. 이번 글에서는 대표적인 CSS 방식인 Sass, SCSS, 그리고 CSS-in-JS에 대해 설명하고, 각 방식에 해당하는 라이브러리를 소개하겠습니다.
[ Sass ]
CSS는 규모가 커질수록 코드가 복잡해지고, 유지보수가 불편해집니다. CSS 코드 내에서 동일 한 혹은 유사한 코드를 재사용하기 위해서 '복사 & 붙여넣기'가 점점 많아집니다. 이는 무척 귀찮고 또 실수를 유발하는 작업입니다.
Sass는 컴파일 과정을 통해 CSS 파일을 생성해 주는 CSS의 확장 언어이자 전처리기(preprocessor)로써, CSS에는 존재하지 않는 다양한 기능들을 가지고 있습니다. 그리고 이 기능들은 코드 작성에 드는 시간을 줄여주고, 코드를 유지 관리하는 데 도움이 됩니다.
그러나 Sass는 CSS의 대체 언어가 아닙니다! Sass는 CSS의 확장 언어입니다. Sass가 제공하는 문법을 기반으로 코드를 작성한 다음, 이를 컴파일해 CSS 파일을 빌드하는 것이 Sass를 통해 스타일시트를 생산하는 절차입니다.
Sass는 다음과 같은 추가 기능과 유용한 도구들을 제공합니다.
- 변수의 사용: Sass에서 변수는
$
기호를 사용하여 정의합니다. 변수를 사용하면 색상, 폰트 크기, 간격 등을 중앙에서 관리할 수 있어 일관성을 유지하기 쉽습니다. - 조건문과 반복문: Sass에서는 조건문(
@if
,@else if
,@else
)과 반복문(@for
,@each
,@while
)을 사용할 수 있어, 복잡한 스타일링 로직을 처리할 수 있습니다. - Import: Sass에서는 **
@import
**를 사용하여 여러 파일로 나눠진 스타일을 하나로 결합할 수 있습니다. 이를 통해 코드의 모듈화와 재사용성을 높일 수 있습니다. - Nesting: Sass는 중첩을 통해 스타일을 구조화할 수 있습니다.
- Mixin: Mixin은 재사용 가능한 스타일 블록을 정의하고, 이를 필요할 때마다 호출하여 사용할 수 있습니다. 인자를 받아 동적인 스타일 링도 가능합니다.
- Extend/Inheritance: **
@extend
**를 사용하면 기존의 CSS 클래스의 스타일을 다른 클래스에 상속할 수 있습니다. 이는 중복 스타일을 피하고, 코드를 간결하게 유지하는 데 유용합니다.
CSS와 비교하여 Sass는 아래와 같은 장점이 있습니다.
- CSS보다 심플한 표기법으로 CSS를 구조화하여 표현할 수 있다.
- 스킬 레벨이 다른 팀원들과의 작업 시 발생할 수 있는 구문의 수준 차이를 평준화할 수 있다.
- CSS에는 존재하지 않는 Mixin 등의 강력한 기능을 활용하여 CSS 유지보수 편의성을 큰 폭으로 향상시킬 수 있다.
[ SCSS ]
Sass를 들어보셨다면 Scss 또한 익숙할 이름이라고 생각합니다. 그러나 둘의 차이는 무엇일까요?
여기서 먼저 알아보면 좋은 것은 Sass라는 이름에는 두 가지 의미가 담겨 있습니다. 하나는 코드를 CSS로 해석하는 역할을 하는 전처리기로서의 의미, 또 다른 하나는 문법(구문)으로써의 의미입니다. Sass 문법을 기반으로 코드를 작성하면, Sass 전처리기의 도움을 받아 CSS 파일을 만들어낼 수 있습니다
그렇다면 SCSS는 SCSS 문법을 기반으로 코드를 작성하면, Sass 전처리기의 도움을 받아 컴파일러가 이를 CSS로 빌드 할 수 있습니다.
다시말해 Sass와 SCSS의 차이는 표현하는 문법에 차이만 있을 뿐 기능은 동일합니다. (파일 확장자로 분리)
- Sass는 들여 쓰기+줄 바꿈 형식
- SCSS는 중괄호+세미콜론 형식
[ CSS in JS ]
CSS-in-JS는 JavaScript 코드 내에서 CSS를 작성하는 방식을 가집니다.
스타일을 컴포넌트 단위로 관리할 수 있어 유지보수성과 모듈화가 뛰어나다는 특징이 있습니다.
React와 같은 컴포넌트 기반 라이브러리와 함께 사용되는 경우가 많습니다.
- JS 파일 안에서 CSS 코드를 작성하기 때문에 CSS의 변수와 함수를 그대로 사용할 수 있습니다.
- 클래스 명이 해시 값으로 치환되기 때문에 클래스 이름의 중복 및 작명에 대한 걱정을 덜 수 있습니다.
- 현대 웹은 컴포넌트를 기반으로 발전하고 있으므로, 컴포넌트와 스타일을 하나의 파일에서 작성하는 CSS-in-JS는 모듈화가 수월해집니다.
css in js의 대표적인 두 가지 라이브러리를 간단하게 살펴보겠습니다.
Styled components
https://styled-components.com/
자동화된 고유 클래스명, 동적 스타일링 지원, 서버 사이드 렌더링과의 호환성 등이 있습니다.
또한 CSS를 컴포넌트에 직접 적용하기 때문에, 컴포넌트 단위로 스타일을 관리할 수 있습니다.
이렇게 하면 스타일 충돌 문제를 방지하고, 유지 보수 및 확장성을 향상시킬 수 있습니다.
import React, { Component } from 'react';
import styled from 'styled-components';
const Title = styled.h1`
color: white;
`;
const Wrapper = styled.div`
background: black
`
class App extends Component {
render() {
return (
<Wrapper>
<Title>Hello World!</Title>
</Wrapper>
);
}
}
export default App;
----
// 사용법
const 컴포넌트이름 = styled.태그이름`
// css 작성
`;
Emotion
https://emotion.sh/docs/introduction
styped-components와 비슷한 방식으로 사용 가능합니다.
- css crop: Emotion을 사용하여 React 컴포넌트를 스타일링할 때, css prop을 직접 컴포넌트에 전달할 수 있습니다. 이는 동적 스타일링, 여러 스타일의 조합이 필요할 때 큰 장점으로 활용됩니다.
/** @jsxImportSource @emotion/react */
Emotion을 사용하여 React 컴포넌트를 스타일링할 때, css prop을 직접 컴포넌트에 전달 가능
import { css } from '@emotion/react';
function App() {
return (
<div
css={css`
background-color: palevioletred;
color: white;
`}
>
안녕하세요, Emotion!
</div>
)
}
/** @jsxImportSource @emotion/react */
css prop은 동적으로 스타일을 적용하는 것에 유용
import { css } from '@emotion/react';
function Button({ primary }) {
return (
<button
css={css`
background-color: ${primary ? 'palevioletred' : 'white'};
color: ${primary ? 'white' : 'palevioletred'};
`}
>
버튼
</button>
)
}
/** @jsxImportSource @emotion/react */
css prop을 여러 스타일과 결합하기
import { css } from '@emotion/react';
interface ButtonProps {
children: React.ReactNode;
theme?: 'primary' | 'secondary';
onClick?: () => void;
}
const Button = ({ children, theme = 'primary', onClick }: ButtonProps) => {
return (
<button css={[style, themes[theme]]} onClick={onClick}>
{children}
</button>
);
};
const style = css`
padding: 10px 20px;
border: none;
border-radius: 4px;
font-size: 16px;
cursor: pointer;
outline: none;
transition: background-color 0.3s;
`;
const themes = {
primary: css`
background-color: palevioletred;
color: white;
&:hover {
background-color: darkviolet;
}
`,
secondary: css`
background-color: white;
color: palevioletred;
border: 1px solid palevioletred;
&:hover {
background-color: palevioletred;
color: white;
}
`,
};
export default Button;
참고
https://poiemaweb.com/sass-basics
https://inpa.tistory.com/entry/SCSS-💎-SassSCSS-란-설치-및-컴파일#sassscss의_등장
https://velog.io/@lgs03042/Styled-components와-Emotion-CSS-in-JS의-비교-및-장단점#4-emotion