MiniCssExtractPlugin
을 이용하여 CSS 코드가 포함된 JS 파일 별로 CSS 파일을 생성
TerserPlugin
을 이용하여 번들 크기를 줄입니다.
나쁜예
// UserList.jsx
function UserList() {
{...}
const getResult = useCallback((score) => {
if (score <= 70) {
return { grade: "D" };
} else if (score <= 80) {
return { grade: "C" };
} else if (score <= 90) {
return { grade: "B" };
} else {
return { grade: "A" };
}
}, []);
return(
<div>
{users.map((user) => {
return (
<Item key={user.id} user={user} result={getResult(user.score)} />
);
})}
</div>
)
export default memo(UserList);
// Item.jsx
function Item({ user, result }) {
console.log("Item component render");
return (
<div className="item">
<div>이름: {user.name}</div>
<div>나이: {user.age}</div>
<div>점수: {user.score}</div>
<div>등급: {result.grade}</div>
</div>
);
}
export default Item;
좋은예
// UserList.jsx
function UserList() {
{...}
return(
<div>
{users.map((user) => {
return (
<Item key={user.id} user={user} />
);
})}
</div>
)
export default memo(UserList);
// Item.jsx
function Item({ user }) {
console.log("Item component render");
const getResult = useCallback((score) => {
if (score <= 70) {
return { grade: "D" };
}
if (score <= 80) {
return { grade: "C" };
}
if (score <= 90) {
return { grade: "B" };
} else {
return { grade: "A" };
}
}, []);
const { grade } = getResult(user.score);
return (
<div className="item">
<div>이름: {user.name}</div>
<div>나이: {user.age}</div>
<div>점수: {user.score}</div>
<div>등급: {grade}</div>
</div>
);
}
상태를 넘겨서 하위 컴포넌트에서 처리
다음과 같은 경우 key값이 바뀌기 때문에 바뀌었다고 판단하여 리렌더링이 자주 발생하합니다.
거대한 list data를 렌더링 한다면 브라우저의 뷰포트에 보여지는 부분만 렌더링하고 나머지는 스크롤 할때 보여지도록 합니다.
windowing이라고 이것을 부르고 react-window, reat-vitualized 라이브러리로 가능합니다.