Skip to content

生命周期钩子 (Lifecycle Hooks)

Nuxt 应用在运行过程中会触发各种生命周期钩子,插件或模块可以监听这些钩子来扩展功能。

常用钩子一览

1. App 钩子 (Runtime)

这些钩子在 Vue 应用实例中运行,通常在插件 (plugins/) 或组合式函数中使用。

钩子名称说明
app:createdVue 应用实例创建时触发
app:mountedVue 应用挂载到 DOM 后触发 (仅客户端)
app:error发生未捕获错误时触发
page:start页面导航开始时
page:finish页面导航结束时
ts
export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hook('app:mounted', () => {
    console.log('应用已挂载!')
  })
  
  nuxtApp.hook('page:start', () => {
    console.log('开始加载新页面...')
  })
})

2. Nitro 钩子 (Server)

这些钩子在服务端引擎 Nitro 中运行,用于处理请求、响应或渲染过程。

钩子名称说明
request收到新请求时
beforeResponse发送响应之前
render:html渲染 HTML 字符串之前,可用于注入 Meta 或 Script
ts
// server/plugins/logger.ts
export default defineNitroPlugin((nitroApp) => {
  nitroApp.hooks.hook('request', (event) => {
    console.log('收到请求:', event.path)
  })
})

3. Build 钩子 (Build Time)

主要在 nuxt.config.ts 或模块中使用,影响构建过程。

钩子名称说明
build:before构建开始前
pages:extend扩展或修改路由表
components:dirs扩展组件自动导入目录

实战:使用钩子注入脚本

假设我们需要在每个页面的 <head> 中注入一段统计脚本:

ts
// nuxt.config.ts
export default defineNuxtConfig({
  hooks: {
    'app:created'(vueApp) {
      // 运行时修改
    },
    'pages:extend'(pages) {
      // 动态添加一个测试路由
      pages.push({
        name: 'test-hook',
        path: '/test-hook',
        file: '~/pages/index.vue'
      })
    }
  }
})

Released under the MIT License.