InitColorSchemeScript

InitColorSchemeScript

InitColorSchemeScript 컴포넌트는 서버 사이드 렌더링 애플리케이션에서 다크 모드 깜빡임(flickering)을 제거해요.

출처: 문서

본문

소개 (Introduction)

InitColorSchemeScript 컴포넌트는 서버 사이드 렌더링(SSR) 애플리케이션에서 발생할 수 있는 다크 모드 깜빡임을 제거하는 데 사용돼요. 이 스크립트는 React보다 먼저 실행되어 사용자 선호도에 기반한 속성을 부착해, 첫 렌더링에서 올바른 컬러 모드가 적용되도록 해요.

최상의 사용자 경험을 위해, 라이트와 다크 모드를 모두 지원하는 서버 렌더링 Material UI 앱이라면 이 컴포넌트를 구현해야 해요.

기본 (Basics)

먼저 테마에서 colorSchemeSelector: 'data'로 CSS 변수를 활성화해요.

import { ThemeProvider, createTheme } from '@mui/material/styles';

const theme = createTheme({
  cssVariables: {
    colorSchemeSelector: 'data',
  },
});

function App() {
  return <ThemeProvider theme={theme}>{/* Your app */}</ThemeProvider>;
}

그런 다음, InitColorSchemeScript 컴포넌트를 <body> 태그의 첫 번째 자식으로 렌더링해요.

아래 섹션들은 Next.js로 작업할 때 InitColorSchemeScript 컴포넌트를 어디에 렌더링해야 하는지 자세히 설명해요.

Next.js App Router

루트 layout 파일에 InitColorSchemeScript 컴포넌트를 배치해요:

import InitColorSchemeScript from '@mui/material/InitColorSchemeScript';

export default function RootLayout(props: { children: React.ReactNode }) {
  return (
    <html lang="en" suppressHydrationWarning>
      <body>
        <InitColorSchemeScript attribute="data" />
        {props.children}
      </body>
    </html>
  );
}

Next.js Pages Router

커스텀 _document 파일에 InitColorSchemeScript 컴포넌트를 배치해요:

import { Html, Head, Main, NextScript } from 'next/document';
import InitColorSchemeScript from '@mui/material/InitColorSchemeScript';

export default function MyDocument(props) {
  return (
    <Html lang="en">
      <Head>{/* tags */}</Head>
      <body>
        <InitColorSchemeScript attribute="data" />
        <Main />
        <NextScript />
      </body>
    </Html>
  );
}

커스터마이즈 (Customization)

클래스 속성 (Class attribute)

DOM 요소에 클래스를 부착하려면 attribute prop을 "class"로 설정해요.

<InitColorSchemeScript attribute="class" />

이것은 사용자의 시스템 선호도에 따라 컬러 스킴 노드(기본값은 <html>)에 클래스 이름을 설정해요.

<html class="dark"></html>

임의의 속성 (Arbitrary attribute)

DOM 요소에 임의의 속성을 부착하려면 attribute prop에서 %s를 플레이스홀더로 사용해요.

<InitColorSchemeScript attribute="[data-theme='%s']" /> // <html data-theme="dark">
<InitColorSchemeScript attribute=".mode-%s" /> // <html class="mode-dark">

기본 모드 (Default mode)

defaultMode prop을 설정해서 사용자가 페이지를 처음 방문할 때의 기본 모드를 지정해요.

예를 들어 사용자가 첫 방문에서 다크 모드를 보게 하려면 defaultMode prop을 "dark"로 설정해요.

<InitColorSchemeScript defaultMode="dark" />

주의사항 (Caveats)

속성 (Attribute)

attribute prop을 커스터마이즈할 때는 테마의 colorSchemeSelector도 사용 중인 속성에 맞게 설정해야 해요.

const theme = createTheme({
  cssVariables: {
    colorSchemeSelector: 'same value as the `attribute` prop',
  },
});

기본 모드 (Default mode)

defaultMode prop을 커스터마이즈할 때는 ThemeProvider 컴포넌트에서도 동일하게 설정해야 해요:

<ThemeProvider theme={theme} defaultMode="dark">

InitColorSchemeScript API

데모 (Demos)

이 React 컴포넌트의 사용에 관한 예제와 자세한 내용은 컴포넌트 데모 페이지를 방문하세요:

Import

import InitColorSchemeScript from '@mui/material/InitColorSchemeScript';
// or
import { InitColorSchemeScript } from '@mui/material';

Props

Name Type Default Required Description
attribute string 'data-mui-color-scheme' No
colorSchemeNode string 'document.documentElement' No
colorSchemeStorageKey string 'mui-color-scheme' No
defaultDarkColorScheme string 'dark' No
defaultLightColorScheme string 'light' No
defaultMode 'dark' | 'light' | 'system' 'system' No
modeStorageKey string 'mui-mode' No
nonce string - No

Note: ref는 루트 요소로 전달돼요.

제공된 다른 모든 props는 루트 요소(네이티브 요소)로 전달돼요.

소스 코드 (Source code)

이 페이지에서 정보를 찾지 못했다면, 더 자세한 내용을 위해 컴포넌트 구현을 살펴보세요.

더 알아보기 (Learn more)