— React에서 UI 상태를 “렌더링 없이” 바꾸는 방법
React Zero-UI는 React 애플리케이션에서 UI 상태 변경을 React re-render 없이 처리하는 것을 목표로 하는 라이브러리다.
핵심 아이디어는 명확하다.
UI 상태가 이미 정해져 있다면, 왜 런타임에 다시 렌더링하는가?
React Zero-UI는 UI 상태를 빌드 타임에 미리 생성한다.
data-* attribute즉, 상태 변경 시:
useUIconst [, setTheme] = useUI('theme', 'dark');
setTheme('light'); // body에 data-theme="light"
stateKey → <body data-theme="...">defaultValue → SSR 시 FOUC 방지Tailwind에서는 다음처럼 사용한다.
<div class="theme-dark:bg-black theme-light:bg-white">
Fast & Reactive
</div>
useScopedUI전역이 아닌 특정 요소 단위 UI 상태도 지원한다.
const [theme, setTheme] = useScopedUI('theme', 'dark');
<div
ref={setTheme.ref}
data-theme={theme}
>
Scoped UI
</div>
특징:
data-*가 해당 요소에만 적용UI 상태를 CSS variable로도 관리할 수 있다.
const [blur, setBlur] = useUI('blur', '0px', CssVar);
setBlur('5px'); // body { --blur: 5px }
const [blur, setBlur] = useScopedUI('blur', '0px', CssVar);
<div
ref={setBlur.ref}
style={{ '--blur': blur }}
>
Scoped blur
</div>
개발 시 Zero-UI는 AST를 분석해 다음을 스캔한다.
useUI, useScopedUI 사용 위치그 결과로:
data-* attribute 주입onClickReact Server Components 환경에서도 클라이언트 인터랙션을 가능하게 하는 실험적 기능을 제공한다.
README 기준으로 강조하는 포인트는 다음이다.
React Zero-UI는
UI 상태를 “React state”가 아닌 “CSS 상태”로 다루는 라이브러리다.
렌더링 성능이 병목이 되거나,
테마·모달·토글 같은 UI 상태가 애플리케이션 전반에 퍼져 있는 경우,
이 라이브러리는 전혀 다른 접근을 제안한다.
FOUC(Flash of Unstyled Content)와 FOUT(Flash of Unstyled Text)
FOUC와 FOUT은 웹 페이지 로딩 과정에서 일시적으로 스타일이 적용되지 않은 콘텐츠와 텍스트를 사용자에게 보여주는 현상입니다. 두 현상 모두 스타일 로드 및 적용 시점과 브라우저 렌더링 시점 간의 차이 때문에 발생합니다. FOUC는 일반적인 콘텐츠에, FOUT은 웹 폰트에 대한 스타일 적용 지연 때문에 발생합니다.
출처: https://tooo1.tistory.com/608 [개발자 퉁이리:티스토리]