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-苟曰的老板不发工资230行原创js代码写个扫雷小游戏

    上gif: 1.开局提示动画 2.游戏中状态提示 3.开挂模式提示 4.计时器 5.游戏模式扫雷成功,蓝色进度条表示当次扫雷的完成度 6.若当次时间小于最佳记录,则更新最佳记录,如果最佳记录小于设置的 ...

  2. 老外为了在MacBook上玩原神,让M1支持了所有iOS应用 | Github每周精彩分享第一期

    大家好,这里是每周更新的Github有趣项目分享,我是每周都在吃瓜的蛮三刀酱. 我会从Github热门榜里选出 高质量.有趣,牛B 的开源项目进行分享. 废话不多说,看看最近有什么有意思的Github ...

  3. 【爬虫案例】用Python爬取抖音热榜数据!

    目录 一.爬取目标 二.编写爬虫代码 三.同步讲解视频 3.1 代码演示视频 四.获取完整源码 一.爬取目标 您好,我是@马哥python说,一名10年程序猿. 本次爬取的目标是:抖音热榜 共爬取到5 ...

  4. centos 7 开启 httpd 服务和 80 端口

    centos 7 开启 httpd 服务和 80 端口 yum install -y httpd systemctl start httpd firewall-cmd --add-service=ht ...

  5. GOLANG-配置nginx反向代理端口 配置域名

    目录 配置/etc/nginx/nginx.conf文件 新建/etc/nginx/conf.d/doc.haimait.conf文件 重启nginx服务 解析自己的域名到服务器的公网ip 配置/et ...

  6. installshield 64位系统操作注册表遇到的问题

    最近在研究IS脚本设置jdk环境变量问题,在使用RegDBKeyExist判断注册表中项的时候一直找不到,翻找文档后发现64位的操作系统需要设置 REGDB_OPTIONS. "SOFTWA ...

  7. 2022年官网下安装ActiveMQ最全版与官网查阅方法

    目录 一.环境整合 构建工具(参考工具部署方式) 二.下载安装 1.百度搜索ActiveMQ,双击进入.或访问官网https://activemq.apache.org/ 2.进入下载界面,两种方式, ...

  8. openstack的用户(user), 租户(tenant), 角色(role)概念区分

    用户身份管理有三个主要的概念: 用户Users租户Tenants角色Roles1. 定义 这三个概念的openstack官网定义(点击打开链接) 1.1 用户(User) openstack官网定义U ...

  9. docker安装MySQL8.0.35主从复制(实战保姆级)

    很久没有记录了,今天有时间就记录一下最近安装遇到的问题 liunx安装docker这个是前提,就不多过述 1 准备两台服务器 10.104.13.139 10.104.13.140 2 确保liunx ...

  10. 本地项目文件上传到git

    初始化项目: git init 与服务器项目关联:git remote add origin "http://**************************/r/ruoyi.git&q ...