微前端(qiankun)

el/2024/5/3 13:13:33

什么是微前端

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

微前端架构旨在解决单体应用在一个相对长的时间跨度下,由于参与的人员、团队的增多、变迁,从一个普通应用演变成一个巨石应用(Frontend Monolith)后,随之而来的应用不可维护的问题。这类问题在企业级 Web 应用中尤其常见。

微前端架构具备以下几个核心价值:

  • 技术栈无关
    主框架不限制接入应用的技术栈,微应用具备完全自主权
  • 独立开发、独立部署
    微应用仓库独立,前后端可独立开发,部署完成后主框架自动完成同步更新
  • 增量升级
    在面对各种复杂场景时,我们通常很难对一个已经存在的系统做全量的技术栈升级或重构,而微前端是一种非常好的实施渐进式重构的手段和策略
  • 独立运行时
    每个微应用之间状态隔离,运行时状态不共享

qiankun - 一套完整的微前端解决方案

特性
在这里插入图片描述

  • 基于 single-spa 封装,提供了更加开箱即用的 API。
  • 技术栈无关,任意技术栈的应用均可 使用/接入,不论是 React/Vue/Angular/JQuery 还是其他等框架。
  • HTML Entry 接入方式,让你接入微应用像使用 iframe 一样简单。
  • 样式隔离,确保微应用之间样式互相不干扰。
  • JS 沙箱,确保微应用之间 全局变量/事件 不冲突。
  • 资源预加载,在浏览器空闲时间预加载未打开的微应用资源,加速微应用打开速度。

搭建微前端项目

主应用

主应用与技术栈无关,我们可以使用Vue、React、Angular、JQuery甚至ES5语法进行搭建。主应用的目的如下:

  1. 注册微应用;
  2. 为每个微应用提供dom容器;
  3. 启动主应用;

下面我是以vue为主应用一步一步进行讲解,先使用vue-cli3构建项目。

1.安装qiankun

$ npm install qiankun

2.注册微应用
在入口文件main.js中添加如下代码:

