Feature Flags

SEED Design을 Lynx에서 사용할 때 권장하는 피쳐 플래그 설정을 안내합니다.

Lynx는 다양한 피쳐 플래그를 통해 CSS 엔진, 텍스트 렌더링, 레이아웃, 이벤트 처리 등의 동작을 제어합니다. SEED Design을 Lynx에서 사용할 때는 웹과의 동작 일관성을 위해 아래 플래그들을 활성화하는 것을 권장합니다.

플러그인 구조

Lynx의 피쳐 플래그는 두 개의 rsbuild 플러그인을 통해 설정합니다.

플러그인패키지역할
pluginReactLynx@lynx-js/react-rsbuild-pluginReact 빌드 변환 (JSX, tree-shaking 등). CSS 셀렉터, 무효화 등 일부 플래그가 기본 활성화
pluginLynxConfig@lynx-js/config-rsbuild-pluginLynx 런타임/컴파일러 설정. 모든 피쳐 플래그를 설정 가능

pluginLynxConfig에 설정한 값은 pluginReactLynx가 자동으로 읽어가므로, pluginLynxConfig 한 곳에서 모든 플래그를 관리하면 됩니다.


기본 활성화 플래그

pluginReactLynx를 사용하면 아래 플래그들이 기본적으로 켜져 있습니다. 별도 설정 없이도 이미 활성화되어 있지만, 명시적으로 pluginLynxConfig에도 넣어두는 것을 권장합니다.

enableCSSSelector

Lynx CSS를 기존 pseudo_map 기반 매칭이 아니라 LynxCSSSelector / RuleSet 기반의 새 selector 파이프라인으로 파싱하고 매칭합니다. 이 플래그는 CSS selector 엔진 경로를 켜는 옵션이지, Web에서 쓰는 모든 selector를 동일하게 지원한다는 의미는 아닙니다.

설명
끄면CSS rule을 레거시 selector string / pseudo_map 중심으로 처리합니다. 복합 selector, combinator, cascade specificity 처리 범위가 제한적입니다
켜면CSS rule을 LynxCSSSelector tuple로 인코딩하고 RuleSet에서 type, class, id, combinator, 일부 pseudo-class(:active, :focus, :hover, :root, :not())를 매칭합니다
주의현재 styling 경로에서 [data-*], [attr=value], [attr*=value] 같은 attribute selector는 public release surface로 보지 않습니다
SEED Design 이점theme/platform class, component className, descendant/child selector, :root 토큰 선언처럼 class 기반 CSS를 안정적으로 적용할 수 있습니다

enableCSSSelector가 켜져 있어도 Web처럼 data-* attribute selector로 컴포넌트 상태 스타일을 표현하지 마세요. Lynx implementation에는 attribute selector parser/indexing 흔적이 있지만, 현재 CSS styling matcher는 attribute selector를 실제 매칭 대상으로 처리하지 않습니다. SEED Lynx 컴포넌트는 pressed, checked, disabled, loading 같은 상태를 recipe boolean variant로 className에 반영합니다.

enableCSSInvalidation

RuleInvalidationSet을 사용한 선택적 스타일 재계산을 활성화합니다.

설명
끄면class, id, pseudo-state가 변경될 때마다 전체 스타일을 재계산합니다. 컴포넌트가 많아질수록 성능 저하가 심해집니다
켜면변경된 셀렉터에 영향받는 요소만 재계산합니다. 현재 구현은 class/id/pseudo-class별 invalidation 맵을 중심으로 관리합니다
SEED Design 이점버튼 hover, checkbox 체크 등 상태 변경 시 해당 컴포넌트만 스타일을 업데이트합니다

enableCSSSelectorenableCSSInvalidation은 항상 함께 활성화하세요. 셀렉터 없이 무효화만 켜면 의미가 없고, 무효화 없이 셀렉터만 켜면 성능 문제가 발생할 수 있습니다.


추가 필수 설정

pluginLynxConfig에서 추가로 활성화해야 하는 플래그들입니다.

CSS

enableCSSStrictMode

CSS 값 파싱을 웹 표준과 동일하게 엄격하게 적용합니다.

설명
끄면잘못된 CSS 값(예: 단위 없는 길이값)도 관대하게 파싱합니다. 웹과 다르게 동작할 수 있습니다
켜면유효하지 않은 <length> 값을 드롭합니다. width: 100처럼 단위가 빠진 값은 무시됩니다
SEED Design 이점SEED Design의 CSS가 웹과 Lynx에서 동일하게 파싱됩니다. 플랫폼 간 스타일 불일치를 방지합니다

enableCSSStrictMode를 활성화하면 일부 CSS 속성이 Lynx에서 올바르게 파싱되지 않는 호환성 문제가 있습니다. 현재는 비활성화(false)를 권장합니다.

enableCSSInheritance

CSS 속성 상속을 활성화합니다.

설명
끄면color, font-size, font-family 등이 자식 요소에 상속되지 않습니다. 모든 요소에 직접 스타일을 지정해야 합니다
켜면웹과 동일하게 상속 가능한 CSS 속성이 자식 요소에 전파됩니다
SEED Design 이점디자인 토큰(색상, 타이포그래피)이 컴포넌트 트리를 따라 자연스럽게 전파됩니다. 테마 설정이 하위 컴포넌트에 자동 적용됩니다

