React 20

React Dev Tools는 정확한 성능 측정을 방해할 수 있다.

개요React 디버깅을 돕는 Chrome 확장 프로그램 React Developer Tools는 분명히 편리한 도구이다. 이 확장 프로그램을 사용하면 어떤 부분에서 re-rendering이 발생하는지, 어떤 컴포넌트의 렌더링에 얼마나 시간이 걸리는지를 쉽게 파악할 수 있다. 하지만, React Developer Tools는 정확한 성능 측정에는 오히려 문제가 될 수 있다는 사실을 발견하였다. 최근, 매우 큰 테이블을 다루는 작업 중 최악의 성능 환경에서 성능 최적화를 진행한 적이 있다. DOM 크기가 매우 커진 상황에서 element.focus() 요청 시, 예상보다 훨씬 속도가 느려지는 현상을 발견했다. memoization 적용, 렌더링 관리, 상태 분리, 알고리즘 최적화 등 성능 향상을 위한 다양한..

frontend 2024.10.24

immer, Redux Toolkit 성능 문제

immer란React에서 상태의 불변성은 성능에 큰 영향을 미친다. 상태가 불변하게 유지되면 React는 변경된 부분만 효율적으로 다시 렌더링할 수 있기 때문에 성능 최적화가 가능해진다. 하지만 불변성을 수동으로 관리하는 것은 번거로울 수 있는데, 이때 immer 라이브러리는 개발자가 불변성을 유지하는 데 신경을 많이 쓰지 않더라도 이를 쉽게 관리할 수 있도록 도와준다. immer는 프록시(proxy)를 사용하여, 객체나 배열을 직접 수정하는 요청을 가로채어 새로운 객체에서 해당 요청을 작업한다. immer의 핵심 함수인 produce는 두 가지 인자를 받는데, 첫 번째는 원본 상태, 두 번째는 상태를 변경하는 콜백 함수이다. 이 함수 내에서 원본 객체는 수정할 수 있는 것처럼 보이지만, 실제로는 프록시..

frontend 2024.10.11

Strict Mode에서 useEffect가 2번 실행되는 이유

Strict Mode란React의 Strict Mode는 react의 내부 구성 요소에 대한 발생 가능한 잠재적 문제를 사전에 알아내기 위한 도구이다.문제가 발생할 경우 로그가 출력되며 이는 개발모드에서만 동작하도록 되어있다.공식문서에 정의된 사용하기 위한 문법은 아래와 같다.import { StrictMode } from 'react';import { createRoot } from 'react-dom/client';const root = createRoot(document.getElementById('root'));root.render( ); 공식문서에서는 react app을 위와같이 Strict Mode로 감싸서 사용하는 것을 권장하고 있으며 이를 통해 발생 가능한 버그들을 사전에 수정..

frontend 2024.08.17

React Lane 간단 정리

개요Lane이란 동시성 문제를 해결하기 위해 나온 개념이다. Lane은 어떤 작업을 처리할 때 이를 먼저 시작된 작업을 처리하는 시간순이 아니라 우선 순위에 따라 해당 작업을 먼저 처리할 수 있도록 도와주는 역할을 한다. 현재 react가 렌더링 중이더라도 유저 액션, 애니메이션과 같은 우선순위가 더 높은 작업이 발생된다면 현재 렌더링 과정을 중단하고 우선순위가 높은 작업을 먼저 처리한 뒤 다시 원래 작업하던 곳으로 돌아가 렌더링을 진행할 수 있게 만들어준다.Lane이란react 내부에서 Lane은 아래와 같이 정의되어 있다.const NoLanes: Lanes = /* */ 0b0000000000000000000000000000000const NoLane: La..

frontend 2024.08.03

React Fiber동작 간단 정리

개요브라우저의 Javascript 엔진은 단일 스레드로 동작한다. 즉 Javascript는 하나의 스레드에서 모든 로직을 순차적으로 실행한다. 여기에는 UI 업데이트 작업도 포함되어있으며 스레드가 하나이기에 UI 업데이트 작업이 있더라도 앞에 다른 작업이 있다면 UI 업데이트가 중단되는 문제가 생기게 된다. React에서는 이러한 UI 업데이트 작업을 최적화기위해 Fiber라는 개념을 도입하였다. Fiber구조 에서 가장 중요한 키워드는 동시성 이며 Fiber는 동시성 스케쥴링을 통해 UI 업데이트 작업에 우선순위를 부여하여 더 높은 우선순위의 경우 먼저 처리해주는 방식으로 동작하도록 만들어주는 역할을 한다.이로 인해 javascript의 UI 업데이트 작업이 더 효율적으로 동작하게 된다.Fiber 알고..

