이 장의 목표는 프레임워크의 다양한 부분, 그 실행 순서, 그리고 이들이 어떻게 함께 동작하는지에 대한 상위 수준의 개요를 제공하는 것입니다.
서버에서는 애플리케이션에 대한 모든 초기 요청마다 다음 단계가 실행됩니다:
Nuxt는 최신 서버 엔진인 Nitro로 구동됩니다.
Nitro가 시작되면 /server/plugins 디렉터리 아래의 플러그인들을 초기화하고 실행합니다. 이 플러그인들은 다음과 같은 작업을 할 수 있습니다:
await 되지 않습니다.Nitro 서버를 초기화한 후, server/middleware/ 아래의 미들웨어가 모든 요청에 대해 실행됩니다. 미들웨어는 인증, 로깅 또는 요청 변환과 같은 작업에 사용할 수 있습니다.
먼저 Vue와 Nuxt 인스턴스가 생성됩니다. 그 후 Nuxt는 앱 플러그인을 실행합니다. 여기에는 다음이 포함됩니다:
unhead와 같은 내장 플러그인.app/plugins/ 디렉터리에 위치한 커스텀 플러그인으로, 접미사가 없는 것(예: myPlugin.ts)과 .server 접미사가 있는 것(예: myServerPlugin.server.ts) 모두 포함됩니다.플러그인은 특정 순서로 실행되며 서로 의존성을 가질 수 있습니다. 실행 순서와 병렬성 등 자세한 내용은 플러그인 문서를 참고하세요.
app:created 훅을 호출합니다.플러그인을 초기화한 후, 미들웨어를 실행하기 전에 Nuxt는 definePageMeta 함수에 validate 메서드가 정의되어 있다면 이를 호출합니다. 동기 또는 비동기로 동작할 수 있는 validate 메서드는 주로 동적 라우트 파라미터를 검증하는 데 사용됩니다.
validate 함수는 true를 반환해야 합니다.false 또는 statusCode 및/또는 statusMessage를 포함하는 객체를 반환해야 합니다.자세한 내용은 라우트 검증 문서를 참고하세요.
미들웨어를 사용하면 특정 라우트로 이동하기 전에 코드를 실행할 수 있습니다. 이는 주로 인증, 리다이렉션 또는 로깅과 같은 작업에 사용됩니다.
Nuxt에는 세 가지 유형의 미들웨어가 있습니다:
Nuxt는 초기 페이지 로드 시(서버와 클라이언트 모두) 모든 전역 미들웨어를 실행한 다음, 모든 클라이언트 사이드 내비게이션 전에 다시 실행합니다. 이름 있는 미들웨어와 익명 미들웨어는 해당 페이지 컴포넌트에 정의된 페이지(라우트) 메타의 middleware 속성에 지정된 라우트에서만 실행됩니다.
각 유형에 대한 자세한 내용과 예시는 미들웨어 문서를 참고하세요.
서버에서 발생하는 모든 리다이렉션은 브라우저로 Location: 헤더를 전송하는 결과를 낳으며, 브라우저는 이 새 위치로 새 요청을 보냅니다. 이때 쿠키에 유지되지 않은 애플리케이션 상태는 모두 초기화됩니다.
이 단계에서 Nuxt는 페이지와 그 컴포넌트를 렌더링하고, useFetch 및 useAsyncData로 필요한 데이터를 가져옵니다. 서버에서는 동적 업데이트가 없고 DOM 작업도 발생하지 않기 때문에, onBeforeMount, onMounted 및 이후 훅과 같은 Vue 라이프사이클 훅은 SSR 동안 실행되지 않습니다.
기본적으로 Vue는 성능 향상을 위해 SSR 동안 의존성 추적을 일시 중지합니다.
<script setup> 안에서 정리(cleanup)가 필요한 부작용(side effect)을 발생시키는 코드는 피해야 합니다. 이러한 부작용의 예로는 setInterval로 타이머를 설정하는 것이 있습니다. 클라이언트 사이드 전용 코드에서는 타이머를 설정한 뒤 onBeforeUnmount 또는 onUnmounted에서 이를 해제할 수 있습니다. 그러나 SSR 동안에는 언마운트 훅이 절대 호출되지 않기 때문에, 타이머는 영원히 남아 있게 됩니다. 이를 피하려면 부작용 코드를 onMounted 안으로 옮기세요.필요한 모든 데이터를 가져오고 컴포넌트를 렌더링한 후, Nuxt는 렌더링된 컴포넌트와 unhead의 설정을 결합하여 완전한 HTML 문서를 생성합니다. 이 HTML은 관련 데이터와 함께 클라이언트로 전송되어 SSR 프로세스를 완료합니다.
app:rendered 훅을 호출합니다.render:html 훅을 호출합니다. 이 훅을 사용하면 추가 스크립트를 주입하거나 메타 태그를 수정하는 등 생성된 HTML을 조작할 수 있습니다.이 라이프사이클 부분은 선택한 Nuxt 모드와 관계없이 브라우저에서 완전히 실행됩니다.
이 단계는 서버 사이드 실행과 유사하며, 내장 플러그인과 커스텀 플러그인 모두를 포함합니다.
app/plugins/ 디렉터리의 커스텀 플러그인 중 접미사가 없는 것(예: myPlugin.ts)과 .client 접미사가 있는 것(예: myClientPlugin.client.ts)은 클라이언트 측에서 실행됩니다.
app:created 훅을 호출합니다.이 단계는 서버 사이드 실행과 동일하며, definePageMeta 함수에 정의된 경우 validate 메서드를 포함합니다.
Nuxt 미들웨어는 서버와 클라이언트 모두에서 실행됩니다. 특정 코드가 특정 환경에서만 실행되도록 하려면, 클라이언트용 import.meta.client와 서버용 import.meta.server를 사용해 코드를 분리하는 것을 고려하세요.
app.mount('#__nuxt')를 호출하면 Vue 애플리케이션이 DOM에 마운트됩니다. 애플리케이션이 SSR 또는 SSG 모드를 사용하는 경우, Vue는 클라이언트 사이드 애플리케이션을 인터랙티브하게 만들기 위해 하이드레이션 단계를 수행합니다. 하이드레이션 동안 Vue는 애플리케이션을 다시 생성하고(서버 컴포넌트는 제외), 각 컴포넌트를 해당 DOM 노드와 매칭하며 DOM 이벤트 리스너를 연결합니다.
올바른 하이드레이션을 보장하려면 서버와 클라이언트 간의 데이터 일관성을 유지하는 것이 중요합니다. API 요청의 경우 useAsyncData, useFetch 또는 기타 SSR 친화적인 컴포저블을 사용하는 것이 좋습니다. 이러한 방법은 서버 측에서 가져온 데이터를 하이드레이션 중에 재사용하여 반복 요청을 방지합니다. 새로운 요청은 하이드레이션 이후에만 트리거되어야 하며, 이를 통해 하이드레이션 오류를 방지할 수 있습니다.
app:beforeMount 훅을 호출합니다.app:mounted 훅을 호출합니다.서버와 달리 브라우저에서는 전체 Vue 라이프사이클이 실행됩니다.