customCSSInheritanceList 옵션으로 상속 가능한 CSS 속성 목록을 커스터마이징할 수 있습니다.

enableCSSInlineVariables

JS에서 설정한 CSS 변수를 인라인 스타일처럼 처리합니다.

설명
끄면CSS 변수는 스타일시트에서만 정의 가능합니다
켜면JS에서 동적으로 CSS 변수를 설정하고 변경할 수 있습니다. 변수 업데이트가 bulk 처리되어 성능이 최적화됩니다
SEED Design 이점런타임에 디자인 토큰을 오버라이드할 수 있습니다. 다크모드 전환, 브랜드 커스터마이징 등 동적 테마 변경에 필요합니다

텍스트 & 레이아웃

enableTextRefactor

텍스트 렌더링을 웹 표준에 맞게 개선합니다.

설명
끄면Lynx 고유의 레거시 텍스트 렌더링을 사용합니다. 웹과 미묘한 차이가 발생할 수 있습니다
켜면텍스트 렌더링이 웹 브라우저와 더 일관되게 동작합니다. 폰트 스케일 처리가 명시적으로 적용됩니다
SEED Design 이점SEED Design의 타이포그래피 스케일(t1~t10)이 웹과 Lynx에서 동일하게 렌더링됩니다

fontScaleEffectiveOnlyOnSp

시스템 폰트 크기 설정의 영향 범위를 sp 단위로 제한합니다.

설명
끄면시스템 폰트 크기 변경이 모든 단위(px, em 포함)에 적용됩니다. 아이콘 크기, 여백 등이 의도치 않게 변경될 수 있습니다
켜면폰트 스케일이 sp 단위에만 적용됩니다. px로 지정된 레이아웃 값은 영향받지 않습니다
SEED Design 이점SEED Design은 Dynamic 타이포그래피 토큰(t1t10)을 sp 단위로, Static 토큰(t1-statict10-static)을 px 단위로 제공합니다. 이 플래그가 켜지면 Dynamic 텍스트만 시스템 폰트 크기에 반응하고, Static 텍스트와 레이아웃은 고정됩니다

enableFixedNew

position: fixed 요소의 처리를 개선합니다.

설명
끄면fixed 요소가 페이지 루트에 즉시 재삽입됩니다. 부모가 없어도 강제로 변환을 시도하여 불안정합니다
켜면fixed 요소가 논리적 부모를 기준으로 안정적으로 레이아웃 트리에 연결됩니다
SEED Design 이점Modal, BottomSheet, Toast, Snackbar 등 오버레이 컴포넌트가 안정적으로 동작합니다

enableFlexBasisZeroPercent

flex 축약 속성에서 생략된 flex-basis0%로 처리합니다 (웹 브라우저 동작과 동일).

설명
끄면flex: 1에서 flex-basis가 0 (숫자)으로 설정됩니다. 웹과 레이아웃 결과가 다를 수 있습니다
켜면flex: 1에서 flex-basis가 0% (퍼센트)로 설정됩니다. 웹 브라우저와 동일한 동작입니다
SEED Design 이점Flex 레이아웃을 사용하는 컴포넌트(ActionButton group, Tabs 등)가 웹과 동일하게 배치됩니다

상황별 설정

모든 프로젝트에 필수는 아니지만, 특정 기능을 사용할 때 활성화하면 좋은 플래그들입니다. 모두 pluginLynxConfig에서 설정합니다.

이벤트 & 제스처

enableNewGesture

Gesture Handler API를 활성화합니다.

설명
끄면레거시 터치 이벤트 시스템만 사용 가능합니다
켜면Pan, Fling, Tap, Long Press, Rotation, Pinch 등의 제스처를 감지하고, 제스처 간 관계(simultaneous, waitFor, continueWith)를 설정할 수 있습니다
언제 켜나요스와이프로 삭제, 드래그 앤 드롭, 핀치 줌 등의 인터랙션이 있는 화면에서 사용합니다

enableEventHandleRefactor

이벤트 처리 로직을 리팩토링하여 동적 이벤트 리스너 등록을 지원합니다.

설명
끄면정적 이벤트 바인딩만 지원합니다. 런타임에 리스너를 추가/제거할 수 없습니다
켜면동적 이벤트 리스너 등록/제거, 이벤트 인터셉션 등을 지원합니다
언제 켜나요조건부 이벤트 핸들링이나 이벤트 위임 패턴을 사용할 때 활성화합니다

enablePlatformGesture

네이티브 플랫폼과 Lynx 간의 제스처 충돌을 해결합니다.

설명
끄면Lynx 제스처와 네이티브 제스처가 충돌할 수 있습니다
켜면Shadow gesture를 통해 네이티브/Lynx 제스처 충돌을 관리합니다
언제 켜나요Lynx 뷰가 네이티브 스크롤 컨테이너 안에 있거나, 네이티브 제스처와 경합하는 경우에 사용합니다. enableNewGesture와 함께 사용하세요

