Nuxt 如何工作?
本指南帮助您更好地理解 Nuxt 内部机制,以便在 Nuxt 之上开发新的解决方案和模块集成。
Nuxt 接口
当您使用 nuxt dev`` 以开发模式启动 Nuxt 或使用 nuxt build`` 构建生产应用程序时,
会创建一个公共上下文,内部称为 nuxt。它保存与 nuxt.config 文件合并的规范化选项、
一些内部状态,以及由 unjs/hookable 提供支持的强大钩子系统
允许不同组件相互通信。您可以将其视为 构建器核心。
此上下文全局可用。 因此每个进程只允许运行一个 Nuxt 实例。
要扩展 Nuxt 接口并挂钩到构建过程的不同阶段,我们可以使用 Nuxt 模块。
有关更多详细信息,请查看源代码。
NuxtApp 接口
当在浏览器或服务器上渲染页面时,会创建一个共享上下文,称为 nuxtApp。
此上下文保存 vue 实例、运行时钩子以及用于水合的内部状态,如 ssrContext 和 payload。
您可以将其视为 运行时核心。
可以使用 useNuxtApp()`` 组合式函数在 Nuxt 插件和
由于 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
}
有关更多详细信息,请查看源代码。
运行时上下文与构建上下文
Nuxt 使用 Node.js 构建和打包项目,但也有运行时端。
虽然这两个区域都可以扩展,但运行时上下文与构建时隔离。因此,它们不应该共享状态、代码或上下文,除了运行时配置之外!
nuxt.config 和 Nuxt 模块 可用于扩展构建上下文,而 Nuxt 插件 可用于扩展运行时。
当为生产环境构建应用程序时,nuxt build 将在 .output 目录中生成独立构建,独立于 nuxt.config 和 Nuxt 模块。