Server Lifecycle
On the server, the following steps are executed for every initial request to your application:Server Plugins
Nuxt is powered by Nitro, a modern server engine.When Nitro starts, it initializes and executes the plugins under the
/server/plugins directory. These plugins can:- Capture and handle application-wide errors
- Register hooks that execute when Nitro shuts down
- Register hooks for request lifecycle events, such as modifying responses
Nitro plugins are executed only once when the server starts. In a serverless environment, the server boots on each incoming request, and so do the Nitro plugins. However, they are not awaited.
Server Middleware
After initializing the Nitro server, middleware under
server/middleware/ is executed for every request. You can use middleware for tasks such as authentication, logging, or request transformation.App Plugins
The Vue and Nuxt instances are created first. Afterward, Nuxt executes its app plugins. This includes:
- Built-in plugins, such as Vue Router and
unhead - Custom plugins located in the
app/plugins/directory, including those without a suffix (e.g.,myPlugin.ts) and those with the.serversuffix (e.g.,myServerPlugin.server.ts)
After this step, Nuxt calls the
app:created hook, which you can use to execute additional logic.Route Validation
After initializing plugins and before executing middleware, Nuxt calls the
validate method if it is defined in the definePageMeta function. The validate method, which can be synchronous or asynchronous, is often used to validate dynamic route parameters.- The
validatefunction should returntrueif the parameters are valid - If validation fails, it should return
falseor an object containing astatusand/orstatusTextto terminate the request
App Middleware
Middleware allows you to run code before navigating to a particular route. You often use it for tasks such as authentication, redirection, or logging.In Nuxt, there are three types of middleware:
- Global route middleware
- Named route middleware
- Anonymous (or inline) route middleware
Any redirection on the server will result in a
Location: header being sent to the browser; the browser then makes a fresh request to this new location. All application state will be reset when this happens, unless persisted in a cookie.Page and Components
Nuxt renders the page and its components and fetches any required data with
useFetch and useAsyncData during this step. Since there are no dynamic updates and no DOM operations occur on the server, Vue lifecycle hooks such as onBeforeMount, onMounted, and subsequent hooks are NOT executed during SSR.By default, Vue pauses dependency tracking during SSR for better performance.There is no reactivity on the server side because Vue SSR renders the app top-down as static HTML, making it impossible to go back and modify content that has already been rendered.
HTML Output
After all required data is fetched and the components are rendered, Nuxt combines the rendered components with settings from
unhead to generate a complete HTML document. This HTML, along with the associated data, is then sent back to the client to complete the SSR process.After rendering the Vue application to HTML, Nuxt calls the
app:rendered hook. Before finalizing and sending the HTML, Nitro will call the render:html hook. This hook allows you to manipulate the generated HTML, such as injecting additional scripts or modifying meta tags.Client Lifecycle
This part of the lifecycle is fully executed in the browser, no matter which Nuxt mode you’ve chosen.App Plugins
This step is similar to the server-side execution and includes both built-in and custom plugins.Custom plugins in the
app/plugins/ directory, such as those without a suffix (e.g., myPlugin.ts) and with the .client suffix (e.g., myClientPlugin.client.ts), are executed on the client side.After this step, Nuxt calls the
app:created hook, which you can use to execute additional logic.Route Validation
This step is the same as the server-side execution and includes the
validate method if defined in the definePageMeta function.App Middleware
Nuxt middleware runs on both the server and the client. If you want certain code to run in specific environments, consider splitting it by using
import.meta.client for the client and import.meta.server for the server.Mount Vue App and Hydrate
Calling
app.mount('#__nuxt') mounts the Vue application to the DOM. If your application uses SSR or SSG mode, Vue performs a hydration step to make the client-side application interactive. During hydration, Vue recreates the application (excluding Server Components), matches each component to its corresponding DOM nodes, and attaches DOM event listeners.To ensure proper hydration, it’s important to maintain consistency between the data on the server and the client. For API requests, use useAsyncData, useFetch, or other SSR-friendly composables. These methods ensure that the data fetched on the server side is reused during hydration, avoiding repeated requests. Any new requests should only be triggered after hydration, preventing hydration errors.Before mounting the Vue application, Nuxt calls the
app:beforeMount hook. After mounting the Vue application, Nuxt calls the app:mounted hook.Vue Lifecycle
Unlike on the server, the browser executes the full Vue lifecycle.