Nuxt 如何工作?
本指南帮助你更好地理解 Nuxt 的内部原理,以便在 Nuxt 之上开发新的解决方案和模块集成。
Nuxt 接口
当你使用 nuxt dev 启动开发模式或使用 nuxt build 构建生产环境应用时,将会创建一个公共上下文,在内部称为 nuxt。它包含了与 nuxt.config 文件合并后的标准化选项、一些内部状态,以及一个由 unjs/hookable 驱动的强大的 钩子系统,允许不同的组件相互通信。你可以将其视为 构建器核心(Builder Core)。
此上下文可在全局范围内通过 Nuxt Kit 组合式函数使用。因此,每个进程只允许运行一个 Nuxt 实例。
要扩展 Nuxt 接口并钩入构建过程的不同阶段,我们可以使用 Nuxt 模块。
有关更多详细信息,请查看 源代码。
NuxtApp 接口
当在浏览器或服务器中渲染页面时,将会创建一个共享上下文,在内部称为 nuxtApp。该上下文保留了 Vue 实例、运行时钩子以及诸如 ssrContext 和用于水合的 payload 等内部状态。你可以将其视为 运行时核心(Runtime Core)。
在 Nuxt 插件、<script setup> 以及 Vue 组合式函数中,可以使用 useNuxtApp() 组合式函数访问此上下文。在浏览器中可以进行全局使用,但在服务器上则不行,以避免在用户之间共享上下文。
由于如果当前上下文不可用,useNuxtApp 会抛出异常,因此如果你的组合式函数并非总是需要 nuxtApp,你可以改用 tryUseNuxtApp,它会返回 null 而不是抛出异常。
要扩展 nuxtApp 接口并钩入不同阶段或访问上下文,我们可以使用 Nuxt 插件。
查看 Nuxt 应用 以了解有关此接口的更多信息。
nuxtApp 具有以下属性
interface NuxtApp {
vueApp // the global Vue application: https://vuejs.ac.cn/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
}
有关更多详细信息,请查看 源代码。
运行时上下文与构建上下文
Nuxt 使用 Node.js 构建和打包项目,但同时也拥有运行时端。
虽然这两个领域都可以扩展,但运行时上下文与构建时是隔离的。因此,除运行时配置外,它们不应共享状态、代码或上下文!
nuxt.config 和 Nuxt 模块 可用于扩展构建上下文,而 Nuxt 插件 可用于扩展运行时。
为生产环境构建应用程序时,nuxt build 将在 .output 目录中生成一个独立的构建,它独立于 nuxt.config 和 Nuxt 模块。