import { registerMicroApps, start, setDefaultMountApp } from 'qiankun'
//注册应用
registerMicroApps([{name: "vue2App",props: { age: 10 }, //给子应用传数据entry: "//localhost:3001", //默认会加载这个html,解析里面的js,动态执行(子应用必须支持跨域)里面,是用fetch去请求的数据container: "#out-main", //挂载到主应用的哪个元素下activeRule: "/vue2", //当我劫持到路由地址为/vue2时,我就把http://localhost:3000这个应用挂载到#app-main的元素下},{name: "vue3App",entry: "//localhost:3002",// entry: { scripts: ["//localhost:7100/main.js"] },container: "#out-main",activeRule: "/vue3",},
]);//step3 设置默认进入微应用
//setDefaultMountApp('/vue3')//开启
start();

微应用

微应用不用额外安装qiankun即可接入主应用,大致分为下面几个步骤:

  1. 入口js文件平级目录下增加public-path.js文件;
  2. 入口js文件中引入public-path.js,修改并导出qiankun定义的三个钩子函数:bootstrap、mount、unmount;
  3. 使用history路由,并且路由base值要和activeRule匹配规则保持一致;
  4. 修改webpack配置,允许开发环境跨域及umd打包;

下面我们以vue cli3作为技术栈构建微应用
在src下增加public-path.js
qiankun 将会在微应用 bootstrap 之前注入一个运行时的 publicPath 变量,你需要做的是在微应用的 entry js 的顶部添加如下代码

if (window.__POWERED_BY_QIANKUN__) {__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}

关于运行时 publicPath 的技术细节,可以参考 webpack 文档。

runtime publicPath 主要解决的是微应用动态载入的 脚本、样式、图片 等地址不正确的问题。

修改入口文件main.js

let instance = null;
function render(props = {}) {const { container } = props;window.props = props;//会把这个应用(也就是这个界面),插入到主应用的container的元素中去instance = new Vue({router,render: (h) => h(App),}).$mount(container ? container.querySelector("#app") : "#app"); //这里是挂载到自己的html中,主应用会拿到这个挂载的html,将其插入到主应用中
}// 独立运行时
if (!window.__POWERED_BY_QIANKUN__) {render();
}export async function bootstrap() {console.log("[vue] vue app bootstraped");
}
export async function mount(props) {console.log("[vue] props from main framework", props);render(props);
}
export async function unmount() {instance.$destroy();instance.$el.innerHTML = "";instance = null;
}

路由配置

import Vue from "vue";
import VueRouter from "vue-router";Vue.use(VueRouter);/* Layout */export const routes = [{path: "/",redirect: "/list",},{path: "/list",component: () => import("@/views/protocol/index"),},
];
const router = new VueRouter({base: "vue2",mode: "history",routes,
});
export default router;

配置webpack 在vue.config.js

module.exports = {lintOnSave: false,devServer: {port: "3001",headers: {"Access-Control-Allow-Origin": "*", //所有人都可以访问我的服务器},},configureWebpack: {output: {// library: `${name}-[name]`,library: `vue2App`,libraryTarget: "umd", // 把微应用打包成 umd 库格式// jsonpFunction: `webpackJsonp_${name}`,},},
};

下面我们以vue3作为技术栈构建微应用
在src下增加public-path.js

if (window.__POWERED_BY_QIANKUN__) {__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}

修改入口文件main.js

let instance = null;
function render(props = {}) {if (instance) return;const { container } = props;instance = createApp(App).use(store).use(router).mount(container ? container.querySelector("#app") : "#app");
}// 独立运行时
if (!window.__POWERED_BY_QIANKUN__) {render();
}export async function bootstrap() {console.log("[vue] vue app bootstraped");
}
export async function mount(props) {console.log("[vue] props from main framework", props);render(props);
}
export async function unmount() {//可选链操作符instance.$destroy?.();instance = null;
}

路由配置

import { createRouter, createWebHistory } from "vue-router";const routes = [{path: "/",redirect: "/home",},{path: "/home",component: () => import("../views/Home.vue"),},
];const router = createRouter({history: createWebHistory("/vue3"),routes,
});export default router;

配置webpack 在vue.config.js

// const { name } = require("./package");
module.exports = {lintOnSave: false,devServer: {port: "3002",headers: {"Access-Control-Allow-Origin": "*", //所有人都可以访问我的服务器},},configureWebpack: {output: {// library: `${name}-[name]`,library: `vue3App`,libraryTarget: "umd", // 把微应用打包成 umd 库格式// jsonpFunction: `webpackJsonp_${name}`,},},
};

http://www.ngui.cc/el/2031559.html

相关文章

如何在Linux下安装vim编辑器

目前的Ubuntu版本都安装了vi编辑器,vim编辑器可以看做vi编辑器的升级版,可以识别特殊字符,显示不同颜色。 目录 第一步 第二步 第三步 第四步 第一步 在terminal里面输入vi命令后按下tab键可以看到当前vi可以执行的命令,可以…
阅读更多...

深度学习电脑GPU环境配置

Ubuntu16.04GTX1070Nvidia 375.66CUDA8.0CUDNN5.0Tensorflow-gpu 目录 Ubuntu16.04GTX1070Nvidia 375.66CUDA8.0CUDNN5.0Tensorflow-gpu 1.anaconda安装 2.NVIDIA驱动安装 3.安装cuda8.0 4.配置cuDNN 5.安装TensorFlow-gpu 6.参考文章 1.anaconda安装 (1&#xff0…
阅读更多...

台式机笔记本电脑windows10和Linux双系统安装

目录 windows10和Ubuntu16.04 LTS双系统安装 1.准备工作 2.制作启动盘 3.安装过程 4.Linux系统配置 5.参考资料: 6.更多资料 windows10和Ubuntu16.04 LTS双系统安装 1.准备工作 已有的Windows10系统 空的U盘 软件:UltralISO,用来制…
阅读更多...

机器学习实习面试经历

面试对象 一家天津做大数据的科技有限公司 EQ测试题,10道,选择 三道简答题 1.简要写出浅层机器学习和深层机器学习的开发流程,并阐述它们的区别 2.写出你了解的经典的CNN模型及其特点,并谈谈深度学习未来可能的发展趋势 3.考虑如…
阅读更多...

深入学习周志华机器学习西瓜书之第三章:线性模型(线性回归,逻辑回归,线性判别分析,多分类,类别不平衡问题)

线性模型 本文章从简单的一元线性回归过渡到多元线性回归;从机器学习中的回归问题到过渡到分类问题;从分类问题中的二分类过渡到多分类,最后介绍对于类别不平衡问题的处理办法。 1. 线性模型的基本形式 给定由ddd个属性描述的示例x⃗(x1;x…
阅读更多...

支持向量机学习笔记

支持向量机(support vector machine)作为一种流行了足足十多年的机器学习算法,其拥有的可解释性,常常在面试中被用来考察面试者对于机器学习算法的理解。对于支持向量机的介绍、深入理解的书籍、论文和文章多如牛毛,其…
阅读更多...

图解机器学习基础知识

机器学习可以分为监督学习、无监督学习、强化学习 监督学习流程 分类问题 回归问题 强化学习 聚类 降维 一般流程
阅读更多...

gensim库的学习

日后整理修改完善 文档地址gensimgensim作者超过7k star的GitHub52nlp上关于gensim的文章
阅读更多...

1.迭代器与生成器

文章目录1.可迭代对象iterable2.迭代器iterator3.生成器generator4.关系描述1.可迭代对象iterable 可迭代对象,通常是一个可迭代取值的容器对象,如列表、元组、字符串、集合、字典。换言之,我们新建一个列表、元组、字符串、集合、字典&…
阅读更多...

推荐系统实践(项亮)学习笔记二:基于用户行为数据的基于邻域的协同过滤算法

文章目录用户行为数据用户行为分析实验设计基于邻域的算法基于用户的协同过滤算法基于物品的协同过滤算法UserCF和ItemCF的综合比较用户行为数据 用户行为数据在网站上的存在形式就是日志。网站运行过程中产生大量的原始日志(raw log),存储在…
阅读更多...
最新文章

代做工资流水公司宁德制作签证流水南宁薪资流水单上海办理对公银行流水宜春自存流水打印南昌车贷工资流水 价格襄阳打在职证明青岛工资流水单泉州入职流水打印淄博办理对公账户流水上海贷款工资流水 图片太原房贷工资流水 费用佛山入职银行流水价格开封做房贷银行流水赣州工资证明报价武汉工资流水公司上饶打印背调银行流水青岛办购房银行流水柳州房贷银行流水 代办合肥查询薪资银行流水保定代开入职银行流水保定办理签证工资流水湘潭工资流水app截图代开南京开企业银行流水襄阳查房贷银行流水徐州代开个人流水湖州银行流水单制作衡阳签证银行流水 模板中山开签证银行流水西宁薪资流水单多少钱保定入职工资流水报价香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

代做工资流水公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化