qiankun 结合 vue3, 小白快速上手体验

一、主应用改造

首先需要维护一份微应用列表,里面包含了微应用的名称、入口和生效规则,若需要给子应用传递内容,可以在 props 传入对应的内容

// app.js
const apps = [{name: 'micro-vue-app3',entry: '//localhost:3013',container: '#micro-vue-app3',activeRule: '/micro-vue3-app3',props: {},},
]export default apps

有了微应用数据后,我们就开始注册微应用

// micro.jsimport { registerMicroApps, addGlobalUncaughtErrorHandler, start } from "qiankun"import apps from "./app"/** 注册微应用 */
registerMicroApps(apps, {// 微应用加载前beforeLoad: (app) => {console.log("before-load", app.name)return Promise.resolve()},beforeMount: (app) => {console.log("before mount", app)return Promise.resolve()},afterMount: (app) => {console.log("after mount", app.name)return Promise.resolve()}
})addGlobalUncaughtErrorHandler((event: Event | string) => {console.error(event)const { message: msg } = event as anyif (msg && msg.includes("died in status LOADING_SOURCE_CODE")) {console.error("微应用加载失败,请检查应用是否可运行")}
})export default start

接下来,我们在项目的入口文件中启动微前端。

import { createApp } from 'vue'
import router from './router'
import startQiankun from './micro'
import App from './App.vue'// start()
startQiankun({sandbox: {experimentalStyleIsolation: true, // 样式隔离},
})const app = createApp(App)
app.use(router)app.mount('#app')

二、子应用改造

vue3 项目创建方式分为 vue-cli 创建和 vite 创建,vue-cli 底层是 webpack,两种方式创建的项目的改造内容不太一样,接下来便为各位介绍一下改造点。

vue-cli 创建 vue3 子应用

vue.config.js 配置,需要将输出文件格式改成 umd 库格式

const { defineConfig } = require('@vue/cli-service')
const { name } = require('./package.json')
module.exports = defineConfig({transpileDependencies: true,devServer: {port: 3013,headers: {'Access-Control-Allow-Origin': '*',},},configureWebpack: {output: {library: `${name}-[name]`,libraryTarget: 'umd', // 把微应用打包成 umd 库格式},},
})

创建 public-path.ts文件,动态设置 webpack publicPath 防止资源报错

if (window.__POWERED_BY_QIANKUN__) {// 动态设置 webpack publicPath,防止资源加载出错// eslint-disable-next-line no-undef__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__
}

main.js需要区分独立运行还是子应用运行

import './public-path'
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'let instance = nullfunction render(props = {}) {const { container } = propsinstance = createApp(App)instance.use(router)instance.use(store)instance.mount(container ? container.querySelector('#app') : '#app')
}// 非乾坤环境
if (!window.__POWERED_BY_QIANKUN__) {render()
}
export async function bootstrap() {console.log('初次注册================')console.log('[vue] vue app bootstraped')
}export async function mount(props) {console.log('挂载子应用==============vue3-app')console.log(props)render(props)instance.config.globalProperties.$onGlobalStateChange = props.onGlobalStateChangeinstance.config.globalProperties.$setGlobalState = props.setGlobalState
}export async function unmount() {console.log('子应用卸载==========')instance.unmount()instance._container.innerHTML = ''instance = null
}

vite 创建 vue3 子应用

vite 若要用在 qiankun 微前端,需要安装 vite-plugin-qiankun 插件支持,并修改 vite.confit.ts配置:

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(),qiankun('vite-vue3-app3', {useDevMode: true,}),],server: {port: 7001,headers: {'Access-Control-Allow-Origin': '*',},},
})

main.ts文件中,需要引入 renderWithQiankunqiankunWindow

