title: Nuxt3 的生命周期和钩子函数(四)

date: 2024/6/28

updated: 2024/6/28

author: cmdragon

excerpt:

概述了Nuxt3的六个关键生命周期钩子用途:modules:before至build:before,指导如何在应用初始化、模块管理、配置解析、模板处理及构建前执行自定义操作,附带实例代码,强化Nuxt应用的灵活性和可控性。

categories:

  • 前端开发

tags:

  • Nuxt3
  • 生命周期
  • 钩子函数
  • 模块管理
  • 应用构建
  • 配置优化
  • 模板定制



扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

钩子:modules:before

参数:

  • nuxtApp: Nuxt 应用实例,提供核心 API 和应用配置访问。

环境:

  • 开发环境 (dev)
  • 生产环境 (prod)

描述:  modules:before 是 Nuxt.js 中的一个生命周期钩子,它在应用初始化阶段,且在安装用户自定义模块之前被调用。这个钩子允许开发者在模块安装前执行一些全局设置、数据准备或者进行必要的配置检查。

详细解释:

用法示例

要使用 modules:before,你需要创建一个 Nuxt 插件(plugins文件夹内),并使用defineNuxtPlugin 函数来定义这个钩子:

// plugins/my-plugin.js
export default defineNuxtPlugin((nuxtApp) => {
// 在这里编写你的代码
nuxtApp.$emit('my-plugin-event', 'Before modules installation'); // 例如,你可以设置全局变量或配置
nuxtApp.config.globalProperties.$myPluginValue = 'Initial value';
});

案例演示

下面是一个简单的案例,展示了如何在 modules:before 钩子中执行一些操作:

// plugins/my-plugin.js
export default defineNuxtPlugin((nuxtApp) => {
// 检查并设置全局变量
if (!nuxtApp.config.someGlobalVariable) {
nuxtApp.config.someGlobalVariable = 'Default value';
console.log('Setting default global variable');
} // 触发一个自定义事件
nuxtApp.$emit('my-plugin-event', 'Before modules'); // 如果是开发环境,添加额外的调试信息
if (process.env.NODE_ENV === 'development') {
console.log('Running in development mode');
}
});

在这个案例中,modules:before 钩子确保了全局变量的存在,触发了一个自定义事件,并根据环境提供不同的提示。这有助于确保模块安装前应用的状态是正确的。

钩子:modules:done

参数:

  • nuxtApp: Nuxt.js 应用实例,提供了与应用交互的接口。

环境:

  • Nuxt.js 初始化阶段
  • 在所有用户自定义模块(plugins 或 custom modules)安装并初始化后

描述:

modules:done 是 Nuxt.js 的生命周期钩子之一,它在所有模块(包括用户定义的模块和第三方模块)安装完成之后被调用。这个钩子允许开发者在所有模块都已经设置好之后执行一些后续操作,例如初始化某些功能或执行跨模块的检查。

详细解释与用法实例:

在 Nuxt 3 中,插件可以通过 defineNuxtPlugin 函数定义,并在其中使用 nuxtApp 实例的 $on 方法来监听 modules:done 钩子。以下是一个使用该钩子的插件示例:

// plugins/my-plugin.js
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.hook('modules:done', () => {
// 执行一些所有模块安装完成后的操作
console.log('所有模块已安装完成!');
// 这里可以执行一些逻辑,比如初始化全局状态或设置全局配置
});
});

实战案例demo:

以下是一个实战案例,其中我们使用 modules:done 钩子来确保所有模块加载完成后,执行一个检查所有模块是否正确配置的函数。

// plugins/check-modules.js
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.hook('modules:done', async () => {
// 检查是否所有必须的模块都已加载
const requiredModules = ['@nuxtjs/axios', 'nuxt-i18n'];
const loadedModules = nuxtApp.$options.nuxt.modules.map(module => module.name); const missingModules = requiredModules.filter(module => !loadedModules.includes(module)); if (missingModules.length > 0) {
console.error(`以下模块未加载:${missingModules.join(', ')}`);
} else {
console.log('所有必须的模块已加载!');
// 如果所有必须的模块都已加载,执行一些初始化操作
// 例如,初始化API服务
await nuxtApp.$axios.get('/api/initialize');
}
});
});

