阿里微前端qiankun框架基本介绍与应用配置,包含基座与子应用间通信

news2024/10/8 12:11:44

搭建配置qiankun

qiankun官网

什么是微前端

微前端是一种多个团队通过独立发布功能的方式来共同构建现代化 web 应用的技术手段及方法策略。
优点:

  • 与技术栈无关
  • 独立开发、独立部署,部署完成后主框架自动同步更新
  • 增量升级,兼容老项目
  • 每个微应用之间状态隔离

方案

  • iframe:通过iframe标签嵌入父应用
    url不同步,刷新页面时路由丢失;全局上下文隔离;window对象不一致;加载速度慢

  • single-spa:单页面应用,url改变时进行匹配
    没有实现js隔离和css隔离;需求修改大量配置

  • qiankun:基于single-spa封装,提供API;和技术栈无关;使用方便;实现了js隔离和css隔离;资源预加载,浏览器空闲时间预加载未打开的资源应用

基座

  1. 安装qiankun pnpm i qiankun
  2. main.js中进行改造
//main.js
import './assets/main.scss'

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import { registerMicroApps, start } from 'qiankun'

import App from './App.vue'
import router from './router'

const app = createApp(App)

app.use(createPinia())
app.use(router)

app.mount('#app')

registerMicroApps(
  [
    {
      name: 'vue-app-1', // 必须与微应用注册名字相同
      entry: 'http://localhost:9001', // 入口路径,开发时为微应用所启本地服务,上线时为微应用线上路径
      container: '#sub-app', // 微应用挂载的节点
      activeRule: '/vue-app-1', // 当访问路由为 /micro-vue 时加载微应用
      props: {
        msg: '我是来自主应用的值-vue' // 主应用向微应用传递参数
      },
      pathPrefix: '/vue-app-1' // 使用 pathPrefix 自动添加前缀
    }
    //   {
    //     name: 'react-app',
    //     entry: 'http://127.0.0.1:5175',
    //     container: '#react-app-container',
    //     activeRule: '/micro-react',
    //     props: {
    //       msg: '我是来自主应用的值-react',
    //     },
    //   },
  ]
  //   {
  //     // 生命周期钩子函数
  //     beforeLoad: (app) => {
  //       console.log('beforeLoad', app)
  //     },
  //     beforeMount: (app) => {
  //       console.log('beforeMount ', app)
  //     },
  //     afterMount: (app) => {
  //       console.log('afterMount', app)
  //     },
  //     beforeUnmount: (app) => {
  //       console.log('beforeUnmount ', app)
  //     },
  //     afterUnmount: (app) => {
  //       console.log('afterUnmount', app)
  //     },
  //   }
)

//step3 设置默认进入微应用
//setDefaultMountApp('/vue3')

start() //启动微应用
  1. 在App.vue或其他位置挂载容器
<!-- 子应用渲染区域 -->
<div id="sub-app"></div>

子应用

安装插件 pnpm i vite-plugin-qiankun

  1. 修改vite.config.js内容
import { fileURLToPath, URL } from 'node:url'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import qiankun from 'vite-plugin-qiankun'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    AutoImport({
      resolvers: [ElementPlusResolver()]
    }),
    Components({
      resolvers: [ElementPlusResolver()]
    }),
    qiankun('vue-app-1', {
      // 微应用名字,与主应用注册的微应用名字保持一致
      useDevMode: true
    })
  ],
  // 需要和基座中配置的activeRule一致
  base: '/vue-app-1',
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  },
  //建议设定固定的端口号,方便基座使用
  server: {
    open: true,
    port: 9001,
    cors: true
  }
})
  1. 修改main.js内容
import { createApp } from 'vue'
import App from './App.vue'
import router from './router' // 导入路由配置
import {
  renderWithQiankun,
  qiankunWindow
} from 'vite-plugin-qiankun/dist/helper'
import { createPinia } from 'pinia'
const app = createApp(App)

app.use(router) // 使用 Vue Router
app.use(createPinia())
// 清理容器
function clearContainer(container) {
  while (container.firstChild) {
    container.removeChild(container.firstChild)
  }
}

const render = (props = {}) => {
  const { container } = props
  const appElement =
    container?.querySelector('#app') || document.getElementById('app')

  // 确保容器为空
  if (appElement) {
    clearContainer(appElement)
  }

  createApp(App).use(router).mount(appElement)
}

const initQianKun = () => {
  renderWithQiankun({
    bootstrap() {
      console.log('微应用:bootstrap')
    },
    mount(props) {
      // 获取主应用传入数据
      console.log('微应用:mount', props)
      render(props)
    },
    unmount(props) {
      console.log('微应用:unmount', props)
    },
    update(props) {
      console.log('微应用:update', props)
    }
  })
}

// 判断是否使用 qiankun ,保证项目可以独立运行
qiankunWindow.__POWERED_BY_QIANKUN__ ? initQianKun() : render()

主应用与子应用通信

  1. 使用initGlobalState进行通信
    基座在src中新建个action.js文件
// 此action文件为定义微应用之间全局状态
// 引入qiankun的应用间通信方法initGlobalState
import { initGlobalState } from 'qiankun'

