React DevTools (크롬 확장 프로그램)
Profiler 성능 측정
Redux DevTools
lazy import
: 필요해질때 import 해주세요
위 코드는 메인페이지 로딩할때 로드할 필요 없음
이렇게 lazy import 이용해줘서 필요할때 import 할 수 있도록 해준다
-> 자원 절약 가능
사용하기 위해서는 상단에서 lazy import는 필수
: Cart, Dtail 컴포넌트 로딩시간 발생
-> 로딩되는 시간에 안내문 띄워주고 싶다면? Suspense 이용
Suspense
memo (꼭 필요할때만 재랜더링 될 수 있도록 해주는 함수 )
: 자식컴포넌트 재렌더링 막기
props가 변할 때만 재렌더링 해줌
memo로 재렌더링 오래걸리는 컴포넌트 감싸놓으면 좋음
useMemo
: 컴포넌트 렌더링시 1회만 실행해줌
[state] --> state가 변화할때만 실행한다는 의미
useMemo, useEffect 차이 (실행 시점의 차이)
useMemo : 렌더링 될 때 같이 실행됨
useEffect : HTML 다 보여주고 useEffect 실행됨
batch 기능
state1 변경()
state2 변경()
state3 변경()
이럴 경우 state 변경함수 실행될 때마다 재렌더링 되는게 아니라
state3 변경()부분에서만 재렌더링 1회가 일어남 = 마지막에 딱 한번만 재렌더링 일어남
업데이트 전엔 ajax, setTimeout 내부에서 batching이 일어나지 않았는데,
리액트 18버전 이후 부터는 어디에 있든 재렌더링은 마지막에 1번만 됨
useTransition
: 느린 컴포넌트 성능 향상 가능
(카드 빚 돌려막기랑 비슷)
input에 유저가 무언가 입력하면
e.target.value에는 유저가 입력한 값이 남음
name에 저장되게 해주세요
import {useState} from 'react'
let a = new Array(10000).fill(0)
function App(){
let [name, setName] = useState('')
return (
<div>
<input onChange={ (e)=>{ setName(e.target.value) }}/>
{
a.map(()=>{
return <div>{name}</div>
})
}
</div>
)
}
위 코드는 의도적으로 재렌더링이 느린 컴포넌트를 만든 코드임
import {useState, useTransition} from 'react'
let a = new Array(10000).fill(0)
function App(){
let [name, setName] = useState('')
let [isPending, startTransition] = useTransition()
return (
<div>
<input onChange={ (e)=>{
startTransition(()=>{
setName(e.target.value)
})
}}/>
{
a.map(()=>{
return <div>{name}</div>
})
}
</div>
)
}
이럴때 useTransition() 쓰면 그 자리에 [변수, 함수]가 남음
그래서 < input > 타이핑같이 즉각 반응해야하는걸 우선적으로 처리해줄 수 있음
isPending
: startTransition() 으로 감싼 코드가 처리중일 때 true로 변하는 변수
{
isPending ? "로딩중 기다리세요" :
a.map(()=>{
return <div>{name}</div>
})
}
useDeferredValue
: startTransition()랑 용도가 같음
state 아니면 변수 하나를 집어넣을 수 있게 되어있음
그 변수에 변동사항이 생기면 그걸 늦게 처리해줌
useDeferredValue 안에 state를 집어넣으면 그 state가 변동사항이 생겼을 때 나중에 처리해줌
그리고 처리결과는 let state에 저장해줌