hexo+icarus 다크모드 깜빡임 해결
예전에 메모해놓고 이제 게시글로 적는다!
기본 배경 색 없애기
먼저 css레벨에서 적용되는 css를 초기화해야한다.
브라우저는 기본적으로 css가 없을 시 페이지 이동할 때 이전 페이지의 배경색을 그대로 유지한다.
\theme\icarus\css\include\style\base.styl
7줄 기본 배경색 none으로 수정하기
1 | $body-background-color ?= none; |
기존 js파일을 두 개로 나누기
로컬스토리지를 읽고 다크모드를 적용하는 함수와 html을 전부 로드한 후 버튼의 innerText를 수정하는 함수로 나누었다.
다크모드를 적용하는 함수는 render blocking이 이루어져야하고 버튼의 innerText의 수정은 HTML이 모두 로드 후 이루어져야하기 때문이다.
따라서 버튼을 수정하는 함수는 defer로 불러오고 다크모드를 확인하고 적용하는 함수는 속성 없는 script태그로 불러온다.
\themes\icarus\source\js\darkmode.js
1 | function init() { |
hexo\themes\icarus\source\js\darkmodebutton.js
1 | const darkModeButton = document.querySelector("#changeModeButton"); |
\themes\icarus\layout\common\scripts.jsx
56번쨰 줄에 darkmodebutton.js추가
1 | <script src={url_for("/js/main.js")} defer></script> |
hexo\themes\icarus\layout\common\head.jsx
js를 로드하고 실행하는 동안 렌더링을 막아야하기 때문에 script에 속성을 지정하지 않아야한다.
적다보니 preload속성을 추가해도 좋을 것 같다.
1 | <script src={url_for("/js/darkmode.js")}></script> |
고의로 render blocking 만들기
새로고침이 되어서 다크모드가 적용되기 전 까지 렌더링이 이루어지면 안된다.
body의 최상단에 darkmode.js에서 정의한 init함수를 호출해준다.
hexo\themes\icarus\layout\layout.jsx
1 | <html lang={language ? language.substr(0, 2) : ""}> |