22 lines
3.4 KiB
Markdown
22 lines
3.4 KiB
Markdown
# [[Zero-Runtime CSS-in-JS|Zero-runtime CSS-in-JS]]
|
|
|
|
## 📌 Brief Summary
|
|
Zero-runtime [[CSS-in-JS|CSS-in-JS]]는 브라우저에서 스타일을 처리하기 위한 JavaScript 런타임 오버헤드 없이, 빌드 타임에 정적 CSS를 생성하는 스타일링 패러다임이다 [1, 2]. 대표적인 도구인 `vanilla-extract`는 타입 안전(type-safe)한 스타일링을 제공하면서도 런타임 비용을 전혀 발생시키지 않는다 [1]. 이는 [[React Server Components|React Server Components]](RSC) 환경과 호환되지 않는 기존 런타임 CSS-in-JS의 한계를 극복하고 네이티브 CSS 수준의 성능을 달성하기 위한 핵심 대안으로 평가받는다 [1-3].
|
|
|
|
## 📖 Core Content
|
|
* **등장 배경 및 RSC 호환성 문제:**
|
|
기존의 [[Styled Components|Styled Components]]나 Emotion과 같은 CSS-in-JS 라이브러리들은 브라우저에서 JavaScript를 실행하여 CSS 문자열을 생성하고 주입하는 런타임 비용을 발생시켰다 [4, 5]. 이러한 방식은 특히 React Context에 의존하기 때문에, Context가 존재하지 않는 React [[Server Components|Server Components]](RSC) 환경에서는 근본적으로 호환되지 않는다는 큰 마찰을 빚게 되었다 [2, 3, 6]. 이러한 성능 및 호환성 문제를 해결하기 위해, 런타임 주입 오버헤드 없이 빌드 타임에 정적 CSS를 생성하는 zero-runtime 패러다임으로의 전환이 요구되었다 [2].
|
|
|
|
* **주요 특징 및 `vanilla-extract`:**
|
|
Zero-runtime CSS-in-JS는 JavaScript 최우선 스타일링의 개발자 인체공학적(ergonomics) 이점을 누리면서도 네이티브 CSS의 성능을 제공하는 것을 목표로 한다 [7]. 이 방식의 대표적인 라이브러리인 `vanilla-extract`는 빌드 타임에 [[CSS Modules|CSS Modules]]처럼 정적인 CSS를 생성하며, TypeScript를 활용해 완전히 타입 안전한(type-safe) 스타일링을 제로 런타임 오버헤드로 지원한다 [1]. 결과적으로 브라우저는 무거운 JavaScript 실행 없이 스타일을 기본적으로 파싱할 수 있게 된다 [2].
|
|
|
|
* **적용 시기 및 모범 사례:**
|
|
다수의 테마를 관리해야 하는 대규모 디자인 시스템을 구축할 때 제로 런타임이면서 타입 안전성을 보장하는 `vanilla-extract`의 사용이 강력히 권장된다 [8]. 반면 [[Next.js App Router|Next.js App Router]]를 사용하는 신규 프로젝트의 경우, 런타임 방식의 CSS-in-JS 사용은 지양해야 하며 zero-runtime CSS-in-JS, [[Tailwind CSS|Tailwind CSS]] 또는 CSS Modules 중 하나를 채택하는 것이 아키텍처 관점에서의 모범 사례이다 [8].
|
|
|
|
## 🔗 Knowledge Connections
|
|
- **Related Topics:** [[React Server Components (RSC)|React Server Components (RSC]], CSS-in-JS, Tailwind CSS, [[Design Tokens|Design Tokens]], [[Next.js App Router|Next.js App Router]]
|
|
- **Projects/Contexts:** [[vanilla-extract|vanilla-extract]], 대규모 디자인 시스템(Large DesignSystems)
|
|
- **Contradictions/Notes:** 기존 런타임 CSS-in-JS(예: [[styled-components|styled-components]])는 컴포넌트 단위의 강력한 동적 스타일링 기능과 편리한 개발자 경험을 제공하지만 [4], [[Next.js|Next.js]] App Router와 같은 최신 RSC 환경에서는 심각한 성능 저하와 런타임 호환성 문제를 야기하므로 Zero-runtime CSS-in-JS나 Tailwind CSS로 마이그레이션하는 것이 대안으로 제시된다 [3, 8].
|
|
|
|
---
|
|
*Last updated: 2026-04-26* |