微前端 - micro-app

本文介绍了从使用阿里qiankun微前端框架转向京东MicroApp的过程。MicroApp借助WebComponent和ShadowDom实现组件化渲染,降低了微前端的接入成本。文中详细阐述了如何搭建基座应用,配置路由,以及如何改造React子应用以适应MicroApp,包括设置跨域、基础路由、publicPath和监听卸载等步骤。
摘要由CSDN通过智能技术生成

前言

之前已经实践过阿里微前端框架 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 中引入

// main.ts
import microApp from '@micro-zoe/micro-app'

microApp.start()

 4⃣️、配置路由

import { createRouter, createWebHistory, RouteRecordRaw } from "vue-router";

const routes: Array<RouteRecordRaw> = [
  {
    path: "/",
    name: "home",
    component: () => import("@/components/MyHome.vue"),
    children: [
      {
        path: "/",
        name: "hello",
        component: () => import("@/views/HomeView.vue"),
      },
      // react-app 子应用路由
      {
        path: "/reactApp/:page*",
        name: "reactApp",
        component: () => import("@/views/MicroApp/ReactApp.vue"),
      },
    ],
  },
];

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes,
});

export default router;

5⃣️、嵌入子应用

<template>
  <h1>react-app 子应用</h1>
  <!-- name(必传):应用名称
  url(必传): 应用地址
  baseroute(可选):基座应用分配给子应用的基础路由 -->
  <micro-app
    name="react-app"
    url="http://localhost:3000/"
    baseroute="/reactApp"
  ></micro-app>
</template>

三、子应用

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

npx create-react-app react-app --template typescript
 
npm i react-router-dom

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

headers: {
  'Access-Control-Allow-Origin': '*',
}

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

// router.js
import { BrowserRouter, Switch, Route } from 'react-router-dom'

export default function AppRoute () {
  return (
    // 👇 设置基础路由,如果没有设置baseroute属性,则window.__MICRO_APP_BASE_ROUTE__为空字符串
    <BrowserRouter basename={window.__MICRO_APP_BASE_ROUTE__ || '/'}>
      ...
    </BrowserRouter>
  )
}

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

创建文件 src/public-path.ts

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

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

import './public-path';

5⃣️、监听卸载

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值