微前端之微前端生命周期

除了主子应用的生命周期外,微前端也有自己的生命周期。本文将分别介绍微前端生命周期的执行时机以及微前端生命周期的勾子函数。

执行时机

在文章 微前端之注册子应用与路由拦截 中介绍路由拦截的时候,提到过 turnApp 函数,当时只是简单的打印了一行 log。

js 复制代码
export const turnApp = async () => {
  if (isTurnChild()) {
    console.log('路由切换了');
  }
}

其实微前端的生命周期就是在这里执行的,入口函数是 lifeCycle

js 复制代码
export const turnApp = async () => {
  if (isTurnChild()) {
    // 微前端的生命周期执行
    await lifeCycle()
  }
}

勾子函数

在介绍勾子函数之前,让我们先对 isTurnChild 函数做个小修改。主要是添加了全局变量 __ORIGIN_APP__ 来保存跳转前的上一个子应用。

js 复制代码
// 子应用是否做了切换
export const isTurnChild = () => {
  // __ORIGIN_APP__ 上一个子应用
  // __CURRENT_SUB_APP__ 要跳转到的子应用
  window.__ORIGIN_APP__ = window.__CURRENT_SUB_APP__
  if (window.__CURRENT_SUB_APP__ === window.location.pathname) {
    return false
  } 
  const currentApp = window.location.pathname.match(/(\/\w+)/) // /vue3 /react15
  if (!currentApp) return
  window.__CURRENT_SUB_APP__ = currentApp[0]  
  return true
}

接着重点看下 lifeCycle 函数的实现。

js 复制代码
// 类比 currentApp 函数,只不过筛选方式不同,一个是 pathname,一个是路由
export const findAppByRoute = (router) => {
  return filterApp('activeRule', router)
}

export const lifeCycle = async () => {
  // 获取到上一个子应用
  const prevApp = findAppByRoute(window.__ORIGIN_APP__)
  // 获取到要跳转到的子应用
  const nextApp = findAppByRoute(window.__CURRENT_SUB_APP__)
  if (!nextApp) return
  if (prevApp && prevApp.destroyed) {
    await destroyed(prevApp)
  }
  const app = beforeLoad(nextApp)
  await mounted(app)
}

lifeCycle 函数主要做两件事情:

  1. 销毁上一个子应用
  2. 加载要跳转到的子应用

从代码中不难发现微前端有三个生命周期勾子函数:

beforeLoad

js 复制代码
export const runMainLifeCycle = async (type) => {
  const mainLife = getMainLifeCycle()
  await Promise.all(mainLife[type].map(async item => await item()))
}

// 微前端生命周期-beforeLoad
export const beforeLoad = async (app) => {
  // 对应的执行主应用的生命周期
  await runMainLifeCycle('beforeLoad')
  app && app.beforeLoad && app.beforeLoad()
  const appContext = null
  return appContext
}

mounted

js 复制代码
// 微前端生命周期-mounted
export const mounted = async (app) => {
  app && app.mounted && app.mounted()
  // 对应的执行主应用的生命周期
  await runMainLifeCycle('mounted')
}

destroyed

js 复制代码
// 微前端生命周期-mounted
export const destroyed = async (app) => {
  app && app.destroyed && app.destroyed()
  // 对应的执行主应用的生命周期
  await runMainLifeCycle('destroyed')
}
相关推荐
夏幻灵2 小时前
HTML5里最常用的十大标签
前端·html·html5
程序猿追2 小时前
昇腾算力之锚:深度解读 CANN ascend-toolkit 异构计算架构与工程实践
架构
一枕眠秋雨>o<2 小时前
深入 CANN ops-nn:昇腾 NPU 算子开发的工程化实践与架构哲学
架构
Mr Xu_2 小时前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js
未来龙皇小蓝2 小时前
RBAC前端架构-01:项目初始化
前端·架构
程序员agions2 小时前
2026年,微前端终于“死“了
前端·状态模式
island13142 小时前
CANN Catlass 算子模板库深度解析:高性能 GEMM 架构、模板元编程与融合算子的显存管理策略
人工智能·神经网络·架构·智能路由器
万岳科技系统开发2 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
程序员猫哥_3 小时前
HTML 生成网页工具推荐:从手写代码到 AI 自动生成网页的进化路径
前端·人工智能·html
龙飞053 小时前
Systemd -systemctl - journalctl 速查表:服务管理 + 日志排障
linux·运维·前端·chrome·systemctl·journalctl