const initialState = {
  //这里可以写初始化数据
  // x:1
  project_id: 'woq'
}

const actions = initGlobalState(initialState) //初始化state

export default actions

基座在main.js中引入action.js文件

import actions from '@/action.js'

registerMicroApps(
  [
    {
      name: 'vue-app-1',
      entry: '//localhost:9001',
      container: '#sub-app',
      activeRule: '/vue-app-1',
      props: {
        data: 'child子应用',
        mainAppRouter: history,
        router,
        //这里添加
        actions
      },
      pathPrefix: '/vue-app-1' // 使用 pathPrefix 自动添加前缀
    }
  ]
)

子应用也在src中新建一个action.js文件

function emptyAction() {
  // 警告:提示当前使用的是空 Action
  console.warn('Current execute action is empty!')
}

// 我们首先设置一个用于通信的Actions类

class Actions {
  actions = {
    onGlobalStateChange: emptyAction,
    setGlobalState: emptyAction
  }
  constructor() {}
  // 默认值为空Action

  // 设置actions
  setActions(actions) {
    this.actions = actions
  }

  // 映射
  onGlobalStateChange(...args) {
    return this.actions.onGlobalStateChange(...args)
  }
  // 映射
  setGlobalState(...args) {
    return this.actions.setGlobalState(...args)
  }
}

const actions = new Actions()
export default actions

子应用在main.js文件中的mounted函数中挂载actions

actions.setActions(props)

子应用就可以在页面中使用基座传来的数据了

import actions from '../../action'
const projectId = ref('')
onMounted(() => {
  actions.onGlobalStateChange((state) => {
    projectId.value = state.project_id
    console.log(state)
  }, true) //onGlobalStateChange的第二个参数设置为true,则会立即触发一次观察者函数
  console.log('-------------------------')
  console.log(projectId.value)
})

基座如果要在页面中更改值也很简单,直接调用actions的setGlobalState方法即可

actions.setGlobalState({
  userInfo: res.body
})

如果要在基座的某个页面中使用子应用

参考官网

  1. 基座的router/index.js中这样写
//其中user-center为子应用的路由
{
  path: '/user-center/:pathMatch(.*)*',
  component: () => import('@/views/LayoutContainer/LayoutContainer.vue')
}

  1. 对应的LayoutContainer文件中写启动子应用
    注意:就要对应删调main.js中的start()方法
import { start } from 'qiankun'
onMounted(() => {
  //启动子应用
  if (!window.qiankunStarted) {
    window.qiankunStarted = true
    start()
  }
})

然后在该页面中需要的地方引入子应用

<!-- 子应用 -->
<div id="sub-app"></div>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2196317.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年开放式蓝牙耳机品牌排行榜前十名,五个超实用开放式耳机品牌分享

​开放式耳机目前非常流行&#xff0c;它们以时尚、美观和舒适著称&#xff0c;迅速赢得了众多用户的喜爱&#xff0c;成为了耳机市场的新宠。与传统的入耳式耳机相比&#xff0c;开放式耳机佩戴更稳固&#xff0c;对耳朵也更为温和。尽管有些人认为它们价格不菲&#xff0c;甚…

【生命之光再启航】开颅术后苏醒之谜:揭秘康复之旅的时间窗

在医学的浩瀚星空中&#xff0c;开颅手术无疑是一颗璀璨而又充满挑战的星辰。它以其高风险、高技术含量&#xff0c;成为治疗颅脑疾病不可或缺的重要手段。然而&#xff0c;对于患者及家属而言&#xff0c;手术虽已完成&#xff0c;但“做完开颅手术多久能醒&#xff1f;”这一…

Ollama本地部署自定义大模型

Ollama本地部署自定义大模型 1. Ollama安装2. 模型选择3. Ollama使用3.1 创建模型3.2 运行模型-命令行3.3 运行模型-接口 4. 其他有用命令参考链接 Ollama是一个专为本地机器设计的开源框架&#xff0c;旨在简化大型语言模型&#xff08;LLM&#xff09;的部署和运行过程。它提…

AWS EC2 部署Echarts大屏展示项目

前言 Echarts简介 ECharts是一个由JavaScript开发的开源可视化库。它能使数据生动、直观、互动、高度个性化数据可视化图表。ECharts适用大部分浏览器&#xff0c;如IE6 、Chrome、Firefox、Safari等&#xff0c;同时支持PC和移动设备。 开源&#xff1a;ECharts是一个开源项目…

大模型RAG:文档分块方案与RAG全流程

一 RAG与文本分块 1.1 为什么要文档分块 我们知道&#xff0c;大模型在预训练阶段获取的知识是有限的&#xff0c;一般需要数据增强模块引入外部知识库&#xff0c;通过知识检索的方式搜索于用户提问相关的知识&#xff0c;这也是RAG相关应用架构出现的原因。但这又引申出另一…

一个简单的将产品图册转换为翻页电子产品图册的方法