enableTransformedTouchPosition

transform이 적용된 요소에서 터치 좌표를 올바르게 계산합니다.

설명
끄면transform된 요소의 터치 좌표가 변환을 고려하지 않습니다. 회전/스케일된 요소를 탭하면 잘못된 위치가 감지됩니다
켜면터치 좌표가 transform 변환을 반영하여 정확하게 계산됩니다
언제 켜나요transform: rotate(), scale() 등이 적용된 인터랙티브 요소가 있을 때 활성화합니다

관찰 & 렌더링

enableNewIntersectionObserver

IntersectionObserver가 스크롤 이벤트 없이도 독립적으로 동작합니다.

설명
끄면IntersectionObserver가 스크롤 이벤트에 바인딩되어, 스크롤이 발생할 때만 교차를 감지합니다
켜면레이아웃 업데이트, 화면 새로고침 등 다양한 트리거로 교차를 감지합니다
언제 켜나요Lazy loading, 가시성 기반 애니메이션, 무한 스크롤 등에서 사용합니다

enableVsyncAlignedFlush

VSync 신호에 맞춰 UI 업데이트를 동기화합니다.

설명
끄면UI 업데이트가 즉시 처리됩니다. JS 업데이트가 빈번하면 프레임 드롭이 발생할 수 있습니다
켜면UI 작업이 VSync 타이밍에 맞춰 배치 처리되어 점진적 렌더링 효과를 제공합니다
언제 켜나요애니메이션이 많거나 JS 기반 UI 업데이트가 빈번한 화면에서 활성화합니다

unifyVWVHBehavior

vw/vh 단위가 뷰포트 변경에 따라 동적으로 재계산됩니다.

설명
끄면vw/vh가 초기 뷰포트 크기 기준으로 고정됩니다
켜면뷰포트 크기가 변경되면(화면 회전 등) vw/vh 값이 자동으로 재계산됩니다
언제 켜나요화면 회전을 지원하거나 반응형 레이아웃이 필요한 경우에 사용합니다

성능 최적화

enableCSSLazyImport

CSS import 규칙을 지연 디코딩합니다.

설명
끄면모든 CSS import가 즉시 파싱됩니다
켜면CSS 스코프가 처음 적용될 때만 해당 import를 파싱합니다. 초기 로드 성능이 향상됩니다
언제 켜나요CSS 파일이 많고 초기 로드 성능이 중요한 경우에 사용합니다

enableTextLayoutCache

텍스트 레이아웃 결과를 캐시하여 재사용합니다.

설명
끄면동일한 텍스트도 매번 레이아웃을 재계산합니다
켜면이전에 계산한 텍스트 레이아웃을 캐시에서 가져옵니다
언제 켜나요텍스트가 많은 리스트나 반복 렌더링이 빈번한 화면에서 사용합니다

enableCSSClassMerge

중복되는 CSS 클래스를 빌드 시점에 병합합니다.

설명
끄면CSS 클래스가 원본 그대로 유지됩니다
켜면겹치는 CSS 클래스를 병합하여 번들 크기를 줄입니다
언제 켜나요CSS 번들 크기 최적화가 필요한 경우에 사용합니다

enableSimpleStyling

간소화된 스타일링 모듈을 사용합니다.

설명
끄면기본 CSS 파싱/적용 파이프라인을 사용합니다
켜면StyleObject 기반의 간소화된 스타일 적용 방식으로 렌더링 성능이 향상됩니다
언제 켜나요스타일 적용 성능이 병목인 경우에 사용합니다. enablePropertyBasedSimpleStyle과 함께 사용하면 더 유연합니다

전체 권장 설정

lynx.config.ts
import { defineConfig } from "@lynx-js/rspeedy";
import { pluginReactLynx } from "@lynx-js/react-rsbuild-plugin";
import { pluginLynxConfig } from "@lynx-js/config-rsbuild-plugin";

export default defineConfig({
  plugins: [
    pluginReactLynx(),
    pluginLynxConfig({
      // 기본 활성화이지만 명시적으로 설정
      enableCSSSelector: true,
      enableCSSInvalidation: true,

      // CSS
      enableCSSInheritance: true,
      enableCSSInlineVariables: true,
      // enableCSSStrictMode: false (CSS 속성 호환성 이슈로 비활성화 권장)

      // 텍스트 & 레이아웃
      enableTextRefactor: true,
      fontScaleEffectiveOnlyOnSp: true,
      enableFixedNew: true,
      enableFlexBasisZeroPercent: true,

      // 이벤트 (필요 시)
      // enableNewGesture: true,
      // enableEventHandleRefactor: true,
      // enablePlatformGesture: true,
      // enableTransformedTouchPosition: true,

      // 관찰 & 렌더링 (필요 시)
      // enableNewIntersectionObserver: true,
      // enableVsyncAlignedFlush: true,
      // unifyVWVHBehavior: true,

      // 성능 (필요 시)
      // enableCSSLazyImport: true,
      // enableTextLayoutCache: true,
    }),
  ],
});

각 플래그의 공식 설명은 Lynx 공식 문서를 참고하세요.

Last updated on

On this page