基于Vue3TSElementPlusQiankun构建微应用项目
引言
Hello 大家好,这里是Anyin。
最近打算把一个小型项目(小程序点餐系统)重构为微服务+微应用模式,前端的技术栈打算使用Vue3 + TS + ElementPlus + Qiankun 。这里记录下我在构建基础微应用的过程。
提前预告下:这个小程序点餐系统代码整理后计划开源,并且重构后的项目也计划开源,敬请期待。
重构后的项目相关地址:
•后端: Anyin Cloud [1]
•前端基座: Anyin Cloud Parent[2]
•前端微应用: Anyin Cloud Base[3]
好了,接下来,我们来看看如何基于 Vue3+TS+ElementPlus+Qiankun 构建我们的微应用项目。创建主应用(基座)
另外说下,这里为什么不用 Vite 进行构建,原因是Vite 目前结合Qiankun 构建为应用还有点问题(采坑了),所以这里就放弃了。初始化项目
首先,我们使用 vue-cli 创建一个parent项目:# vue create anyin-cloud-parent
接着,手动选择我们要添加的组件:
我们选择以下组件进行应用的构建,使用空格键进行多选,然后回车即可:
选择vue3.x版本
相关代码风格、路由模式都是使用默认,css编译我们使用less:
相关编码规范我们使用ESLint + Airbnb Config :
最后,完整的选项如下:
当vue-cli帮我们创建好项目,我们进入项目查看下项目目录,如下:
安装Qiankun
首先,Qiankun的主应用是需要安装依赖的,微应用无需安装依赖,修改配置即可。这里我们先在主应用安装依赖 # npm i qiankun -S
接着,进行相关微应用配置。我们新增一个 app.ts ,用于记录所有的微应用的入口:// src/modules/apps.ts const apps: any[] = [ { name: "anyin-center-base", entry: "//localhost:4001", container: "#micro-app", activeRule: "/base", }, ]; export default apps;
然后,注册微应用,并导出start方法 // src/modules/index.ts import { registerMicroApps, addGlobalUncaughtErrorHandler, start, } from "qiankun"; // 微应用的信息 import apps from "@/modules/app"; /** * 注册微应用 * 第一个参数 - 微应用的注册信息 * 第二个参数 - 全局生命周期钩子 */ registerMicroApps(apps, { // qiankun 生命周期钩子 - 微应用加载前 beforeLoad: (app: any) => { // 加载微应用前,加载进度条 console.log("before load", app.name); return Promise.resolve(); }, // qiankun 生命周期钩子 - 微应用挂载后 afterMount: (app: any) => { // 加载微应用前,进度条加载完成 console.log("after mount", app.name); return Promise.resolve(); }, }); /** * 添加全局的未捕获异常处理器 */ addGlobalUncaughtErrorHandler((event: Event | string) => { console.error(event); }); // 导出 qiankun 的启动函数 export default start;
导出 start 方法之后,需要在入口处执行该方法// src/main.ts import { createApp } from "vue"; import App from "./App.vue"; import router from "./router"; import store from "./store"; import start from "./modules"; const app = createApp(App) start(); app.use(store).use(router).mount("#app");安装ElementPlus
对于整个界面,我们希望整体的布局是这个样子的:
所以,我们在安装 ElementPlus 之后,需要做这样子的布局。
首先,安装 ElementPlus # npm i element-plus -S
接着,在 main.ts 引入ElementPlus 组件,如下:// src/main.ts import { createApp } from "vue"; import App from "./App.vue"; import router from "./router"; import store from "./store"; // 引入ElementPlus组件和样式 import ElementPlus from "element-plus" import "element-plus/dist/index.css" import start from "./modules"; const app = createApp(App) start(); app.use(store) .use(router) // 使用ElementPlus .use(ElementPlus) .mount("#app");
然后,创建一个布局组件 Layout.vue ,如下: Anyin Cloud
{{ item.name }}
最后,在App.vue注册该组件
运行起来呈现的效果如下:
创建微应用
微应用的初始化项目同主应用,这里就不详细说明。
微应用无需依赖 Qiankun ,这里我们做一些配置即可。配置public-path.js
在 src 目录下新增一个public-path.js 文件,内容如下:// src/public-path.js if (window.__POWERED_BY_QIANKUN__) { // eslint-disable-next-line no-undef __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__; }
在 main.ts 引入该文件// src/main.ts import "./public-path";配置路由信息
新增一个路由配置文件,这里我们创建对应的路由信息,并且兼容独立运行,内容如下: // src/router/index.ts import { createRouter, createWebHistory, RouteRecordRaw } from "vue-router"; import Home from "../views/Home.vue"; import Route from "@/views/route/Route.vue"; import RouteInfo from "@/views/route/RouteInfo.vue"; import Dict from "@/views/dict/Dict.vue"; import Config from "@/views/config/Config.vue"; const routes: Array = [ { path: "/", name: "Home", component: Home, }, { path: "/route", name: "Route", component: Route, }, { path: "/route/info/:id", name: "RouteInfo", component: RouteInfo, }, { path: "/dict", name: "Dict", component: Dict, }, { path: "/config", name: "Config", component: Config, }, ]; const router = createRouter({ // 使用history模式,并且兼容独立运行 // 当使用微应用运行的时候,使用`/base`为baseUrl,因为我们在主应用配置的activeRule是`/base` history: createWebHistory(window.__POWERED_BY_QIANKUN__ ? "/base/" : "/"), routes, }); export default router;
接着,修改 main.ts 关于实例化的代码,如下:// src/main.ts // 定义一个Vue实例 let instance: Vue.App; // 需要定义该接口,否则`/src/router/index.ts`无法使用`Window.__POWERED_BY_QIANKUN__` declare global { interface Window { __POWERED_BY_QIANKUN__?: string; } } interface IRenderProps { container: Element | string; } // 渲染方法 function render(props: IRenderProps) { const { container } = props; instance = createApp(App); instance .use(store) .use(router) .use(ElementPlus) .mount( container instanceof Element ? (container.querySelector("#app") as Element) : (container as string) ); } // 独立运行时 if (!window.__POWERED_BY_QIANKUN__) { render({ container: "#app" }); }
这里主要是定义个渲染的方法,然后暴露Vue实例,因为等下在微应用的生命周期的钩子会使用到。 暴露微应用的生命周期钩子
对于微应用还需要暴露生命周期的钩子方法,这样子主应用才能够识别,在 main.ts 添加如下方法:// src/main.ts //暴露主应用生命周期钩子 export async function bootstrap() { console.log("subapp bootstraped"); } export async function mount(props: any) { console.log("mount subapp"); render(props); } export async function unmount() { console.log("unmount college app"); instance.unmount(); }修改打包配置
使用 vue 创建项目是没有vue.config.js 文件的,这里我们手动创建一个,并且配置相关详细,代码如下:const path = require("path"); const { name } = require("./package"); const port = 4001; // dev port function resolve(dir) { return path.join(__dirname, dir); } module.exports = { outputDir: "dist", assetsDir: "static", filenameHashing: true, devServer: { host: "0.0.0.0", hot: true, disableHostCheck: true, port, overlay: { warnings: false, errors: true, }, headers: { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "*", "Access-Control-Allow-Credentials": "true", "Access-Control-Allow-Methods": "*", "Cache-Control": "no-cache" }, }, // 自定义webpack配置 configureWebpack: { resolve: { alias: { "@": resolve("src"), }, }, output: { // 把子应用打包成 umd 库格式 library: `${name}-[name]`, libraryTarget: "umd", jsonpFunction: `webpackJsonp_${name}`, } }, };
•这里我们导入了 package.json 的name 字段,因为这里需要和主应用配置的app.ts 文件的name 字段一致• headers 添加跨域配置,因为主应用是通过fetch 方法来获取微应用的资源的,而微应用是启动在另外一个端口,所以需要添加跨域配置• output 配置了微应用的打包格式,主应用才能正确识别微应用的一些配置编写布局
还记得我们以下这个图不?
我认为 Header 应该是属于主应用,而下面的Aside 和Main 都是属于微应用,Aside 块一般都是用于展示菜单,个人认为各个微应用应该各自维护自己的菜单,而不是交由主应用维护。
所以,在微应用,我们还需要处理下左侧的菜单布局。
我们新增一个 Layout.vue 布局文件// src/views/layout/Layout.vue {{ item.name }} 结果
至此,Vue3+TS+ElementPlus+Qiankun构建微应用项目的一个基本结构我们已经处理完成,整体运行看下效果:
首页
微应用
最后
好了,基于 Vue3+TS+ElementPlus+Qiankun 的微应用项目基本框架我们已经搭建好了,后续就是慢慢填充一些工具和页面了。
相关源码地址:
•主应用: Anyin Cloud Parent
•微应用: Anyin Cloud Base References
[1] Anyin Cloud : https://gitee.com/anyin/anyin-cloud
[2] Anyin Cloud Parent: https://gitee.com/anyin/anyin-cloud-parent
[3] Anyin Cloud Base: https://gitee.com/anyin/anyin-cloud-base
老北京人餐桌上的八道美食,味道都很棒,你吃过吗?小编从少年在北京求学,以待就是近20年,大学的同学很多都是北京本地人。有同学,就必然少不了到同学家蹭饭。今天就给大家介绍一下,我北京同学家常见的家常菜!一,炒疙瘩我最爱吃的就是这口
天凉好个秋!推荐西部长青赏秋旅游攻略2021就看国际庄2021头条带你看河北2021我为河北文旅代言河北文旅看图识景秋风吹雨过南楼,一夜新凉已是秋。在这个浪漫的季节,到西部长青赏秋吧!一起去自然儿童乐园重温儿时快乐时
我们到底为什么要旅行?过去,曾经有过多少次说走就走的旅行。今后,这样的旅行还会更多,因为走的地方越多,才会感受到自己没去过的地方更多。现在,北京因为疫情号召市民非必要不出京。自忖在我们可爱的政府看来,旅
既能通勤又能旅行,这两款大尺寸MPV让你的生活更惬意早几年前,大家对于大尺寸MPV的印象还仅仅是商务接待等特殊用途。不过随着经济快速发展,自驾逐渐成为了主流旅游方式,大尺寸MPV也开始走进普通消费者生活中,它们不仅拥有更加舒适宽敞的
一见南京误终身!忽然,想去金陵了悠悠淮水,阅尽千年兴衰峨峨钟山,铸就旷代雄杰。拥有七千多年文明史两千多年建城史的南京,是一座有王气的城,历史上曾有十二个朝代定都或迁都于南京。同时,南京也是一座诗意栖息之地,山水城
香辣脆口的萝卜干只需要几步我们所使用的食材我们要事先准备好白萝卜,食用盐,剁红辣椒,芝麻油,还有密封罐。密封罐是为了保存萝卜干不变味。我们将买来的白萝卜拿去清洗干净,去皮去头部和尾部(当然也可以不去皮)。然
日本篮球遭沉重打击!新星八村塁陨落,因心理原因无限期休战最近十年,亚洲篮坛发展最好的国家里绝对有日本的一个席位。相比起过去的亚洲弱旅,日本男篮凭借着大力发展青训送年轻球员留洋以及归化日本联赛外援这三大王牌招数,实力取得了长足的进步。在日
收购东芝,海信借力打力!击败夏普索尼成功登顶日本电视宝座每当听到中国品牌在国外大发放光芒时,我都感到是比较自豪。比如这次中国手机销量在印度占据了半壁江山,让人振奋,根据Canalys发布最新报告显示,第三季度印度智能手机市场出货量排名中
国内最宜居的城市是?目前住河北,这边冬天雾霾,空气干燥,考虑搬到一个新的城市呢,之前见集思录讨论过这个问题,可惜忘了收藏了。广东福建浙江江苏应该不错,还有云南广西云南等也应该可以就是交通没有前面几个好
安静的那座城市你会不会忽然地想起曾经写过的一篇文章?每条路上,记录着我们共同的故事。无论我们走的多远,无论我们经历的风景,你我都不再记得。可是,在很多未知的时候,我们竟然连自己的自己,全然不知。
年内上市新股破发已达46家打新躺赚或已成历史记者张厚培近日连续有首日上市的新股破发,引发市场关注。据统计,年内上市的402只新股已有46只破发,其中4只首日就破发!分析认为,随着新股破发的频现,上市首日涨幅将有所下降。过去靠
2022年十大国内商业新闻TOP10News012022。03。23中国地产企业集体爆雷继恒大后,2022年地产企业开始集中爆雷。2022年第一季度还未结束,融创中国世茂集团等多家房地产企业就因面临较大的偿
电子行业深度报告量价齐升趋势确定,国内汽车电子企业迎来发展(报告出品方作者国泰君安证券,王聪刘堃文紫妍)1。汽车电动化智能化发展加速,单车电子部件量价齐升随着电动汽车从MEV到BEV的不断发展,以及智能化的持续渗透,电动汽车内的单车电子成
4岁女孩创作国内首个AI绘本,被出版社看中估值超10万4岁女孩创作AI绘本,被出版社看中,并估价10万以上?近日,山东人民出版社看中一位4岁女孩用百家号AI作画创作的AI绘本超能外星战队,认为该绘本价值10万以上,并有出版的意向。此事
890年代土掉渣的衣服,现在却成了爆款?难怪爸妈总嫌我土垫肩西装波点裙喇叭裤这些引领潮流的爆款,谁知竟是来自八九十年代呢?今天不妨穿越回爸妈们年轻时的岁月,去感受曾经的时尚光芒吧!在八九十年代,流行与小众前卫或传统在同一段岁月中交织,碰
国内也可以免费体验ChatGPT了前段时间发布了ChatGPT(OpenAI)太厉害了,我可以和它聊上一整天保姆式教程,一步步引导大家在国内注册ChatGPT两篇文章,阅读的朋还是蛮多的,的确ChatGPT人工智能
松下将停止在日本国内生产电饭煲,转移至中国松下将结束电饭煲的日本国内生产。此前一直在兵库县加东市的工厂生产面向国内的产品,但计划在2023年6月之前把全部型号的生产都转移至中国杭州的工厂。电饭煲的很多零部件厂商集中于中国,
金猿产品展有米有数专业的新电商营销大数据分析平台有米有数是有米云旗下专业的新电商营销大数据分析平台,致力于通过数字化技术驱动新电商商家科学选品素材参考投放提效的全链路流程,助力商家实现生意的可持续增长。新电商指的是通过广告投放短
每日优鲜欠电信8000元服务费成老赖鞭牛士12月19日消息,天眼查App显示,近日,北京每日优鲜电子商务有限公司因有履行能力而拒不履行生效法律文书确定义务,被列为失信被执行人。生效法律文书确定的义务显示,该公司应给付
如果让人工智能来预测俄乌冲突,会得到什么答案呢?作为今年最亮眼的AI(人工智能)产品,ChatGPT拥有目前最准确的语义理解能力和上下文问答的连续性,其不仅能够和人进行简单的对谈,还可以编写文案编写程序甚至可以改变聊天的语气和风
腾讯视频VIP最多几人使用,为防止封号,这一操作请务必知晓头条创作挑战赛腾讯视频VIP账号只允许本人在最多5个设备上使用,且同一时间同一账号最多可在2个设备上同时上线观影,其中又特别规定微信渠道的会员业务只能同时登录1个设备,超出范围使用
骗光一个人只需要五分钟随着网络技术的快速发展,借助手机固定电话网络等通信工具和现代化网银技术实施的非接触式诈骗犯罪迅速蔓延,给人民群众造成很大的损失电信诈骗的前世今生电信网络诈骗起源干20世纪末的我国的