frontend 2024.08.02

React19 Support for Document Metadata / stylesheets / async scripts / preloading resources

Support for Document Metadata / stylesheets / async scripts / preloading resourcesSupport for Document Metadata ... 이를 통해 초기 렌더링을 늦출 수 있는 요소들을 우선순위 혹은 설정에 따라 미리 가져오거나 최적화하여 가져와 초기 렌더링을 향상시킬 수 있음주요 기능preinit:초기 로드 시 중요한 스크립트를 미리 로드하여 페이지 로드 시간을 단축preload:폰트, 스타일시트, 이미지 등 다양한 리소스를 미리 로드prefetchDNS:특정 호스트에서 요청이 발생하지 않을 경우에도 DNS fetch를 미리 실행하여 네트워크 지연을 감소preconnect:특정 호스트에 대해 요청이 발생할 가능성이 있지만 ..

frontend 2024.06.04

transaction을 응용해서 redux 상태 업데이트 최적화하기

개요웹에서 대용량의 데이터를 보여주는 경우는 어떤 경우가 있을까? 아마 대부분의 경우 긴 리스트 혹은 테이블 형태일것이라고 생각한다. 이런 경우에는 보통 virtualization으로 성능을 최적화 할 수 있지만 개인 프로젝트가 아니라 회사 단위의 프로젝트라면 기획, 기존 코드와의 충돌과 같은 문제로 인해 virtualization과 같은 기법을 사용하지 못하는 경우도 있을 수 있다. 대용량의 데이터를 웹에서 보여주다보면 별 이슈를 다 겪을 수 있는데 이번에 겪은 이슈도 이로 인해 발생한 이슈이다.원인은 redux에서 상태 업데이트 시 구독된 middleware의 코드가 실행되는데 이러한 상태 업데이트를 여러 번 실행할 때 n번 middleware가 실행되었으며 약 5000줄의 행과 각 행에서 몇 개의 ..

frontend 2024.04.30

타입스크립트의 제네릭이란

제네릭은 타입스크립트에서 재사용이 가능한 컴포넌트를 생성하는것을 도와주는 역할을 한다 문법 type A = (a:T[]) => T const a:A = (arr) => { return arr[0] } const result= a([1,2,3]) const result2 = a(['1','2']) // 함수형 function A(arg:SomeGeneric) {} A A A // 클래스형 // !Static과 같은 정적변수는 제네릭으로 관리할 수 없다. class A { constructor(a:T){} } new A(1) new A('a') // 타입스크립트 인터페이스 interface GenericIdentityFn { (arg: Type): Type; } 주의점 Static과 같은 정적변수는 제네릭으..

typescript 2024.03.07

useTransition / useDefferedValue 스터디 기록용

useTransition useTransition은 React 18버전에서 추가된 동시성을 다를 수 있는 새로운 훅입니다. React의 모든 렌더링은 동기적으로 작동하여 오래걸리는 렌더링 작업이 있으면 유저에게 안좋은 경험을 줄 수 있었지만 useTransition같은 훅을 사용하면 오래걸리는 렌더링 작업에 대해 로딩 화면을 출력하거나 지금 진행중인 렌더링을 버리고 다른 렌더링 과정을 실행하게하는 등 이를 잘 응용한다면 유저 경험을 향상시킬 수 있도록 만들어주는 역할을 할 수 있습니다. [사용법] import { useTransition } from 'react'; function TabContainer() { const [isPending, startTransition] = useTransition()..

frontend 2024.02.18

React re-rendering 방지 디자인 패턴(4)

React에서 re-rendering이 일어나는 조건은 크게 보면 3가지정도가 있다. 함수 내의 State가 변경되었을 때 부모 컴포넌트가 re-render되었을 때 컴포넌트의 Props값이 변경되었을 때 자세하게 설명하면 수많은 조건이 있겠지만 대부분의 re-rendering는 저 3가지 조건의 상호작용으로 일어나게 된다. 이번 글에서는 잘 응용하면 대부분의 경우 발생할 수 있는 re-rendering을 방지하는 방법에 대해 작성할 예정이다. React의 memo에 대해 작성할 예정이다. 먼저 아래에 간단한 예시가 있다. import { useState } from 'react'; import { Button } from '@/components/ui'; function LargeComponent() ..

frontend 2023.01.23