微前端microapp,使用与注意事项

微前端的搭建和注意事项

1. 搭建

  • 准备两个项目,一个项目当基项目,一个为子项目
  • 我用的是vue3+vite的项目

2. 基项目配置microapp

  • 安装microapp
js 复制代码
1. pnpm i @micro-zoe/micro-app --save

2. // main.js 文件中添加以下内容
import microApp from '@micro-zoe/micro-app'

microApp.start()
3. //创建个页面 放入以下子代码即可
//需要注意的是子项目为vite的 要加上iframe
<div>
  // name:应用名称, url:应用地址 
  <micro-app name='my-app' url='http://localhost:3000/' iframe></micro-app>
</div>

3. 子项目配置 (基础配置非常少)

js 复制代码
//main.js中加入
window.unmount = () => {
  app.unmount()
}
//在vite.config.js中加入以下代码
export default defineConfig({
  server: {
    headers: {
      'Access-Control-Allow-Origin': '*',
    }
  }
})

这样就已经实现微前端了

以下是操作时候遇到的问题

子项目页面
基项目页面

  1. 如何实现单独运行子项目显示左侧菜单,微前端时候不显示

    js 复制代码
    	// 通过代码
    	if (window.__MICRO_APP_ENVIRONMENT__) {
    		是微前端环境
    	  // isMicroApp.value = true;
    	} else {
    		不是微前端环境
    	}
  2. 点击基项目左侧的菜单如何能显示对应的子菜单内容

看了官方示例,基本上都是通过传参到子项目然后在子项目中监听传过来的参数进行页面跳转,我没采用感觉太麻烦了。 自己尝试了几种方法,选择了路由模式为native-scope的方式(使用方式非常简单),需要子项目和基项目保持相同路由模式,我全用hash模式。 native-scope方式相当于子项目使用的基项目的路由路径,所以要保证设置的路由,必须对应子项目的路由。 例如:基项目设置 path:/microapp/userListcomponent: @/views/microApp/index.vue ,子项目中必须也存在path:/microapp/userList这个路径

注意,建议使用这个方式一定要看下面 3

vue 复制代码
<template>
 <!-- 基项目 @/views/microApp/index.vue 页面代码 -->
  <div>
    <micro-app
      name="children-App"
      url="http://localhost:3009"
      iframe
       router-mode='native-scope'
    ></micro-app>
  </div>
</template>

<script setup>
</script>
<style lang="scss" scoped></style>
  1. 基项目频繁加载问题。使用路由模式为native-scope的方式后,功能实现了,但每次切换页面都会重新加载子项目,以至于切换页面都要有个等待期,并且内存也在不断上涨。 解决方式 ,频繁渲染官方提供了解决方式。参考 UDP模式
js 复制代码
//贴一下我的子项目main.js代码
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import ElementPlus from 'element-plus'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import { createRouter, createWebHashHistory } from 'vue-router'
import 'element-plus/dist/index.css'
import routes from './router'
import App from './App.vue'
import './style.css'

// 注册所有图标
let app = null
let router = null
let history = null
window.mount = () => {
  history = createWebHashHistory()
  router = createRouter({
    history,
    routes
  })
  
  app = createApp(App)
  for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
    app.component(key, component)
  }
  app.use(createPinia())
  app.use(router)
  app.use(ElementPlus)
  app.mount('#app')
}
window.unmount = () => {
  app.unmount()
  history.destroy()
  app = null
  router = null
  history = null
}
if (!window.__MICRO_APP_ENVIRONMENT__) {
  window.mount()
}
  1. 参数问题。 我因为只需要两个参数,一个appid,一个token,用来区分不同系统和请求接口使用。 我就直接把参数存在了localStorage中,子项目也是直接从localStorage.getItem()中能直接拿到。

  2. 子项目部署问题 子项目部署后,使用还是显示跨域了。应该是后端在服务器中加了Access-Control-Allow-Origin 就好了。

到此结束了,项目暂时运行没啥问题。 提供个git仓库给大家参考下。gitee.com/sulbw/study...

相关推荐
武子康9 分钟前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
一点一木1 小时前
从60首歌到1个网站:输入你的故事,还你一首歌
前端·github
IT_陈寒2 小时前
Vue这个特性差点让我加班到凌晨,谁懂啊
前端·人工智能·后端
kyriewen2 小时前
我让AI改一个bug——它偷偷动了5个我没让它碰的地方
前端·javascript·ai编程
遇乐的果园3 小时前
前端学习笔记-vue加载渲染优化
前端·笔记·学习
用户985033593283 小时前
OpenLayers 热力图从原理到 Vue 组件一键接入
前端
颜酱3 小时前
01 | 骨架搭建:FastAPI + Vue 跑通第一个 SSE 流式问答
前端·人工智能·后端
hoLzwEge3 小时前
解码 IDE 智能提示:jsconfig.json 辅助开发全攻略
前端·前端框架
leoZ2314 小时前
记忆系统与 Agent 定制完全指南(四):自定义 Agent 开发(一)
前端·chrome
慧一居士4 小时前
Element Plus 按需引入的配置使用说明和完整示例
前端·vue.js