Nuxt 3 已于 31 July 2026 结束生命周期
此版本将不再接收错误修复或安全补丁。 升级到 Nuxt 4 或获取 HeroDevs 提供的延长支持

Nuxt 是如何工作的?

Nuxt 是一个极简但高度可定制的框架,用于构建 Web 应用。

Geprüfte Übersetzung ·0 % geprüft

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

Nuxt 接口

当你通过 nuxt dev 在开发模式下启动 Nuxt,或使用 nuxt build 构建生产应用时,会创建一个通用上下文,在内部称为 nuxt。它包含与 nuxt.config 文件合并并规范化后的选项、一些内部状态,以及由 unjs/hookable 提供支持的强大钩子系统,使不同组件能够相互通信。你可以将其视为 Builder Core。

此上下文可通过 Nuxt Kit 组合式函数全局访问。因此,每个进程只允许运行一个 Nuxt 实例。

要扩展 Nuxt 接口并接入构建过程的不同阶段,我们可以使用 Nuxt 模块。

更多细节请查看 源码。

NuxtApp 接口

当在浏览器或服务器端渲染页面时,会创建一个共享上下文,称为 nuxtApp。
该上下文保存 Vue 实例、运行时钩子以及内部状态,比如用于 hydration 的 ssrContext 和 payload。
你可以将其视为运行时核心。

在 Nuxt 插件、<script setup> 和 Vue 组合式函数中,可以使用 useNuxtApp() 组合式函数访问此上下文。在浏览器中可以全局使用,但在服务器上不行,以避免在不同用户之间共享上下文。

由于 useNuxtApp 会在当前上下文不可用时抛出异常,如果你的组合式函数并非始终需要 nuxtApp,则可以改用 tryUseNuxtApp,它会返回 null,而不是抛出异常。

要扩展 nuxtApp 接口、接入不同阶段或访问上下文,我们可以使用 Nuxt 插件。

有关此接口的更多信息,请查看 Nuxt App。

nuxtApp 包含以下属性:

interface NuxtApp {
  vueApp // 全局 Vue 应用实例:https://vuejs.org/api/application.html#application-api

  versions // 一个包含 Nuxt 和 Vue 版本信息的对象

  // 允许调用和添加运行时 NuxtApp 钩子
  // https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/nuxt.ts#L18
  hooks
  hook
  callHook

  // 仅可在服务器端访问
  ssrContext: {
    url
    req
    res
    runtimeConfig
    noSSR
  }

  // 该对象会被序列化并从服务器传递到客户端
  payload: {
    serverRendered: true
    data: {}
    state: {}
  }

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

更多细节请参见 源码。

运行时上下文 vs 构建时上下文

Nuxt 使用 Node.js 构建和打包项目,同时也具有运行时部分。

虽然这两个部分都可以被扩展,但运行时上下文与构建时是隔离的。因此,除了运行时配置外,
它们不应共享状态、代码或上下文!

nuxt.config 和 Nuxt 模块可用于扩展构建时上下文,而 Nuxt 插件可用于扩展运行时。

在为生产环境构建应用时,nuxt build 会在 .output 目录中生成独立的构建产物,不依赖于 nuxt.config 和 Nuxt 模块。

Was this helpful?