• 微前端 - micro-app


    前言

    之前已经实践过阿里微前端框架 qiankun,现在来使用一下京东推出的微前端解决方案 - MicroApp。 

    一、micro-app 的优势

    single-spa 是通过监听 url change 事件,在路由变化时匹配到渲染的子应用并进行渲染。

    micro-app 并没有沿袭 single-spa 的思路,而是借鉴了 WebComponent 的思想,通过 CustomElement 结合自定义的 ShadowDom,将微前端封装成一个类 WebComponent 组件,从而实现微前端的组件化渲染。并且由于自定义 ShadowDom 的隔离特性,micro-app 不需要像 single-spa 和 qiankun 一样要求子应用修改渲染逻辑并暴露出方法,也不需要修改 webpack 配置,是目前市面上接入微前端成本最低的方案。

    二、基座应用

    1⃣️、首先搭建 vue3 项目为基座应用

    2⃣️、安装依赖

    npm i @micro-zoe/micro-app --save
    

    3⃣️、在入口文件 main.ts 中引入

    1. // main.ts
    2. import microApp from '@micro-zoe/micro-app'
    3. microApp.start()

     4⃣️、配置路由

    1. import { createRouter, createWebHistory, RouteRecordRaw } from "vue-router";
    2. const routes: Array<RouteRecordRaw> = [
    3. {
    4. path: "/",
    5. name: "home",
    6. component: () => import("@/components/MyHome.vue"),
    7. children: [
    8. {
    9. path: "/",
    10. name: "hello",
    11. component: () => import("@/views/HomeView.vue"),
    12. },
    13. // react-app 子应用路由
    14. {
    15. path: "/reactApp/:page*",
    16. name: "reactApp",
    17. component: () => import("@/views/MicroApp/ReactApp.vue"),
    18. },
    19. ],
    20. },
    21. ];
    22. const router = createRouter({
    23. history: createWebHistory(process.env.BASE_URL),
    24. routes,
    25. });
    26. export default router;

    5⃣️、嵌入子应用

    1. <template>
    2. <h1>react-app 子应用h1>
    3. <micro-app
    4. name="react-app"
    5. url="http://localhost:3000/"
    6. baseroute="/reactApp"
    7. >micro-app>
    8. template>

    三、子应用

     1⃣️、使用 create-react-app 搭建 react 子应用。

    1. npx create-react-app react-app --template typescript
    2. npm i react-router-dom

    2⃣️、修改 webpack 配置,设置跨域支持

    1. headers: {
    2. 'Access-Control-Allow-Origin': '*',
    3. }

    3⃣️、设置基础路由(如果基座是history路由,子应用是hash路由,这一步可以省略)

    1. // router.js
    2. import { BrowserRouter, Switch, Route } from 'react-router-dom'
    3. export default function AppRoute () {
    4. return (
    5. // 👇 设置基础路由,如果没有设置baseroute属性,则window.__MICRO_APP_BASE_ROUTE__为空字符串
    6. <BrowserRouter basename={window.__MICRO_APP_BASE_ROUTE__ || '/'}>
    7. ...
    8. BrowserRouter>
    9. )
    10. }

    4⃣️、设置 publicPath,避免子应用的静态资源使用相对地址时加载失败

    创建文件 src/public-path.ts

    1. // __MICRO_APP_ENVIRONMENT__和__MICRO_APP_PUBLIC_PATH__是由micro-app注入的全局变量
    2. if(window.__MICRO_APP_ENVIRONMENT__) {
    3. // eslint-disable-next-line
    4. __webpack_public_path__ = window.__MICRO_APP_PUBLIC_PATH__
    5. }

    在子应用入口文件的最顶部引入 public-path.ts

    import './public-path';

    5⃣️、监听卸载

    1. // 监听卸载操作
    2. window.addEventListener('unmount', function () {
    3. ReactDOM.unmountComponentAtNode(document.getElementById('root'))
    4. })

  • 相关阅读:
    springboot整合freemarker根据模板导出excel
    【ELM预测】基于matlab探路者算法优化极限学习机预测(含前后对比)【含Matlab源码 2204期】
    C++ STL有用?如何调试?
    【Android 10 源码】Camera v1 startPreview 流程
    颜色杂项笔记
    【ESP 保姆级教程】疯狂ESP32Cam篇 —— 案例: Esp32Cam拍照存储到SD卡,做个迷你小相机
    【达梦数据库】学习笔记
    Ajax学习笔记第8天
    配置VScode开发环境-CUDA编程
    STM32单片机的知识点总结
  • 原文地址:https://blog.csdn.net/lhz_333/article/details/125245871