Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

초기 렌더링시 다크 모드 깜빡임 에러 (dark mode flash error) 해결 #20

Merged
merged 6 commits into from
Feb 9, 2023

Conversation

kimyouknow
Copy link
Owner

@kimyouknow kimyouknow commented Feb 9, 2023

About

  1. 초기 렌더링시 다크 모드 깜빡임 에러 (dark mode flash error) 해결

Description

1. 초기 렌더링시 다크 모드 깜빡임 에러 (dark mode flash error) 해결

-.mov

원인

현재 적용 과정

  • local storage에 저장된 값이 없으면 os에 지정된 prefers-color-scheme에 따라 테마를 선택하기
  • 초기 테마를 정하면 body태그에 class를 추가해서 css-variable 적용

문제

  • body태그에 theme관련 태그(.dark)를 추가하기전 html이 렌더링되어 light모드로 렌더링됨
  • html이 렌더링 된 후 js로직이 동작해 dark모드로 바꿈

해결방법

이론

  • 컴파일 시 HTML을 생성할 때 모든 콘텐츠(페이지 자체) 앞에 <script> 태그를 삽입 (blocking HTML)
  • 해당 스크립트 태그에서 사용자의 색상 기본 설정이 무엇인지 알아보기
  • JavaScript를 사용하여 CSS 변수 업데이트

실제 적용

  • gatsby-srr.js에서 onRenderBodysetPreBodyComponents를 활용해서 body태그 전에 테마를 설정하는 script로직 삽입
  • codesandbox예제
// gatsby-srr.js

const setInitThemeMode = () => {
  // 초기 테마 설정 로직 : src/utils/themeMode.ts와 같은 로직
}

const setInitThemeModeScript = functionToScript(setInitThemeMode)
const codeRunOnClient = `(${setInitThemeModeScript})()`

const MagicScriptTag = () => {
  return <script dangerouslySetInnerHTML={{ __html: codeRunOnClient }} />
}

export const onRenderBody = ({ setPreBodyComponents }) => {
  setPreBodyComponents(<MagicScriptTag key="setInitThemeMode-script" />)
}

그냥함수

Result

-.mov

Ref

@kimyouknow kimyouknow added the enhancement New feature or request label Feb 9, 2023
@kimyouknow kimyouknow self-assigned this Feb 9, 2023
@kimyouknow kimyouknow merged commit 7f73709 into main Feb 9, 2023
@kimyouknow kimyouknow deleted the fix/dark-mode branch February 9, 2023 10:34
@kimyouknow kimyouknow added the bug Something isn't working label Feb 9, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant