<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
1、基於amin-work-x專案作為原始專案,改造動態選單為自定義選單
2、分別在主應用專案(main)和子應用(childrenOne,childrenTwo)專案中安裝microApp
npm i @micro-zoe/micro-app --save
1,修改子專案mian.ts,新增與基座的互動設定和路由衝突解決
import { createApp } from "vue"; import App from "./App.vue"; import { Router } from 'vue-router' import router from "./router"; import "./utils/router"; import ElementPlus from "element-plus"; import "element-plus/dist/index.css"; import "dayjs/locale/zh-cn"; import zhCn from "element-plus/es/locale/lang/zh-cn"; import "@/icons/iconfont/iconfont.css"; import "@/icons/iconfont/iconfont.js"; import "@/styles/main.css"; import LayoutStore from "@/layouts"; import http from "@/api/http"; import { registerComponents } from "./components"; import * as Icons from "@element-plus/icons"; import pinia from "./store/pinia"; import "./setting"; declare global { interface Window { microApp: any __MICRO_APP_NAME__: string __MICRO_APP_ENVIRONMENT__: string __MICRO_APP_BASE_ROUTE__: string } } // 與基座進行資料互動 function handleMicroData(router: Router) { // 是否是微前端環境 if (window.__MICRO_APP_ENVIRONMENT__) { // 監聽基座下發的資料變化 window.microApp.addDataListener((data: Record<string, unknown>) => { console.log('child-vue3 addDataListener:', data) // 當基座下發path時進行跳轉 if (data.path && data.path !== router.currentRoute.value.path) { router.push(data.path as string) } }) // 向基座傳送資料 setTimeout(() => { window.microApp.dispatch({ myname: 'tenant-app' }) }, 3000) } } /** * 用於解決主應用和子應用都是vue-router4時相互衝突,導致點選瀏覽器返回按鈕,路由錯誤的問題。 * 相關issue:https://github.com/micro-zoe/micro-app/issues/155 * 當前vue-router版本:4.0.12 */ function fixBugForVueRouter4(router: Router) { // 判斷主應用是main-vue3或main-vite,因為這這兩個主應用是 vue-router4 if (window.__MICRO_APP_ENVIRONMENT__) { //if (window.location.href.includes('/main-vue3') || window.location.href.includes('/main-vite')) { /** * 重要說明: * 1、這裡主應用下發的基礎路由為:`/main-xxx/app-vue3`,其中 `/main-xxx` 是主應用的基礎路由,需要去掉,我們只取`/app-vue3`,不同專案根據實際情況調整 * * 2、realBaseRoute 的值為 `/app-vue3` */ const realBaseRoute = window.__MICRO_APP_BASE_ROUTE__;//.replace(/^/app-tenant-[^/]+/g, '') router.beforeEach(() => { if (typeof window.history.state?.current === 'string') { window.history.state.current = window.history.state.current.replace(new RegExp(realBaseRoute, 'g'), '') } }) router.afterEach(() => { if (typeof window.history.state === 'object') { window.history.state.current = realBaseRoute + (window.history.state.current || '') } }) } } const app = createApp(App); Object.keys(Icons).forEach((it) => { app.component(it, (Icons as any)[it]); }); registerComponents(app); app.use(LayoutStore, { state: { layoutMode: "ltr", }, actions: { onPersonalCenter() { router.push({ path: "/personal", query: { uid: 1 } }); }, onLogout() { router.replace({ path: "/login", query: { redirect: "/" } }).then(() => { window.location.reload(); }); }, }, }); app.use(pinia).use(router); app.use(ElementPlus, { locale: zhCn, }); app.use(http); app.mount("#app"); handleMicroData(router) fixBugForVueRouter4(router) // 監聽解除安裝操作 window.addEventListener('unmount', function () { //console.log("r4開始解除安裝", window.location, window.history, app) app?.unmount() //console.log('微應用child-vue3解除安裝了') })
2,修改vue.config.js檔案,設定publicPath、埠號、允許跨域
3,為保證子應用的路由在主應用中能直接使用,可在每個路由前新增子應用的路由標誌
這一步可不操作,如果不新增,則需要在主應用新增選單或者動態獲取選單時,根據其他標誌,為路由手動加上當前子應用的標誌,用於判斷子應用來源
4、修改子應用路由問history模式
const router = createRouter({ history: createWebHistory(window.__MICRO_APP_BASE_ROUTE__||process.env.BASE_URL), routes: mapTwoLevelRouter([...constantRoutes, ...asyncRoutes]), });
1,在layout中新增子應用入口檔案(srclayoutsmicroappapp-one.vue)
<template> <div style="height: 100%"> <micro-app name="appname-one" :url="url" baseroute="/app-main" :data="microAppData" @created="handleCreate" @beforemount="handleBeforeMount" @mounted="handleMount" @unmount="handleUnmount" @error="handleError" @datachange="handleDataChange" style="height: 100%" ></micro-app> </div> </template> <script lang="ts"> export default { name: "name-app", data() { return { url: process.env.NODE_ENV === "development" ? "http://localhost:4009/app-one" : "通過設定獲取線上地址", microAppData: { msg: "來自基座的資料" }, }; }, methods: { handleCreate(): void { console.log("child-vue3 建立了"); }, handleBeforeMount(): void { console.log("child-vue3 即將被渲染"); }, handleMount(): void { console.log("child-vue3 已經渲染完成"); setTimeout(() => { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore this.microAppData = { msg: "來自基座的新資料" }; }, 2000); }, handleUnmount(): void { console.log("child-vue3 解除安裝了"); }, handleError(): void { console.log("child-vue3 載入出錯了"); }, handleDataChange(e: CustomEvent): void { console.log("來自子應用 child-vue3 的資料:", e.detail.data); }, }, }; </script> <style></style>
2,在主應用中註冊子應用路由
子應用的路由第一次指向主應用的layout,第二層指向上面新建的入口檔案
3,修改主應用publicPath
此處的publicPath需與app-one中的baseroute保持一致
設定完成後,先後執行兩個專案後,在主應用中手動新增一個子應用的的具體頁面路由,就可以在主應用中開啟子應用了,但是此時子應用的路由表覆蓋了主應用。
為解決這個問題,需要在子應用中新增一個非layout佈局的空頁面,當子應用單獨執行時,指向layout佈局頁面,如果是在微服務中使用,則指向空頁面
srclayoutsEmptyLayout.vue
<template> <div class="empty-layout"> <router-view> </router-view> </div> </template> <style lang="scss" scoped> .empty-layout { height: 100%; } </style>
srcrouterindex.ts
到此這篇關於vue3+ts+MicroApp實戰教學的文章就介紹到這了,更多相關vue3 ts MicroApp內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45