在这个案例中,我们定义了一个必须加载的模块列表 requiredModules,然后在 modules:done 钩子中检查这些模块是否已经加载。如果有缺失的模块,我们会在控制台中打印错误消息;如果所有模块都已加载,我们将执行一些初始化操作,例如调用一个API来初始化应用程序。

钩子:app:resolve

参数:

  • nuxtApp: Nuxt.js 应用实例,包含了应用的核心配置和功能。

环境:

  • Nuxt.js 初始化阶段
  • 在 nuxtApp 实例解析完成之后调用

描述:

app:resolve 是 Nuxt.js 的一个生命周期钩子,它在 Nuxt 应用实例解析完成,但可能还未完全初始化之前被调用。这个钩子适合在应用的配置被解析后执行一些操作,比如修改默认配置、添加全局中间件等。

详细解释与用法实例:

在 Nuxt 3 中,你可以使用 defineNuxtPlugin 函数定义插件,并在 app:resolve 钩子中进行配置修改。以下是一个简单的例子:

// plugins/my-plugin.js
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.hook('app:resolve', (resolve) => {
// 修改默认配置
resolve.options.someGlobalOption = 'myCustomValue'; // 添加全局中间件
resolve.addMiddleware('myMiddleware', (to, from, next) => {
console.log('Middleware executed before route change');
next();
});
});
});

实战案例demo:

在以下案例中,我们使用 app:resolve 钩子来添加一个全局的全局头部组件和修改路由守卫:

// plugins/global-config.js
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.hook('app:resolve', async (resolve) => {
// 添加全局头部组件
resolve.options.headComponents = ['~/components/global-header.vue']; // 修改路由守卫
resolve.options.router.beforeEach = (to, from, next) => {
console.log('Before each route:', to, from);
next();
};
});
});

在这个例子中,当 Nuxt 应用解析时,会自动添加全局头部组件 global-header.vue,并在所有路由跳转前执行我们自定义的路由守卫。这在全局配置或者需要在所有页面共享的逻辑中非常有用。

钩子:app:templates

参数:

  • nuxtApp: Nuxt.js 应用实例,包含了应用的核心配置和功能。

环境:

  • Nuxt.js 应用生成过程中
  • 在 NuxtApp 的模板文件被处理之前调用

描述:

app:templates 是 Nuxt.js 的一个生命周期钩子,它允许开发者在 Nuxt 应用生成过程中自定义、修改或添加新的文件到构建目录。这个钩子可以用来添加自定义的模板文件,或者根据项目需求修改现有的模板。

钩子:app:templatesGenerated

钩子:build:before

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:Nuxt3 的生命周期和钩子函数(四) | cmdragon's Blog

往期文章归档:

