微前端之微前端生命周期

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

执行时机

在文章 微前端之注册子应用与路由拦截 中介绍路由拦截的时候,提到过 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')
}
相关推荐
小叶lr1 分钟前
jenkins打包前端样式丢失/与本地不一致问题
运维·前端·jenkins
Agent产品评测局5 分钟前
互联网行业自动化平台选型,运营全流程提效指南:2026企业级智能体架构与实战全解析
运维·人工智能·ai·chatgpt·架构·自动化
浩星7 分钟前
electron系列1:Electron不是玩具,为什么桌面应用需要它?
前端·javascript·electron
ZC跨境爬虫25 分钟前
Scrapy工作空间搭建与目录结构解析:从初始化到基础配置全流程
前端·爬虫·python·scrapy·自动化
小村儿29 分钟前
连载04-最重要的Skill---一起吃透 Claude Code,告别 AI coding 迷茫
前端·后端·ai编程
_院长大人_1 小时前
Vue + ECharts 实现价格趋势分析图
前端·vue.js·echarts
AI成长日志1 小时前
【AI原生开发实战】1.2 传统开发 vs AI原生开发:思维转变与架构差异
服务器·架构·ai-native
戮戮1 小时前
Spring Cloud Gateway 零拷贝参数校验:一种高性能网关架构实践
java·网络·架构·gateway
LONGZETECH1 小时前
汽车故障诊断仿真教学软件【哈弗M6PLUS】:技术架构、功能实现与落地实践
架构·汽车·职业教育·汽车仿真教学软件·汽车故障诊断
xinlianyq1 小时前
2026 边缘智能的崛起:端云协同架构下的“词元”调度艺术
人工智能·架构·api