How Nuxt Works?

Nuxt is a minimal but highly customizable framework to build web applications. This guide helps you better understand Nuxt internals to develop new solutions and module integrations on top of Nuxt.

The Nuxt interface

When you start nuxt in development mode with nuxi dev or building a production application with nuxi build, a common context will be created, referred to as nuxt internally. It holds normalized options merged with nuxt.config file, some internal state, and a powerful hooking system powered by unjs/hookable allowing different components to communicate with each other. You can think of it as Builder Core.

This context is globally available to be used with nuxt/kit composables. Therefore only one instance of Nuxt is allowed to run per process.

To extend the Nuxt interface and hook into different stages of the build process, we can use Nuxt Modules.

For more details, check out the source code.

The NuxtApp interface

When rendering a page in the browser or on the server, a shared context will be created, referred to as nuxtApp. This context keeps vue instance, runtime hooks, and internal states like ssrContext and payload for hydration. You can think of it as Runtime Core.

This context can be accessed using useNuxtApp() composable within nuxt plugins and <script setup> and vue composables. Global usage is possible for the browser but not on the server, to avoid sharing context between users.

To extend the nuxtApp interface and hook into different stages or access contexts, we can use Nuxt Plugins.

Check Nuxt App for more information about this interface.

nuxtApp has the following properties:

Note: this is an internal interface, and some properties might change until stable release.

  1. const nuxtApp = {
  2. vueApp, // the global Vue application: https://vuejs.org/api/application.html#application-api
  3. // These let you call and add runtime NuxtApp hooks
  4. // https://github.com/nuxt/framework/blob/main/packages/nuxt3/src/app/nuxt.ts#L18
  5. hooks,
  6. hook,
  7. callHook,
  8. // Only accessible on server-side
  9. ssrContext: {
  10. url,
  11. req,
  12. res,
  13. runtimeConfig,
  14. noSSR,
  15. },
  16. // This will be stringified and passed from server to client
  17. payload: {
  18. serverRendered: true,
  19. data: {},
  20. state: {}
  21. }
  22. provide: (name: string, value: any) => void
  23. }

For more details, check out the source code.

Runtime Context vs. Build Context

Nuxt builds and bundles project using Node.js but also has a runtime side.

While both areas can be extended, that runtime context is isolated from build-time. Therefore, they are not supposed to share state, code, or context other than runtime configuration!

nuxt.config and Nuxt Modules can be used to extend the build context, and Nuxt Plugins can be used to extend runtime.

When building an application for production, nuxi build will generate a standalone build in the .output directory, independent of nuxt.config and Nuxt modules.