// @ts-nocheck
import { createApp } from 'vue'
import router from './router'
import App from './App.vue'
import actions from './shared/action'
import { renderWithQiankun, qiankunWindow } from 'vite-plugin-qiankun/dist/helper'let appfunction render(props) {if (props) {// 注入 actions 实例actions.setActions(props)}const { container } = propsapp = createApp(App)app.use(router)app.mount(container ? container.querySelector('#app') : '#app')
}const initQianKun = () => {renderWithQiankun({/*** 应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法*/mount(props) {console.log('vite 应用挂载', props)const { container } = propsrender(props)},/*** bootstrap 只会在微应用初始化的时候调用一次,下次微应用重新进入时会直接调用 mount 钩子,不会再重复触发 bootstrap。* 通常我们可以在这里做一些全局变量的初始化,比如不会在 unmount 阶段被销毁的应用级别的缓存等。*/bootstrap() {console.log('vite-vue3 初始化')},/*** 应用每次 切出/卸载 会调用的方法,通常在这里我们会卸载微应用的应用实例*/unmount() {console.log('vite-vue3 卸载')app.unmount()},})
}qiankunWindow.__POWERED_BY_QIANKUN__ ? initQianKun() : render()

router路由的 window 对象也需要用 qiankunWindow 去替换:

import { createRouter, RouteRecordRaw, createWebHistory } from 'vue-router'
import { qiankunWindow } from 'vite-plugin-qiankun/dist/helper'
import HelloWorld from '../components/HelloWorld.vue'
import Text from '../components/Text.vue'const routes: Array<RouteRecordRaw> = [{ path: '/', name: 'Home', component: HelloWorld, children: [{ path: 'text', name: 'Text', component: Text }] }]
const base = qiankunWindow.__POWERED_BY_QIANKUN__ ? '/vite-vue3-app3' : '/'const router = createRouter({history: createWebHistory(base),routes,
})export default router

三、Actions 通信

qiankun 内部提供了 initGlobalState 方法用于注册 MicroAppStateActions 实例用于通信,该实例有三个方法,分别是:

  • setGlobalState:设置 globalState - 设置新的值时,内部将执行 浅检查,如果检查到 globalState 发生改变则触发通知,通知到所有的 观察者 函数。
  • onGlobalStateChange:注册 观察者 函数 - 响应 globalState 变化,在 globalState 发生改变时触发该 观察者 函数。
  • offGlobalStateChange:取消 观察者 函数 - 该实例不再响应 globalState 变化。
import { initGlobalState, MicroAppStateActions } from 'qiankun'const initialState = {}
const actions = initGlobalState(initialState)const actions = actions.setGlobalState({userInfo: { name: '改变用户', ssga: '2515' },age: ++currentAge.value,
})// onGlobalStateChange 第二个参数为 true,表示立即执行一次观察者函数
actions.onGlobalStateChange((state) => {console.log(state, 'state')const { userInfo, age } = statecurrUserInfo.value = userInfocurrentAge.value = age
}, true)

四、总结

本文介绍了 vue3 接入 qiankun 的方法,希望有助于个人初次上手了解。也有些人认为 vue3 结合 vite 的话,使用无界的方法会更好,有时间也会去看看如何使用,欢迎各位友好交流讨论!

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

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

相关文章

再谈kettle两种循环之--调用http分页接口循环获取数据

再谈kettle两种循环之 – 调用http分页接口循环获取数据 1.场景介绍&#xff1a; 由于数据量比较大,接口有返回限制,需要用到循环分页获取数据 2.案例适用范围&#xff1a; 循环job可参考&#xff0c;变量运用可参考&#xff0c;调用http分页接口循环获取数据可参考&#…

SQLServer2022新特性 GENERATE_SERIES函数

SQLServer2022新特性 GENERATE_SERIES函数&#xff0c;在给定间隔内生成一系列数字。 序列值之间的间隔和步骤由用户定义。 参考官方地址 https://learn.microsoft.com/en-us/sql/t-sql/functions/generate-series-transact-sql?viewsql-server-ver16 1、本文内容 语法参数…

国产操作系统上多种压缩和解压命令详解 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统上多种压缩和解压命令详解 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在国产操作系统上多种压缩和解压命令详解的文章。压缩和解压缩是我们在日常工作中经常需要进行的操作&#xff0c;尤其是在处理大…

【AIGC】用 AI 绘画 诠释印象派!关键词、安装包分享!

前言 印象派艺术运动是19世纪60年代法国的一场艺术革命&#xff0c;它不仅革新了绘画技法&#xff0c;更重新诠释了光与色彩、自然与美。印象派艺术家&#xff0c;如莫奈、雷诺阿和德加&#xff0c;通过捕捉自然光线的瞬息变化&#xff0c;用色彩和笔触表达对现实世界的独特感…

Theta方法:一种时间序列分解与预测的简化方法

Theta方法整合了两个基本概念:分解时间序列和利用基本预测技术来估计未来的价值。 每个数据科学爱好者都知道&#xff0c;时间序列是按一定时间间隔收集或记录的一系列数据点。例如&#xff0c;每日温度或经济指标的月值。把时间序列想象成不同成分的组合&#xff0c;趋势(数据…

【linux/shell】shell中使用for循环读取数据

目录 一.for循环从列表中读取数据的几种形式 二.for循环从配置文件读取数据 三.for循环用通配符读取目录 四.for循环带有数字变量 一.for循环从列表中读取数据的几种形式 #!/bin/bash listl"aa bb cc" list2aa bb ccfor i in $list3 doecho $i done 使用这种形…

取证工作:怎样解锁 LUKS2 加密磁盘?

对于 LUKS2 密码进行恢复&#xff0c;Elcomsoft Distributed Password Recovery &#xff08;简称 EDPR&#xff09; 软件可以构建高性能集群&#xff0c;以更快地破解密码。EDPR 软件提供零开销的可扩展性&#xff0c;并支持 GPU 加速&#xff0c;以加快恢复速度。EDPR 可帮助…

Redis-实战篇-编码解决商铺查询的缓存穿透问题(缓存空对象)

文章目录 1、缓存穿透2、常见的解决方案有两种&#xff1a;2.1、缓存空对象2.2、布隆过滤器 3、编码解决商铺查询的缓存穿透问题3.1、queryById3.2、RedisConstants.java 1、缓存穿透 缓存击穿是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效…

Spring Boot中使用Feign进行HTTP请求

Spring Boot中使用Feign进行HTTP请求 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨一下如何在Spring Boot中使用Feign进行HTTP请求。 一、Fei…

【b站-湖科大教书匠】3 数据链路层-计算机网络微课堂

课程地址&#xff1a;【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;】 https://www.bilibili.com/video/BV1c4411d7jb/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 3 数据链路层 3.1 数据链路层概述 3.1.1 数据链路层在网络体系结…

2024华为数通HCIP-datacom最新题库(变题更新⑤)

请注意&#xff0c;华为HCIP-Datacom考试831已变题 请注意&#xff0c;华为HCIP-Datacom考试831已变题 请注意&#xff0c;华为HCIP-Datacom考试831已变题 近期打算考HCIP的朋友注意了&#xff0c;如果你准备去考试&#xff0c;还是用的之前的题库&#xff0c;切记暂缓。 1、…

Python的with语句与上下文管理器:深入解析与实战应用

Python的with语句与上下文管理器&#xff1a;深入解析与实战应用 在Python编程中&#xff0c;with语句是一个强大的特性&#xff0c;它提供了一种简洁的方式来管理资源&#xff0c;如文件、网络连接等。通过使用with语句&#xff0c;我们可以确保在代码块执行完毕后&#xff0…

Python中的enumerate函数:索引与值的完美搭档

Python中的enumerate函数&#xff1a;索引与值的完美搭档 在Python编程中&#xff0c;遍历列表、元组或其他可迭代对象时&#xff0c;我们经常会需要同时访问每个元素的索引和值。这时&#xff0c;enumerate()函数就显得尤为重要&#xff0c;它为我们提供了一个简洁而高效的方…

【项目管理体系】代码评审规范

1完整性检查 2一致性检查 3正确性检查 4可预测性检查 5健壮性检查 6结构性检查 7可追溯性检查 8可理解性检查 9可验证性检查 软件开发全套资料获取&#xff1a;&#xff08;本文末个人名片直接获取&#xff09; 软件产品&#xff0c;特别是行业解决方案软件产品不同于一般的商品…

JavaScript中常用数据类型做布尔值(Boolean)转换

一、前言 二、示例 1、String转Boolean 2、Number转Boolean 3、NaN、Null、undefined 转Boolean 4、Object转Boolean 5、Array转Boolean 6、Symbol转Boolean 三、总结 四、思考 一、前言 JavaScript中&#xff0c;经常需要对一些值进行boolean判断&#xff0c;根据判…

DDoS攻击的最新防御策略:从检测到缓解的全方位方案

在数字化浪潮的推动下&#xff0c;互联网已成为现代社会的血脉。然而&#xff0c;随着网络空间的不断膨胀&#xff0c;分布式拒绝服务&#xff08;DDoS&#xff09;攻击如同潜伏在暗处的猛兽&#xff0c;随时准备发动致命一击&#xff0c;威胁着网络的稳定与安全。面对这一严峻…

前端-echarts tooltip展示多项自定义数据

效果如图&#xff0c;鼠标滑动到某一个柱子的时候&#xff0c;出现这一项数据的多个自定义数据&#xff0c;外加自己的模板样式渲染。 希望能展示每一列中的多个自定义数据 代码部分 主要是在data中&#xff0c;value就是实际展示的主数据&#xff0c;其他字段名为自定义的数…

【面试系列】Swift 高频面试题及详细解答

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

ArUco 相关(opencv)

主要的问题还是随着opencv的版本升级&#xff0c;对aruco模块的函数命名变化挺大的&#xff0c;因此需要正确调用opencv对应版本下的aruco相关函数&#xff0c;不然程序无法运行&#xff0c;会报各种异常 在线ArUco工具 https://chev.me/arucogen/ 保存下来的是svg格式 环境 …

Linux常见操作问题

1、登录刚创建的用户&#xff0c;无法操作。 注&#xff1a;etc/passwd文件是Linux操作系统中存储用户账户信息的文本文件&#xff0c;包含了系统中所有用户的基本信息&#xff0c;比如用户名、用户ID、用户组ID、用户家目录路径。 注&#xff1a;etc: 这个目录存放所有的系统…