Nuxt3 的生命周期和钩子函数(四)的更多相关文章

  1. Vue(3)- 安装脚手架、过滤器、生命周期的钩子函数、vue-router基本使用

    一.安装脚手架 1.下载node.js,本文下载版本为node-v8.12.0-x64.msi,一键式安装. 2.安装完成后,打开终端,输入node,可进入node环境(两次ctrl+c退出),如下图 ...

  2. Vue 3 --安装脚手架、过滤器、生命周期的钩子函数、vue-router基本使用

    一.安装脚手架 1.下载node.js,本文下载版本为node-v8.12.0-x64.msi,一键式安装. 2.安装完成后,打开终端,输入node,可进入node环境(两次ctrl+c退出),如下图 ...

  3. vue学习之生命周期和钩子函数

    参考文章:Vue2.0 探索之路——生命周期和钩子函数的一些理解 抛出问题: 我们有时候会在几个钩子函数里做一些事情,那么什么时候做,该在哪个函数里做? 生命周期简介 结合代码看el 和 data以及 ...

  4. vue生命周期、钩子函数

    https://segmentfault.com/a/1190000011381906    详解生命周期和钩子函数 每个vue实例再被创建之前都要经过一系列的初始化过程,这个过程就是vue的生命周期 ...

  5. vue教程2-01 vue生命周期、钩子函数

    vue教程2-01 vue生命周期.钩子函数 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  6. vue学习笔记(二)vue的生命周期和钩子函数

    前言 通过上一章的学习,我们已经初步的了解了vue到底是什么东西,可以干什么,而这一篇博客主要介绍vue的生命周期和它常用的钩子函数,如果有学过java的园友可能有接触到在学习servlet的时候学过 ...

  7. vue学习(五)生命周期 的钩子函数

    生命周期的钩子函数 主要有以下几种 beforeCreate created beforeMount mounted beforeUpdate updated activated deactivate ...

  8. [前端] VUE基础 (5) (过滤器、生命周期、钩子函数)

    一.过滤器 过滤器分为局部过滤器和全局过滤器. 1.局部过滤器 <body> <div id="app"> </div> <script ...

  9. Vue2.0 【第二季】第4节 Vue的生命周期(钩子函数)

    目录 Vue2.0 [第二季]第4节 Vue的生命周期(钩子函数) 第4节 Vue的生命周期(钩子函数) Vue2.0 [第二季]第4节 Vue的生命周期(钩子函数) 第4节 Vue的生命周期(钩子函 ...

  10. vue2.0项目实战(4)生命周期和钩子函数详解

    最近的项目都使用vue2.0来开发,不得不说,vue真的非常好用,大大减少了项目的开发周期.在踩坑的过程中,因为对vue的生命周期不是特别了解,所以有时候会在几个钩子函数里做一些事情,什么时候做,在哪 ...

随机推荐

  1. vue的pc端项目+element实现分页效果

    效果图: 直接使用element操作很简单,记录一下要点: 根据ele提供的api修改data v-for="(i,s) in dataView.slice((currentPage-1)* ...

  2. Docker部署Scrapy-redis分布式爬虫框架(整合Selenium+Headless Chrome网页渲染)

    前言 我的京东价格监控网站需要不间断爬取京东商品页面,爬虫模块我采用了Scrapy+selenium+Headless Chrome的方式进行商品信息的采集. 由于最近爬虫用的服务器到期,需要换到新服 ...

  3. Linux基础-02:Linux目录操作命令

    Linux中目前可以识别的命令有上万条,如果没有分类,那么学习起来一定痛苦不堪. 所以我们把命令分门别类,主要是为了方便学习和记忆. 下面我们先来学习最为常用的和目录相关的操作命令 最近无意间获得一份 ...

  4. 更新Homebrew时候遇到的问题

    问题描述: 更新Homebrew时候遇到无法访问github的问题,判定原因为DNS污Ran. fatal: unable to access 'https://github.com/Homebrew ...

  5. VMware之系统复制

    目录 功能描述 复制centos7-1文件夹 载入复制的系统 设置配置 启动系统 修改网卡配置 刷新配置 测试上网 功能描述 复制已经安装好的centOs7.6 复制centos7-1文件夹 1.系统 ...

  6. rpc 和 http的区别

  7. 一图明白ACHI,SATA之间的关系

    从上图中可以看到,SATA与PCI-E不仅可以指代物理的接口,还可以指代物理接口使用的传输协议. M.2物理接口可以使用SATA.PCI-E传输协议. U.2可以使用PCI-E传输协议.在网上搜了一下 ...

  8. Android Framework学习之系统启动流程

    最近抽空看了framework一些内存,总结一下,留作后续回顾复习

  9. AIRIOT答疑第6期|如何使用二次开发引擎?

    ​​灵活扩展,满足客户定制化需求   AIRIOT物联网低代码平台提供丰富的前端.后台服务二次开发接口,具备灵活的组件服务部署与管理能力,对任何功能模块进行二次开发,满足客户各类二次开发需求.支持多种 ...

  10. 如此丝滑的API设计,用起来真香

    分享是最有效的学习方式. 博客:https://blog.ktdaddy.com/ 故事 工位上,小猫一边撸着代码,一边吐槽着前人设计的接口. 如下: "我艹,货架模型明明和商品SKU模型是 ...