---
title: "Nuxt 如何工作？"
description: "Nuxt 是一个极简但高度可定制的框架，用于构建网络应用。"
canonical_url: "https://nuxt.zhcndoc.com/docs/4.x/guide/going-further/internals"
---
# Nuxt 如何工作？

> Nuxt 是一个极简但高度可定制的框架，用于构建网络应用。

本指南帮助你更好地理解 Nuxt 的内部机制，以便在 Nuxt 之上开发新的解决方案和模块集成。

## Nuxt 接口

当你在开发模式下使用 [`nuxt dev`](https://nuxt.zhcndoc.com/docs/4.x/api/commands/dev) 启动 Nuxt，或使用 [`nuxt build`](https://nuxt.zhcndoc.com/docs/4.x/api/commands/build) 构建生产应用时，会创建一个通用上下文，在内部称为 `nuxt`。它包含与 `nuxt.config` 文件合并后的规范化选项、一些内部状态，以及由 [unjs/hookable](https://github.com/unjs/hookable) 提供支持的强大[钩子系统](https://nuxt.zhcndoc.com/docs/4.x/api/advanced/hooks)，使不同组件能够彼此通信。你可以将其视为**构建器核心**。

此上下文可通过 [Nuxt Kit](https://nuxt.zhcndoc.com/docs/4.x/guide/going-further/kit) 组合式函数全局访问。因此，每个进程只允许运行一个 Nuxt 实例。

若要扩展 Nuxt 接口并接入构建过程的不同阶段，我们可以使用 [Nuxt 模块](https://nuxt.zhcndoc.com/docs/4.x/guide/modules)。

更多细节请查看[源码](https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/core/nuxt.ts)。

## NuxtApp 接口

在浏览器或服务器渲染页面时，会创建一个共享上下文，称为 `nuxtApp`。
该上下文保存 vue 实例、运行时钩子以及诸如 ssrContext 和用于 hydration 的 payload 等内部状态。
你可以把它看作是 **运行时核心（Runtime Core）**。

在 Nuxt 插件、`<script setup>` 和 Vue 组合式函数中，可以使用 [`useNuxtApp()`](https://nuxt.zhcndoc.com/docs/4.x/api/composables/use-nuxt-app) 组合式函数访问此上下文。浏览器端可以全局使用，但服务器端不行，以避免在不同用户之间共享上下文。

由于当前无法获取上下文时 [`useNuxtApp`](https://nuxt.zhcndoc.com/docs/4.x/api/composables/use-nuxt-app) 会抛出异常，如果你的组合式函数并非总是需要 `nuxtApp`，可以改用 [`tryUseNuxtApp`](https://nuxt.zhcndoc.com/docs/4.x/api/composables/use-nuxt-app#tryusenuxtapp)，它会返回 `null`，而不是抛出异常。

若要扩展 `nuxtApp` 接口、接入不同阶段或访问上下文，我们可以使用 [Nuxt 插件](https://nuxt.zhcndoc.com/docs/4.x/directory-structure/app/plugins)。

查看 [Nuxt App](https://nuxt.zhcndoc.com/docs/4.x/api/composables/use-nuxt-app) 以了解有关此接口的更多信息。

`nuxtApp` 具有以下属性：

```ts
interface NuxtApp {
  vueApp // the global Vue application: https://vue.zhcndoc.com/api/application.html#application-api

  versions // an object containing Nuxt and Vue versions

  // These let you call and add runtime NuxtApp hooks
  // https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/nuxt.ts#L18
  hooks
  hook
  callHook

  // Only accessible on server-side
  ssrContext: {
    url
    req
    res
    runtimeConfig
    noSSR
  }

  // This will be stringified and passed from server to client
  payload: {
    serverRendered: true
    data: {}
    state: {}
  }

  provide: (name: string, value: any) => void
}
```

更多细节请查看[源码](https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/nuxt.ts)。

## 运行时上下文与构建上下文

Nuxt 使用 Node.js 来构建并打包项目，但也具有运行时一面。

虽然两者都可以被扩展，但运行时上下文与构建时是隔离的。因此，除运行时配置之外，它们不应共享状态、代码或上下文！

可以使用 `nuxt.config` 和 [Nuxt 模块](https://nuxt.zhcndoc.com/docs/4.x/guide/modules)扩展构建上下文，并使用 [Nuxt 插件](https://nuxt.zhcndoc.com/docs/4.x/directory-structure/app/plugins)扩展运行时。

为生产环境构建应用时，`nuxt build` 会在 `.output` 目录中生成一个独立的构建产物，不依赖于 `nuxt.config` 和 [Nuxt 模块](https://nuxt.zhcndoc.com/docs/4.x/guide/modules)。


## Sitemap

See the full [sitemap](https://nuxt.zhcndoc.com/sitemap.md) for all pages.
