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

Refactor/이미지 및 무한스크롤 관련 개선 작업 #6

Merged

Conversation

steveflevc
Copy link
Collaborator

🔎 작업 내용

  • 영화 아이템 스타일 크기 비율 고정으로 변경
  • IntersectionObserver 를 사용하기 위한 커스텀 훅 useInView 생성
  • 이미지 지연 로드를 위한 LazyImage 컴포넌트 생성

🚨이슈 사항

  • IntersectionObserver를 지원하지 않는 브라우저 대응 방법 필요. 커밋

🍉 작업 영상

2024-12-31.4.36.40-1.mov

Copy link

@steveflevc steveflevc merged commit 9c94716 into main Dec 31, 2024
2 checks passed
* 타켓요소가 존재 x, IntersectionObserver 가 지원하지 않는 브라우저일경우
* TODO: IntersectionObserver 가 지원하지 않는 브라우저이면 대응 방안 적용
* */
if (!targetRef.current || typeof IntersectionObserver === 'undefined') {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IntersectionObserver polyfill을 추가해서 적용하시면 됩니다. (링크)

};

return (
<div className={`w-full h-full ${className}`}>

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

next/image처럼 뷰포트에 표시됐을때 이미지를 로드해오도록 하고싶다면 next/image의 기능을 더 인터페이스를 더 사용해도 괜찮겠죠

예를들면 next/image는 widht, height를 받도록 해서 Layout Shift를 방지하는걸 만드는데 여기도 그렇게 하면 좋겠죠.

preload도 한 번 구현해보면 좋겠죠

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

preload를 그냥 사용하면 lazy load가 하는 의미가 없으니까 intersection observer를 이용해서 뷰포트에 표시되기전에 rootMargin 등을 활용해서 스크롤에 따라 미리 불러올 수 있도록 하면 되겠죠

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

js로 preload 기능을 만들고 실패했을 때 retry를 하는걸 만들어보면 좋겠죠

retry count는 기본값은 3으로 하되 개발자가 옵션으로 선택할 수 있게 만들어보면 좋을 것 같습니다.

};
const handleImageError = () => {
setIsError(true);
};

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 컴포넌트에서도 에러가 발생했을 때 바로 error를 처리하기보다 retry기능을 만들어보면 좋을 것 같아요

return (
<div className={`w-full h-full ${className}`}>
{!isImageLoad && !isError && <div className="w-full h-full bg-gray-300 animate-pulse" />}
{isError && <div className="w-full h-full bg-gray-300 flex items-center justify-center text-gray-500">Error</div>}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

에러가 발생하면 단순하게 error를 보여주기보다 placeholder 이미지를 보여주면 더 좋겠죠?

그리고 reload하는 버튼을 넣어서 재요청을 할 수 있도록 만드는 것도 좋을 것 같아요

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants