use client
는 CSR
만 된다는 뜻이 아님, SSR
이후에 Hydration
된다는 뜻
Server Components
는 Client Components
를 하위 컴포넌트로 가질 수 있지만 반대는 불가능.
Server Components
에서 fetching
된 data
는 cached
되지만 Client Coponents
는 불가능.
CSR
은 Metadata
사용이 불가능.
layout
은 서로 상쇄되지 않고 중첩됨.
동시성 렌더링
을 추가했다. 동시성 렌더링
덕분에 이제 앨리스에게 전화를 건 후 대기 상태에 들어간 다음에 밥에게 전화를 걸어 어느 전화가 더 중요한지 결정할 수 있게됐다. 자동 일괄 처리
식료품 쇼핑을 예로 들어서 설명하겠다. 리액트 18 이전에는 식료품 쇼핑을 할 때 먼저 요리를 시작한 후 중간중간 필요한 재료가 있을때 마다 마트에 가서 식재료를 사왔었다. 이 비효율적인 방식을 바꾸기 위해 생긴게 자동 일괄 처리
다. 이제부터 요리할때 필요한 재료가 있으면 목록화 해서 한 번에 모든 재료를 구매하면 된다. 자동 일괄 처리
덕분에 state
를 사용할 때마다 상태가 변하면서 생기는 렌더링 횟수를 줄이는 데 많은 도움이 되었다.
예를 들자면 리액트 18 이전에 promise가 있거나 네트워크 호출을 하는 상황에선 상태 업데이트는 일괄 처리되지 않았다.
fetch('/network').then(() => {
setCounter(); // 한 번 리렌더링됨.
setActive(); // 두 번 리렌더링됨.
setValue(); // 세 번 리렌더링됨.
});
하지만 리액트 18 이후에는 자동 일괄 처리
가 도입됐고 promise, setTimeouts, 이벤트 콜백에서 모든 상태 업데이트가 일괄로 처리되도록 바꼈다. 덕분이 이제 리액트가 수행해야 할 작업의 상당수가 줄어듬. 이 기능을 사용하지 않으려면 flushSync
를 사용하면 된다.
Suspense
를 사용하는 이유
Suspense
이 없었을때는 느린 컴포넌트가 하나라도 그 느린 컴포넌트 하나가 전체 페이지 로드를 늦췄다. 서버 렌더링이란 아무것도 없거나 모두 렌더링이 된 상태이므로, 느린 컴포넌트의 로딩을 늦추거나 다른 컴포넌트의 HTML을 보내달라고 요청할 수 없었는데 Suspense
가 생긴 이후로 느린 컴포넌트가 있다면 Suspense
로 감싸 해당 컴포넌트의 로딩을 지연시킬 수 있게 됐다. 여러 컴포넌트를 따로 분할한 다음에 로드하는 것과 Suspense
를 사용하는 것의 차이점은?