이미지가 보이기까지의 시간 동안 빈페이지가 어색하게 보이기 때문에 적용한 블러 플레이스 홀더입니다.
plaiceholder와 Sanity image metadata 둘 중 고민을 하다가 쿼리할 때 base64데이터를 바로 받을 수 있는 Sanity metadata가 더 적합하다고 생각해 이것으로 구현했습니다.
더 상세한 선택 과정을 작성했습니다.
문제상황
Nextjs의 blurDataURL예시에 있는 plaiceholder를 사용하려면, Sanity에 포스트를 요청한 후 plaiceholder에 요청을 다시 보내 base64를 받아와 합쳐줘야했습니다. 블러를 다양한 곳에서 사용할텐데 포스트를 요청할 때 마다 위의 과정을 반복해야한다는 것이 복잡하게 느껴졌습니다.
더 개선할 수 있을 것이라 생각해 다른 방식으로 블러이미지를 구현할 수 있을지 리서치를 했습니다.
과정
처음에는 Sanity Studio에서 “생성할 때” 데이터를 가공해서 저장하는 방법이 있지 않을까 하고 그 방법을 찼아봤습니다.
두번째는 Sanity의 필드 타입이 image인데 타입이 따로 지정된 거라면 관련 기능이나 데이터가 더 많지 않을까하는 생각도 들어서 이미지에 어떤 것들을 제공하는지 찾아봤습니다.
해결
Santiy image를 보니 placeholder 파트에 제가 원하는 블러 관련한 두가지 옵션인 blurhash와 lqip이 있었습니다. base64로 인코딩되어 바로 사용가능한 lqip을 사용해 블러 이미지를 구현했습니다.
블러이미지의 크기가 큰 화면에서 작게 보이는 현상이 있었습니다. 블러 크기는 이미지의 가로세로 길이에 따라 결정에 되는데 fill 옵션이 있는 반응형 이미지에서 해당 문제가 발생했습니다. 이미지에도 가로세로 속성을 주어 해결했습니다.