Nuxt 如何工作?
Maschinelle Übersetzung ·0 % geprüft
本指南帮助你更好地理解 Nuxt 的内部机制,以便在 Nuxt 之上开发新的解决方案和模块集成。
Nuxt 接口
当你在开发模式下使用 nuxt dev 启动 Nuxt,或使用 nuxt build 构建生产应用时,会创建一个通用上下文,在内部称为 nuxt。它包含与 nuxt.config 文件合并后的规范化选项、一些内部状态,以及由 unjs/hookable 提供支持的强大钩子系统,使不同组件能够彼此通信。你可以将其视为构建器核心。
此上下文可通过 Nuxt Kit 组合式函数全局访问。因此,每个进程只允许运行一个 Nuxt 实例。
若要扩展 Nuxt 接口并接入构建过程的不同阶段,我们可以使用 Nuxt 模块。
更多细节请查看源码。
NuxtApp 接口
在浏览器或服务器渲染页面时,会创建一个共享上下文,称为 nuxtApp。
该上下文保存 vue 实例、运行时钩子以及诸如 ssrContext 和用于 hydration 的 payload 等内部状态。
你可以把它看作是 运行时核心(Runtime Core)。
在 Nuxt 插件、<script setup> 和 Vue 组合式函数中,可以使用 useNuxtApp() 组合式函数访问此上下文。浏览器端可以全局使用,但服务器端不行,以避免在不同用户之间共享上下文。
由于当前无法获取上下文时 useNuxtApp 会抛出异常,如果你的组合式函数并非总是需要 nuxtApp,可以改用 tryUseNuxtApp,它会返回 null,而不是抛出异常。
若要扩展 nuxtApp 接口、接入不同阶段或访问上下文,我们可以使用 Nuxt 插件。
查看 Nuxt App 以了解有关此接口的更多信息。
nuxtApp 具有以下属性:
interface NuxtApp {
vueApp // die globale Vue-Anwendung: https://vue.zhcndoc.com/api/application.html#application-api
versions // ein Objekt mit den Nuxt- und Vue-Versionen
// Damit kannst du NuxtApp-Hooks zur Laufzeit aufrufen und hinzufügen
// https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/nuxt.ts#L18
hooks
hook
callHook
// Nur auf der Serverseite zugänglich
ssrContext: {
url
req
res
runtimeConfig
noSSR
}
// Dies wird serialisiert und vom Server an den Client übergeben
payload: {
serverRendered: true
data: {}
state: {}
}
provide: (name: string, value: any) => void
}更多细节请查看源码。
运行时上下文与构建上下文
Nuxt 使用 Node.js 来构建并打包项目,但也具有运行时一面。
虽然两者都可以被扩展,但运行时上下文与构建时是隔离的。因此,除运行时配置之外,它们不应共享状态、代码或上下文!
可以使用 nuxt.config 和 Nuxt 模块扩展构建上下文,并使用 Nuxt 插件扩展运行时。
为生产环境构建应用时,nuxt build 会在 .output 目录中生成一个独立的构建产物,不依赖于 nuxt.config 和 Nuxt 模块。