React에서 컴포넌트의 목적에 따라 렌더링할 위치를 선택할 수 있다.
페이지를 작은 컴포넌트들로 나누면, Non-interactive 컴포넌트는 서버 컴포넌트로 렌더링할 수 있다. => Next.js의 server-first 접근
개발자들이 서버 인프라를 더 잘 활용할 수 있다.
초기 페이지 로딩이 빨라지고, client-side 자바스크립트 번들사이즈가 줄어든다.
App Router의 모든 컴포넌트는 기본적으로 서버 컴포넌트이기 때문에 추가 작업없이 자동으로 뛰어난 성능을 가짐.
‘use client’ 를 통해 클라이언트 컴포넌트를 선택적으로 사용할 수 있다.
클라이언트 컴포넌트를 사용하면 인터랙션을 추가할 수 있다.
Next.jsdptjsms pre-rendering되고, 클라이언트에서 hydrate된다.
server-only코드와 client 코드 사이에 위치한다. 파일의 가장 상단에 작성되어 서버와 클라이언트 경계를 정의한다. (다른 모듈과, 하위 컴포넌트를 포함해서 클라이언트 번들로 간주함)
서버 컴포넌트 모듈 그래프의 컴포넌트는 서버에서만 렌더링되도록 보장됨
클라이언트 컴포넌트 모듈 그래프의 컴포넌트는 주로 클라이언트에서 렌더링되지만, Next.js에서는 서버에서 미리 렌더링 후 클라이언트에서 하이드레이션 가능
클라이언트 컴포넌트를 tree의 leaves로 옮기기
필요한 컴포넌트만 클라이언트 컴포넌트로 사용
React의 렌더링
클라이언트 컴포넌트로 서버 컴포넌트를 import 하는 것은 추가적인 server round trip(왕복)이 필요하기 때문에 제한이 있다. -> 지원하지 않는 패턴
대신에, 서버 컴포넌트를 클라이언트 컴포넌트에 props로 전달하면 된다. -> 추천하는 패턴
서버 컴포넌트의 holes를 표시하면, 서버 컴포넌트는 서버에서 렌더링되고, 클라이언트 컴포넌트가 클라이언트에서 렌더링 될때, holes는 서버 컴포넌트의 렌더링 결과로 채워진다. 이 holes는 children prop로 만든다.
props는 직렬화가 가능해야 한다.(함수, 날짜 전달 불가)
네트워크 경계
서버 컴포넌트와 클라이언트 컴포넌트 사이.
서버 컴포넌트 내부에서 가져온 데이터는 클라이언트 컴포넌트로 전달되지 않는 한 직렬화할 필요가 없음.
모듈은 서버, 클라이언트 모두에서 공유할수 있기때문에 혹시나…서버에서만 실행되어야할 코드가 클라이언트에 포함될 수 있음
의도치않은 클라이언트의 서버 코드사용을 방지하기 위한 패키지.
서버온리 코드에 해당 모듈을 Import 하면 클라이언트에서 해당 코드를 사용할때 빌드오류가 발생한다.
클라이언트 컴포넌트에서 데이터를 가져올땐 서버 컴포넌트에서 가져오는 것이 좋다.(성능, 사용자 경험 향상)
현재 use-client 를 명시하지 않은 써드파티 패키지들이 많기 때문에 서버컴포넌트에서 해당 컴포넌트를 사용하면 오류가 발생할 수 있다. 따라서 해당 컴포넌트를 랩핑해서 use client를 명시해주면 오류없이 사용할 수 있다.
Next.js13에서 context는 클라이언트 컴포넌트내에서는 지원되지만, 서버 컴포넌트에서는 사용할 수 없다.
클라이언트 컴포넌트에서는 모든 context API를 사용할 수 있다. 하지만 루트에서 provider를 렌더링하는 경우, 서버 컴포넌트때문에 오류가 발생한다. 따라서 클라이언트 컴포넌트내부에서 provider를 만들고 렌더링해야한다. (전체 html말고 children만 랩핑하도록 하자 -> 최적화)
Use-client가 없는 경우 클라이언트 컴포넌트를 따로 만들어서 랩핑하면 된다.
React의 상태 필요없이, 네이티브 자바스크립트 패턴을 사용할 수 있다. 예를들면 모듈을 사용해서 여러 서버 컴포넌트에서 공유할 수 있다.
데이터를 사용하는 컴포넌트와 데이터를 패칭을 같이 배치하는 것이 좋다. 패칭요청은 서버 컴포넌트에서 자동으로 중복제거되므로, 중복요청에 대한 걱정없이 필요한 데이터를 정확하게 요청할 수 있다. Next.js에서는 fetch cache를 통해 같은 값을 가져올수 있다.