​在数字化浪潮席卷全球的今天&#xff0c;企业纷纷寻求转型&#xff0c;纸质产品图册逐渐被翻页电子图册所替代。电子图册不仅具有环保、便捷、易于更新等优势&#xff0c;还能为企业节省大量印刷和物流成本。那么&#xff0c;如何将现有的实体产品图册转化为翻页电子图册呢 1…

YOLO11改进|注意力机制篇|引入反向残差移动快iRMB

目录 一、【iRMB】注意力机制1.1【iRMB】注意力介绍1.2【iRMB】核心代码 二、添加【iRMB】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【iRMB】注意力机制 1.1【iRMB】注意力介绍 反向残差移动快iRMB结构如下所示&#xf…

「Ubuntu」根目录存储空间不足

Linux系统不同于 Windows系统&#xff0c;复杂的文件系统常常让人头疼&#xff0c;特别是动不动就存储空间不足&#xff0c;简单的清空回收站根本不管用&#xff0c;在此推荐一个绝对好用的方法&#xff0c;并且还可以多学习一条 Linux命令 1、du 使用方法 通过使用命令 du&am…

LabVIEW激光诱导击穿光谱识别与分析系统

LabVIEW激光诱导击穿光谱&#xff08;LIBS&#xff09;分析系统利用高能量脉冲激光产生高温等离子体&#xff0c;通过分析等离子体发出的光谱来定性分析样品中的元素种类。该系统的开发集成了软件与硬件的设计&#xff0c;实现了自动识别和定性分析功能&#xff0c;适用于环境监…

华为OD机试 - 优雅子数组 - 暴力枚举(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

哦豁!有了这份学习路径,AI小白也能学懂大模型!!

小白如何规划大模型学习路径&#xff1f;&#xff1f; 元仔有求必应&#xff0c;为各位同学整理出一份完整的大模型学习路径规划&#xff01; 初识大模型&#xff1a;概念与趋势 首先&#xff0c;AI小白应从基础出发&#xff0c;理解什么是大模型。 大模型&#xff0c;顾名…

LeetCode讲解篇之98. 验证二叉搜索树

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们可以通过递归搜索的方式查询某棵树是不是二叉搜索树&#xff0c;二叉搜索树需要满足的最小值与最大值的约束并且左子树和右子树都是二叉搜索树或者当前节点为空&#xff0c;以当前节点为根节点的树才是二叉搜…

WPF中的布局

布局原则 1、不显式设置元素大小。 2、不使用绝对定位。 元素应该根据容器的内容来进行排列。绝对定位在开发前期会带来一些便捷&#xff0c;但扩展性比较差。一旦显示器尺寸或分辨率发生改变&#xff0c;界面的显示效果可能会达不到预期的效果。 3、布局容器可以嵌套使用 常…

Django 5 用后台admin 做一个简单 DIY 电脑组装报价系统

1. 注意点 合计价格 admin.register(ComputerConfiguration) class ComputerConfigurationAdmin(admin.ModelAdmin):inlines [ConfigurationComponentInline]list_display (config_id, user_id, config_name, total_price, total_jh_price, total_selling_price)list_display…

碰撞检测 | 图解视线生成Bresenham算法(附ROS C++/Python/Matlab实现)

目录 0 专栏介绍1 Bresenham算法介绍2 图解Bresenham算法3 算法流程4 仿真实现4.1 ROS C实现4.2 Python实现4.3 Matlab实现 0 专栏介绍 &#x1f525;课设、毕设、创新竞赛必备&#xff01;&#x1f525;本专栏涉及更高阶的运动规划算法轨迹优化实战&#xff0c;包括&#xff…

HarmonyOS Next元服务开发快速入门案例

项目代码gitee地址&#xff1a; (HarmonyOS Next 元服务开发快速入门: HarmonyOS Next 元服务开发快速入门 - Gitee.com) 开源协议使用&#xff1a;Apache License 2.0 &#xff0c;代码包支持免费使用&#xff0c;可进行二次开发后选择开源或闭源。 一、创建项目 1.创建项目&…

大学生社团活动系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;社长管理&#xff0c;社团分类管理&#xff0c;社团信息管理&#xff0c;社团加入管理&#xff0c;社团活动管理&#xff0c;轮播图信息 微信端账号功能包括&#xff1a;系统首页…

基于SpringBoot vue3 的山西文旅网java网页设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm springcloud等开发框架&#xff09; vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作☆☆☆ 精彩专栏推荐订阅☆☆☆☆…

项目完整开发的流程

流程 1.设计产品 2.写需求文档 2.1需求分析&#xff0c;后端设计数据库&#xff0c;建表&#xff0c;客户沟通&#xff0c;说完签字&#xff0c;留证据&#xff0c;防止后面扯皮&#xff0c;和防止后续变需求重新写业务 3.画原型图&#xff0c;也就是草图&#xff0c;初始的…

LeetCode讲解篇之2466. 统计构造好字符串的方案数

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 组成长度为i的字符串个数 组成长度为i - zero的字符串个数 组成长度为i - one的字符串个数 设数组f中i号元素的值为组成长度为i的字符串个数 则状态转移方程为f[i] f[i - zero] f[i - one]&#xff0c;其中需…