프론트엔드 개발자 , PHM입니다. 저를 기록합니다.
브라우저는 최적의 사용자 UX 위해, 상세 페이지에서 '뒤로 가기'를 했을 때 이전 스크롤 위치를 자동으로 복원하는 기능을 갖추고 있다. 덕분에 사용자는 리스트의 탐색 흐름을 끊김 없이 이어갈 수 있으며, 이를 기술적으로 지원하기 위해 history.scrollRestoration API를 지원한다.페이지 간 경계가 명확한 SSR환경이면 모르겠지만 SPA은 구조적으로 브라우저가 스크롤을 복구하려는 시점과 리액트가 화면을 그리는 시점이 어긋나서 race Condition이 발생하는지 스크롤이 엉뚱한 곳으로 튀는 현상이 있다. 때문에 SPA 환경에서는 스크롤 복구 로직을 따로 구하는 경우가 많다.내가 쓰는 스크롤 복구 방법우선 브라우저의 복구 Api를 안쓰겠다고 설정해준다. 복구 값은 auto가 기본 값이기 때문에 manual로 수동으로 변경하겠다고 설정해둔다. if ("scrollRestoration" in window.history) { window.history.s
React는 Virual DOM을 이용한 최적화 방식의 랜더링을 지원하는 프레임워크이다. Fiber의 핵심은 조각내어 실행하게 되어 동시성 랜더링 ( Concurrent Rendering )을 이용하여 Suspense 컴포넌트 바운더리로 활용 되거나 브라우저 랜더링 최적화를 하면서 우선순위 랜더링의 기준을 정하여 더 좋은 사용자 경험을 가능하게 하는 핵심 패러다임이다.이 번 글은 Fiber의 핵심 기능인 Automatic Batching, Concurrent Rendering에 대해 정리해보고자 한다.test….# React Fiber16버전 이전에는 Fiber가 아닌 Stack 개념으로 처리 되었다. Stack은 작업이 실행 된다면 도 중에 멈출 수 가 없다. 만약에 핸들러를 통해 상태가 변경되거나 하여 매우 무거운 작업을 진행한다고 가정해보자. 만약 작업 중이지만 사용자는 onclick 같은 사용자 입력을 했다고 가정한다면 이전의 작업을 처리 중이기 때문에 무 응답일 가능성이 매
Web Vitals, 프론트엔드의 필수 역량프론트엔드 개발자에게 Web Vitals는 더 이상 '알면 좋은 교양'이 아닌, 반드시 갖춰야 할 '필수 역량'이다.웹페이지는 단순히 CSS의 플로우에 따라 순서대로 페인팅되어 사용자에게 제공되지 않는다. JavaScript는 동적으로 DOM을 조작하고, 수많은 API는 데이터를 요청하며, CDN에서는 거대한 이미지와 동영상을 불러온다.Web Vitals은 사용자의 UX를 구글이 객관적으로 평가하기 위해 정의한 기준으로 수치를 측정하고 방해 요소들을 미리 파악하여 개선하여 사용자 UX와 성능을 개선할 수 있게 해주는 중요 지표이다.간단하지만 치명적인 예시 하나를 살펴보자.좀 극단적인 예로 초기 히어로 페이지의 배너 이미지로 WebP나 JPG 대신, 30MB짜리 PNG 파일을 그대로 사용했다고 가정해 보자. 이미지 로딩은 비동기로 처리되기에 다른 영역은 먼저 페인트될 수 있다. 하지만 정작 사용자의 시선이 가장 먼저 머무는 핵심 배너는, 거대
브라우저 랜더링어떤 언어로 웹 개발을 하든, 모든 웹페이지들은 브라우저를 통해 사용자에게 페이지를 제공하게 된다. 브라우저 들은 최종적으로는 CSS, HTML의 형태로 페이지 그리게 되며 랜더링 파이프라인을 따른다. 파이프 라인에 따른 화면을 그리는 페인팅 작업은 비싼 비용의 작업이며 현 프론트엔드 시장은 프레임워크 등을 사용하여 브라우저 페인팅의 자원을 절약하는 것이 트랜드이다. 때문에 이 랜더링과 프론트엔드 라이브러리를 더 효율적으로 사용하기 위해서는 브라우저 랜더링을 이해하는 것이 우선이다. 때문에 브라우저 랜더링의 파이프라인과 React가 브라우저 랜더링이 미치는 영향에 대해 정리해본다.브라우저 랜더링 : HTML 과 CSS는 트리를 구성한다.브라우저 랜더링은 기본적으로 CSS와 HTML만으로 페이지를 그린다. HTML은 뼈대를 이야기하며 CSS는 이 뼈대에 가시적 효과를 주는 스타일링 언어이다. 브라우저는 코드를 인터프리터 형식으로 순차적으로 코드를 읽으며 트리 구조를 구성
Next.js :: SuspenseSuspense 바운더리는 React 18버전 공식 출시 이후 Concurrent Rendering 방식을 통해 도입된 기능이다. React에서 이 Suspense 바운더리는 비동기 함수의 상태를 받아 Suspense의 fallback을 반환하게 되고, 이후 상태가 성공하거나 실패하게 되면 자식 컴포넌트들을 렌더하게 된다.Next.js에서도 Suspense는 유용하게 쓰인다. 사실 클라이언트의 경우에는 SWR이나 RTK같은 라이브러리가 프로미스 상태에 따라 너무 좋은 인디케이터를 지원하기 때문에 클라이언트에서는 근래 잘 쓰이지 않는 추세다. 다만 Next.js의 서버 컴포넌트의 Suspense는 스트리밍을 도입함에 따라 서버에서도 인디케이터를 제공할 수 있어 더 유용하게 사용할 수 있다. 해당 포스팅은 클라이언트와 서버에서의 Suspense 실행을 복습하고 원리를 이해하는데 도움이 될 것이다.클라이언트 : SuspenseNext.js의 클라이언트 컴