탐색

Vite와 Master CSS: CSS 생성 시점 선택하기

하나의 대화형 앱을 소스 스캔, 출력 HTML, 연결된 DOM으로 살펴보며 인터페이스 변경에 런타임 CSS가 필수가 아닌 이유를 이해합니다.

대화형 Vite 앱이라고 브라우저에서 CSS를 생성해야 하는 것은 아닙니다. 버튼은 정적 스타일시트에 규칙이 이미 있는 두 class 사이를 전환할 수 있습니다. 중요한 구분은 인터페이스가 변하는지가 아니라 완전한 class 이름을 언제 사용할 수 있는지입니다.

소스에는 두 버튼 색상이 있고 빌드된 HTML에는 빈 마운트 지점이 있으며 브라우저 첫 렌더링에는 버튼 하나가 보이는 클라이언트 렌더링 앱을 생각해 보세요. 세 입력은 같은 앱을 나타내지만 Master CSS에 서로 다른 class 집합을 제공합니다.

이 페이지의 내용

#하나의 앱, 세 가지 입력

CSS 진입점이 로드된 기존 Vite 설정에서 시작하세요. 이 작은 바닐라 예제는 소스에 두 변형을 유지하고 JavaScript로 버튼을 만듭니다.

index.html
<div id="app"></div><script type="module" src="/src/main.js"></script>
src/main.js
import './style.css'const tones = { blue: 'bg-blue', neutral: 'bg-neutral' }const button = document.createElement('button')let active = falsefunction update() {  button.className = active ? tones.neutral : tones.blue  button.textContent = active ? 'Selected' : 'Select'}button.addEventListener('click', () => {  active = !active  update()})update()document.getElementById('app').append(button)

소스에는 bg-blue와 bg-neutral이 있습니다. HTML 파일에는 둘 다 없습니다. JavaScript가 아직 버튼을 만들지 않았기 때문입니다. 브라우저가 진입 모듈을 실행하면 연결된 버튼에 bg-blue가 생깁니다. 클릭하면 bg-neutral로 바뀝니다.

하나의 앱, 세 class 집합

같은 클라이언트 렌더링 앱에서 선택할 수 있는 생성 입력입니다. class 변경은 기존 정적 CSS를 재사용할 수 있으며 빈 HTML 마운트 지점은 초기 버튼 규칙을 제공하지 않습니다.

텍스트 설명
  1. 소스 → 정적 CSS. 버튼 소스에는 bg-blue와 bg-neutral이 모두 있습니다. 정적 모드는 상태 선택 전에 두 규칙을 생성합니다.
  2. 빌드 HTML → 사전 렌더링 CSS. 출력 HTML에는 빈 앱 마운트 지점만 있습니다. 버튼 class가 없으므로 pre-render 모드는 두 버튼 규칙 모두 생성하지 않습니다.
  3. 연결된 DOM → runtime CSS. 브라우저 첫 렌더링은 bg-blue 버튼을 연결합니다. runtime 모드가 해당 규칙을 생성하고 이후 bg-neutral로 전환하면 그 규칙도 생성합니다.

그림은 세 생성 전략의 입력을 비교합니다. 연속된 세 빌드 단계를 나타내거나 세 모드를 모두 실행하라고 권하는 것은 아닙니다.

#정적 CSS도 변하는 인터페이스를 지원할 수 있다

기본 masterCSS() 플러그인 설정에서는 스캐너가 src/main.js의 두 완전한 문자열을 찾습니다. 버튼에는 한 번에 하나의 class만 있어도 생성 스타일시트에는 두 규칙이 모두 포함됩니다. 클릭은 일치하는 기존 규칙을 바꿀 뿐 Master CSS에 CSS 생성을 요청하지 않습니다.

크기 선택, 상태 레이블, 탐색 선택처럼 유한한 상태에 적합합니다. 맵에 전체 class 문자열을 유지하세요. 대신 `bg-${tone}`을 구성하면 소스 근거가 사라집니다. 스캐너는 보간을 실행해 가능한 결과를 찾지 않기 때문입니다. 전체 class 작업 흐름과 명시적 소스 예외는 스캔과 가지치기에서 다룹니다.

CSS 사용 가능성과 앱 렌더링은 별개입니다. 이 예제에서 JavaScript를 끄면 정적 스타일시트는 존재하지만 버튼은 없습니다. 앱 코드가 버튼을 만들기 때문입니다. Master CSS 정적 모드는 클라이언트 렌더링 앱이 JavaScript 없이 동작한다고 보장하지 않습니다.

#빈 마운트 지점은 렌더링된 페이지가 아니다

Vite의 일반 프로덕션 빌드는 index.html을 기본 진입점으로 사용합니다. Master CSS pre-render 모드는 빌드가 출력한 HTML을 처리하며 앱 진입점을 실행해 마운트 지점을 버튼으로 바꾸지 않습니다.

masterCSS({ mode: 'pre-render' })에서 이 예제의 HTML에는 버튼 class가 없으므로 어느 색상에도 생성 규칙이 없습니다. 브라우저가 나중에 버튼을 만들 수는 있지만 pre-render 모드는 누락 규칙을 생성할 Master CSS 런타임을 제공하지 않습니다.

pre-render 모드는 빌드가 실제로 내용이 있는 HTML을 출력할 때 유용합니다. HTML에 이미 <button class="bg-blue">Select</button>이 있다면 Master CSS는 파란 class 규칙을 생성할 수 있습니다. neutral 변형이 클릭 후에만 나타나면 다른 CSS 소스가 여전히 필요합니다. 프레임워크가 HTML 생성을 담당하면 프레임워크 통합을 사용하세요.

#브라우저 생성은 연결된 class를 따른다

masterCSS({ mode: 'runtime' })에서는 런타임이 연결된 버튼을 관찰하고 파란 규칙을 생성합니다. 클릭으로 neutral class가 추가되면 해당 규칙도 생성합니다. 마지막 요소가 사용을 멈춘 후에도 규칙이 캐시에 남을 수 있습니다. 연결된 사용을 추적한다고 CSS가 즉시 제거되는 것은 아닙니다.

이 방식은 시각 편집기 입력처럼 브라우저에서 처음 존재하는 완전한 class 이름을 처리할 수 있습니다. 대신 생성 스타일은 런타임 시작에 의존합니다. 위의 유한 맵은 정적 모드만으로도 해당 의존성 없이 두 상태를 모두 지원합니다.

#점진적 렌더링이 유용한 경우

점진적 모드는 출력 HTML에서 생성한 CSS와 이후 class에 대한 브라우저 지원을 결합합니다. pre-render 모드와 같은 HTML 경계를 가집니다. 빈 마운트 지점은 초기 버튼 규칙을 제공하지 못합니다. 이 경우 앱 코드가 버튼을 만든 뒤에도 브라우저가 규칙을 생성해야 합니다.

HTML이 초기 인터페이스를 이미 담고 추가 class가 실제로 나중에 나타날 때 이 조합이 유용합니다. 초기 생성 CSS는 문서와 함께 도착하며 페이지 hydration manifest 덕분에 런타임은 엔진을 지연하면서 지원 class를 추적할 수 있습니다. manifest 밖의 class가 엔진을 시작합니다. 전체 모드 비교, hydration 동작, 실패 조건은 렌더링 모드 Guide에서 다룹니다.

이 메커니즘은 CSS를 사용할 수 있는 시점을 설명합니다. 페인트 시간 개선이나 전체 다운로드 감소를 입증하지는 않습니다. 이는 앱에 따라 달라지며 측정이 필요합니다.

#모드를 바꾸기 전에 입력 검증하기

예제를 프로덕션용으로 빌드한 뒤 출력 HTML과 실행 중인 DOM을 비교하세요. HTML에는 여전히 빈 마운트 지점이 있고 JavaScript 실행 후 DOM에는 버튼이 있어야 합니다. 정적 모드에서는 연결된 생성 스타일시트에 .bg-blue와 .bg-neutral이 모두 있는지 확인하고 버튼을 눌러 두 상태 모두 스타일이 적용되는지 확인하세요.

pre-render나 점진적 모드를 평가한다면 응답의 style#master-css에서 실제 앱 class와 규칙을 찾으세요. 브라우저 생성이 초기 누락을 숨길 수 있으므로 실행 중인 DOM만 보지 말고 응답 소스를 검사하세요. 개발 동작만으로 프로덕션 전달을 검증할 수는 없습니다.

소스에 보이는 class로 작업을 해결할 수 있다면 정적 모드를 유지하세요. 다른 입력은 소스가 제공하지 못하는 정보를 담고 있을 때 선택하고, 선택한 생명주기가 실제로 해당 정보를 제공하는지 검증하세요. 설치는 Vite Guide에, 렌더링 계약은 렌더링 모드에 있습니다.