Rocketman
Frontend Developer at Stunning, developing LOUD and NOTEFOLIO
낙서장
블로그 개발하면서 겪는 일 & 해결법 일단 모조리 넣는곳...
color 색
- 블로그에서 사용할 메인 컬러 선택
- 색 설정 기준은 내마음.
light / dark 테마
theme
을toggle
할 때 마다cookie
값을 변경해줌.- 사용자가 서버에 접속 했을 때
cookie
를 확인하고layout
에서body
의class
명을light
/dark
로 지정localStorage
를 사용하지 않고cookie
로 저장하는 이유
- 만약
theme
쿠키가 설정되어있지 않다면 사용자 컴퓨터의 기본 설정을 따라감media query
의prefer-color-theme
를 이용theme
을 한번이라도toggle
하면cookie
값 저장되므로media query
의prefer-color-theme
은 사용안함
스타일링
전통적인
방법의 스타일링을 해본적이 없음. 따라서 이번에 해보기로함- 회사에서 사용하는
css-in-js
만 다룸... - 기왕 css 파일 사용하는거
scss
도 도입 결정
- 회사에서 사용하는
module css이 내 생각과는 다르게 동작
아직 부정확한 정보. 정확히 어떤 경우에
css-module
이 정상 동작하고 / 안하는지 분석이 필요함.
- page 같은 server-side 컴포넌트들은 csr 로 이동할 때 css module 가 정상동작하지 않음
- 확인해보니 js 파일을 전부 받고, 가장 마지막에 css 파일을 불러옴.
- 때문에 css flickering 현상이 발생함.
- 하지만 csr-components 들은 css module 을 사용할 수 있음(정확하지 않음.)
mdx를 이용한 블로그 만들기
- 인터넷 글 보면 모조리 tailwind 를 사용해서
mdx
의 기본 컴포넌트들의 스타일링을 진행해주고있었다. - 이왕
css
와color
조합을 처음부터 하는김에mdx
의 기본 컴포넌트들의 스타일링도 직접해주기로함.- 우선 mdx-components 의 컴포넌트 리스트들을 따라서 하나하나 스타일링 진행.
code
/pre
과 같은code syntax
가 필요한 부분은highlight.js
의 도움을 받음.- 스타일링 된 컴포넌트들은 여기 에서 확인 가능
- 추후에는 브라우저에서 실시간으로 mdx 파일 작성하고 저장하는게 만들 예정
버튼 컴퍼넌트 멋지게 만들기
- 3d 버튼을 만들어봄
카드 컴포넌트에 link 를 어디에 넣어야할까?
여러 선택지가있었다. card 를 link 로 감싸기, 또는 카드 내부의 타이틀 등에 link 를 달기
js/** card 전체를 Link 로 감싸기 */ function Card() { return ( <article> <Link>{children}</Link> </article> ) } // vs function Card() { return ( <article> <h3> <Link href="post" /> </h3> <Link href="profile"> <Avatar /> </Link> </article> ) }
js/** card 전체를 Link 로 감싸기 */ function Card() { return ( <article> <Link>{children}</Link> </article> ) } // vs function Card() { return ( <article> <h3> <Link href="post" /> </h3> <Link href="profile"> <Avatar /> </Link> </article> ) }
1. Card 전체를 Link 로 감싸기
card 전체를 link 로 감싸게 되면 편하지만, 카드를 미세하게 컨트롤하는게 불가능해진다. 예를 들면 Card 내부에 카드가 가리키는 포스트가 아닌 author 의 프로필 페이지로 가능 링크가 있는 경우다. 이때는 anchor 태그 안에 anchor 태그가 있기 때문에 html 의 기본 규칙에 어긋나고, 참고: html spec
2. Card 내부 요소요소 마다 Link 가 필요하면 해당 요소에만 달아주기
여기로 오면 더 심각한 문제가 생겨버린다. 카드 전체가 clickable 한 요소가 되어야만하는데 내부 요소에다가 Link
를 알아주면 기본적으로 해당 Card 는 클릭커블하지 않기때문에
개발자가 직접 해당 카드에 onClick
, css hover & active
등의 요소를 달아주어야만한다.....
js/* javascript */ function handleOnCardClick() { ... } function Card() { return ( <article onClick={handleOnCardClick}> <h3> <Link href="post" /> </h3> <Link href="profile"> <Avatar /> </Link> </article> ) }
js/* javascript */ function handleOnCardClick() { ... } function Card() { return ( <article onClick={handleOnCardClick}> <h3> <Link href="post" /> </h3> <Link href="profile"> <Avatar /> </Link> </article> ) }
css/* css */ > article { &:hover { pointer: cursor...; } }
css/* css */ > article { &:hover { pointer: cursor...; } }
tab 으로 탐색 가능한 사이트 만들기
누군가에게는 tab 으로 페이지를 탐색한다는게 어색할수도있다. 하지만 누군가는 좋은 사이트라면 키보드만을 사용해도 자연스러운 사용성을 제공해야 좋은 사이트라고 생각하는 사람이 있다. 나같은 경우는 후자다. 특히 이 블로그는 복잡한 동작이 없고 단순 콘텐츠만 제공하는정말 Hypertext Markup Language 의 의미에 부합하는 사이트이기 때문에 각 hypertext 와 linkable 만 신경써주면 아주 간단하게 키보드만으로 탐색을 가능하게 해주는 사이트가 될 수 있다.
tab 으로 element가 선택되면 해당 element 는 자동으로 outline
이 생긴다. 이는 tab
선택을 하면 해당 element 는 focus 수도 클래스를 갖게 되고 css 는 기본으로 focus 된
요소에 outline
을 주기 때문이다. 기본 outline 은 이쁘지 않기 때문에 focus에 대한
수도 클래스의 기본 스타일링을 해준다. > 모든 요소가 tabable 한건 아니다. 여기서
tabable 한 요소를 확인할 수 있다.
custom mdx component 제작
#
가 앞에 붙으면 mdx 는 이를 자동으로 h1 태그로 변환해준다. 생각없이 h1 태그에 대한 스타일링만 해주고 끝내면 사용성에 불편을 초래한다.
MDN, 각종 web spec 사이트를 보면 제목이 clickable 한걸 볼 수 있다. 그리고 클릭하면 url에 # 이 붙으는걸 볼 수있다.
그리고 이 url 을 복사하고 다른 탭에서 열어보면 짜잔~ 해당 tag 로 이동한채 열리는걸 볼 수 있는데 이는 anchor tag 의 id attribute 가 가지는 기능이다.
해당 기능에 대한 규칙은 HTML specification a link 에서 볼 수 있다.
Header + Anchor
Markdown 의 문서의 h 태그들에 대해서도 이렇게 anchor 기능을 제공하면 사용자 experiance 를 높여 줄수있게된다. (anchor 태그를 사용하면 tab-able 해지기 때문에 keyboard 사용성도 자연스럽게 좋아진다.)
talbe of contents 구현
MDN 의 toc 를 보고..
- h1 은 메인 제목에만 사용.
- 나머지 섹션의 제목은 h2 로 사용
따라서 toc 메인리스트로는 h2 가 오고 h3 가 탭 처리 되서 나오도록
contentlayer로 headings 저장 intersection observer 사용해서
view count
vercel 의 kv storage를 사용해보자
우선 특별한 로직 없이 해당 페이지에 들어가면 client-side 에서 redis 에 incr 을 일으킴
next-mdx-remote 에서 contentlayer 로 완전 이동
댓글 기능
댓글
todo
- theme
- 블로그 색 palette 에 맞게 수정
- 컴포넌트 직접 구현(현재는 @giscus/react 사용)
sitemap
- mdx 의 파일 경로 + 홈 주소를 넣어줌
- google search console 에 추가