Micro-app 微前端框架demo介绍

Micro-app 框架

在这里插入图片描述

1、框架安装

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

2、子应用对应的view页面

<template><div><!-- name(必传):应用名称url(必传):应用地址,会被自动补全为http://localhost:3000/index.htmlbaseroute(可选):基座应用分配给子应用的基础路由,就是上面的 `/my-page`--><micro-app name='app-vue2-demo' url='http://localhost:4001/' baseroute='/app-vue2-demo'></micro-app></div>
</template>

3、页面对应的路由

{//路由路径最好是非严格匹配path: "/app-vue2-demo*",name: "Vue2DemoPage",component: () => import("@/views/Vue2DemoPage.vue")
}

别忘记,view页面也需要配置

4、子应用的配置

子程序路由需要判断是否加上主程序给予的路由前缀

const router = new VueRouter({mode: "history",base: window.__MICRO_APP_BASE_ROUTE__ || '/',。。。。。}

5、子程序需要设置跨域

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

配置总结

主应用

1、创建一个页面,需要加入micro-app自定义元素

2、配置路由

子应用

1、如果在微前端中,加上路由前缀

2、设置跨域

页面渲染实现原理

其实micro-app原理很简单:WebComponent(Custom Element) + HTMLEntry

其实就是把子应用的资源读取过来,直接在基座程序中运行

与react子应用集成

主应用

1、创建一个页面,需要加入micro-app自定义元素

<micro-app name='app-react-demo' url='http://localhost:4002/' baseroute='/app-react-demo'
>
</micro-app>

2、配置路由

{//路由路径最好是非严格匹配path: "/app-react-demo*",name: "ReactDemoPage",component: () => import("@/views/ReactDemoPage.vue")}

子应用

1、如果在微前端中,加上路由前缀

<Router basename={window.__MICRO_APP_BASE_ROUTE__ || '/'}><Routes><Route path="/" element={<LayoutMain />} > <Route index element={<Home />} /><Route path="about" element={<About />} /><Route path="info" element={<Info />} /></Route></Routes></Router>

2、设置跨域

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

3、静态资源的处理

在子应用中的src下创建public-path.js文件

if (window.__MICRO_APP_ENVIRONMENT__) {// eslint-disable-next-line__webpack_public_path__ = window.__MICRO_APP_PUBLIC_PATH__ //http://localhost:4002  默认/
}

这个文件放入到程序的入口文件index.js中直接执行,建议最好放在第一行

import "./public-path";

与vite项目子应用集成

当子应用是vite应用时需要做特别的适配,适配vite的代价是巨大的,我们必须关闭沙箱功能,因为沙箱在module script下不支持,这导致大部分功能失效,包括:环境变量、样式隔离、元素隔离、资源路径补全、baseroute 等。

在嵌入vite子应用时,micro-app的功能只负责渲染,其它的行为由应用自行决定,这包括如何防止样式、JS变量、元素的冲突。

在module模式下,引入的资源大多为相对地址,兼容主要做的事情就是将地址补全。

vite的module模式是指vite在开发模式下直接使用ES模块来加载代码,而不是像传统的构建工具一样通过打包和压缩,将所有代码打包成一个文件。这种模式让我们开发的时候效率很高,不过却给微前端的集成带来了麻烦

因为我们之前说过micro-app集成的原理,就是把子应用打包好的index.html直接拉过来,然后在基座中运行子应用的代码。vite 这种module模式的话。缺少了这个统一的入口,集成起来就非常的麻烦

1、基座项目中添加页面

views中添加页面ViteDemoPage.vue

<template><div><h2>Main - Vite Vue3 Demo</h2><div><micro-app name='app-vite-demo' url='http://localhost:4003/' baseroute='/app-vite-demo'></micro-app></div></div>
</template>

路由中添加:

{path: "/app-vite-demo*",name: "AppViteDemo",component: () => import("@/views/ViteDemoPage.vue")}

app.vue页面别忘记添加路由

2、适配vite项目,子应用修改vite.config.ts文件

无论micro-app框架还是single-spa框架,适配vite项目代价都很大,如果你要集成的项目很多是vite项目,建议直接使用iframe的方式接入,或者使用wujie

这里主要说明两点:

1、path如果报错,需要导入nodejs的TypeScript 的声明文件包 npm i --save-dev @types/node

2、赋值的自定义插件报错,直接any

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path';
import { join } from 'path'
import { writeFileSync } from 'fs'// https://vitejs.dev/config/
export default defineConfig({//域名,生成环境是是你具体的域名,开发环境下为空字符串,这里手动加上了微前端的路由前缀base: `${process.env.NODE_ENV === 'production' ? 'http://my-site.com' : ''}/app-vite-demo/`,plugins: [vue(),// 自定义插件(function () {let basePath = ''return {name: "vite:micro-app",apply: 'build',configResolved(config) {//配置资源文件基础路径//${config.base} 项目基础路径,就是上面配置的那些//${config.build.assetsDir}资源文件存放的目录名。默认情况下,它是 'assets'basePath = `${config.base}${config.build.assetsDir}/`},writeBundle (options, bundle) {//遍历所有的代码块,找到文件名以 '.js' 结尾的代码块for (const chunkName in bundle) {if (Object.prototype.hasOwnProperty.call(bundle, chunkName)) {const chunk = bundle[chunkName]if (chunk.fileName && chunk.fileName.endsWith('.js')) {//使用正则表达式来查找所有的相对路径,并使用 new URL() 方法将这些路径转换为绝对路径。chunk.code = chunk.code.replace(/(from|import\()(\s*['"])(\.\.?\/)/g, (all, $1, $2, $3) => {return all.replace($3, new URL($3, basePath))})//options.dir Vite 构建过程中的输出目录,默认情况下,options.dir 的值就是 dist//options.dir 是 dist,chunk.fileName 是 main.js,那么完整的文件路径就是 dist/main.jsconst fullPath = join(options.dir, chunk.fileName)//将修改后的内容,重新写入文件系统writeFileSync(fullPath, chunk.code)}}}},}})() as any,],resolve: {alias: {'@': resolve(__dirname, 'src') // 设置 `@` 指向 `src` 目录}},server: {port: 4003,}
})
3、子项目修改容器id和渲染容器id
<!-- index.html -->
<body><div id="my-vite-app"></div>
</body>
// main.ts
createApp(App).mount('#my-vite-app')
4、修改路由

vite子项目需要修改为hash路由

由于主应用关闭的沙箱功能,所以基座应用的环境变量不能使用了,所以,每次切换路由的时候就会产生问题

由于hash路由,使用的是地址栏的处理

import { createRouter, createWebHashHistory } from 'vue-router'const router = createRouter({history: createWebHashHistory(),routes,
})
5、静态资源
<template><div><div><a href="https://vitejs.dev" target="_blank"><img :src="viteLogo" class="logo" alt="Vite logo" /></a><a href="https://vuejs.org/" target="_blank"><img :src="vueLogo" class="logo vue" alt="Vue logo" /></a></div><HelloWorld msg="子应用 -- Vite+Vue@3.x" /></div>
</template><script setup lang="ts">
import HelloWorld from '@/components/HelloWorld.vue'
const vueLogo = new URL('@/assets/vue.svg', import.meta.url).href
const viteLogo = new URL('/vite.svg', import.meta.url).href
</script>

如果图片比较多,可以用计算属性稍微封装一下

<template><div><div><a href="https://vitejs.dev" target="_blank"><img :src="imgUrl('/vite.svg')" class="logo" alt="Vite logo" /></a><a href="https://vuejs.org/" target="_blank"><img :src="imgUrl('../assets/vue.svg')" class="logo vue" alt="Vue logo" /></a></div><HelloWorld msg="子应用 -- Vite+Vue@3.x" /></div>
</template><script setup lang="ts">
import {computed} from 'vue'
import HelloWorld from '@/components/HelloWorld.vue'
// const vueLogo = new URL('@/assets/vue.svg', import.meta.url).href
// const viteLogo = new URL('/vite.svg', import.meta.url).hrefconst imgUrl = computed(() => (url: string) => new URL(url, import.meta.url).href);
</script>
6、基座应用的修改,关闭沙箱功能
<micro-app name='app-vite-demo' url='http://localhost:4003/' baseroute='/app-vite-demo'inline disableSandbox></micro-app>
7、基座应用处理子应用静态资源
microApp.start({plugins: {modules: {// appName即应用的name值,注意这里的name实际上是页面<micro-app>标签的name值'app-vite-demo': [{loader(code) {if (process.env.NODE_ENV === 'development') {// 这里 basename 需要和子应用vite.config.js中base的配置保持一致code = code.replace(/(from|import)(\s*['"])(\/app-vite-demo\/)/g, all => {return all.replace('/app-vite-demo/', 'http://127.0.0.1:4003/app-vite-demo/')})}return code}}]}}
})
8、出现的问题

开发者工具console窗口报错

[vite] failed to connect to websocket (SyntaxError: Failed to construct 'WebSocket': The URL 'ws://:/app-vite-demo/' is invalid.)

这个是由于框架自身问题导致,不影响运行,官方已经在1.0beta版本修复了这个问题

由于沙箱隔离关闭,导致环境变量,css隔离,元素隔离、资源路径补全、baseroute等失效

这个问题只有开发者在开发的时候自行定义好开发规范进行规避
demo集合了vue2、vue3、react项目
预览效果
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/604294.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react+AntDesign 之 pc端项目案例

1.环境搭建以及初始化目录 CRA是一个底层基于webpack快速创建React项目的脚手架工具 # 使用npx创建项目 npx create-react-app react-jike# 进入到项 cd react-jike# 启动项目 npm start2.安装SCSS SASS 是一种预编译的 CSS&#xff0c;支持一些比较高级的语法&#xff0c;…

3D点云上的深度学习综述

1 Title Deep Learning for 3D Point Clouds: A Survey&#xff08;Yulan Guo; Hanyun Wang; Qingyong Hu; Hao Liu; Li Liu; Mohammed Bennamoun&#xff09;【IEEE Transactions on Pattern Analysis and Machine Intelligence 2020】 2 Conclusion Deep learning on point…

Android开发编程从入门到精通,安卓技术从初级到高级全套教学

一、教程描述 本套教程基于JDK1.8版本&#xff0c;教学内容主要有&#xff0c;1、环境搭建&#xff0c;UI布局&#xff0c;基础UI组件&#xff0c;高级UI组件&#xff0c;通知&#xff0c;自定义组件&#xff0c;样式主题&#xff1b;2、四大组件&#xff0c;Intent&#xff0…

(九)One-Wire总线-DS18B20

文章目录 One-Wire总线篇复位和应答读/写0&#xff0c;1 DS18B20篇原理图概述最主要特性几个重要的寄存器&#xff08;部分要掌握&#xff09;存储有数字温度结果的2个字节宽度的温度寄存器寄存器描述&#xff1a;寄存器说明&#xff1a; 一个字节的过温和一个字节的低温&#…

msckf_vio在ubuntu20.04中的编译

1.新建catkin workspace文件夹&#xff0c;并在其中新建src文件夹&#xff0c;并将源码clone至src内。 源码地址&#xff1a;https://github.com/KumarRobotics/msckf_vio 目录层级示意如下&#xff0c;build和devel不必新建&#xff0c;后续指令会自动新建。 2. 在编译之前…

Python 面向对象之反射

Python 面向对象之反射 【一】概念 反射是指通过对象的属性名或者方法名来获取对象的属性或调用方法的能力反射还指的是在程序额运行过程中可以动态获取对象的信息(属性和方法) 【二】四个内置函数 又叫做反射函数 万物皆对象&#xff08;整数、字符串、函数、模块、类等等…

第02章_变量与进制

第02章_变量与进制 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题脉络 1、关键字(keyword) 定义&#xff1a;被C语言赋予了特殊含义&#xff0c;用做专门用途的字符串&#xff08;或单…

力扣:438. 找到字符串中所有字母异位词 题解

Problem: 438. 找到字符串中所有字母异位词 438. 找到字符串中所有字母异位词 预备知识解题思路复杂度Code其它细节推荐博客或题目博客题目滑动窗口哈希表 预备知识 此题用到了双指针算法中的滑动窗口思想&#xff0c;以及哈希表的运用。c中是unordered_map。如果对此不了解的u…

二、UI文件设计与运行机制

一、UI文件设计与运行机制 1、创建工程 2、添加控件&#xff0c;实现按钮点击 &#xff08;1&#xff09;添加控件 &#xff08;2&#xff09;添加信号和槽 2、分析项目结构 test_02test_02.pro Qt工程文件Headerswidget.h 设计的窗体类的头文件Sourcesmain.cpp 主程序入…

rk3588中编译带有ffmpeg的opencv

有朋友有工程需要&#xff0c;将视频写成mp4&#xff0c;当然最简单的方法当然是使用opencv的命令 cv::VideoWriter writer;bool bRet writer.open("./out.mp4", cv::VideoWriter::fourcc(m, p, 4, v), 15, cv::Size(640, 512), 1); 但是奈何很难编译成功&#xff…

Python | 基于Mediapipe框架的手势识别系统

一、项目要求 1、题目 本题着力于解决会商演示系统中的非接触式人机交互问题&#xff0c;具体而言&#xff0c;其核心问题就是通过计算机视觉技术实现对基于视频流的手势动作进行实时检测和识别。通过摄像头采集并识别控制者连续的手势动作&#xff0c;完成包括点击、平移、缩放…

离散数学1

注&#xff1a;线性代数已经更新了最大部分的内容&#xff0c;因此过段时间再补充剩余内容。 小王能歌善舞。因此&#xff0c;小王必须得会唱歌也必须得会跳舞&#xff0c;才满足题意 小王能唱歌或者小王能跳舞。因此&#xff0c;小王会唱歌也会跳舞满足。小王不会唱歌但会跳舞…

JavaScript常用事件演示

文章目录 一、在JavaScript中什么是事件&#xff1f;二、什么是JavaScript 常用事件&#xff1f;三、常用JS事件代码示例:四、事件总结 一、在JavaScript中什么是事件&#xff1f; JavaScript 使我们有能力创建动态页面。事件是可以被 JavaScript 侦测到的行为。 网页中的每个…

C++|【34】C++中的const

文章目录 constconst最基本的用法const和指针const和类 const const最基本的用法 用于限定a的大小&#xff0c;使a变成一个恒定不变的值。 应用场景&#xff1a;比如设置一些和标准相关的值&#xff0c;如上下限等等。 const和指针 指针总是包含两部分信息&#xff0c;一个是…

如何信任机器学习模型的预测结果?

在本篇中&#xff0c;我将通过一个例子演示在 MATLAB 如何使用 LIME 进行复杂机器学习模型预测结果的解释。 我使用数据集 carbig&#xff08;MATLAB 自带的数据集&#xff09;训练一个回归模型&#xff0c;用于预测汽车的燃油效率。数据集 carbig 是 70 年代到 80 年代生产的汽…

docker的基础知识

介绍docker 什么是docker Docker是一种开源的容器化平台&#xff0c;可以让开发人员将应用程序与其依赖的运行时环境一起打包到一个称为容器的独立单元中。这个容器可以在任何支持Docker的机器上运行&#xff0c;提供了一种快速和可移植的方式来部署应用程序。Docker的核心组件…

Python库学习(十四):ORM框架-SQLAlchemy

1.介绍 SQLAlchemy 是一个用于 Python 的 SQL 工具和对象关系映射&#xff08;ORM&#xff09;库。它允许开发者通过 Python 代码而不是 SQL查询语言来操作数据库。SQLAlchemy 提供了一种灵活且强大的方式来与关系型数据库交互&#xff0c;支持多种数据库后端&#xff0c;如 P…

【十七】【动态规划】DP41 【模板】01背包、416. 分割等和子集、494. 目标和,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

GeoServer发布地图服务(WMS、WFS)

文章目录 1. 概述2. 矢量数据源3. 栅格数据源 1. 概述 我们知道将GIS数据大致分成矢量数据和栅格数据&#xff08;地形和三维模型都是兼具矢量和栅格数据的特性&#xff09;。但是如果用来Web环境中&#xff0c;那么使用图片这个栅格形式的数据载体无疑是最为方便的&#xff0…

WebofScience快速检索文献的办法

Web of Science为什么老是搜不到文章&#xff0c;原来是要在这个地方全部勾选 如果是搜标题的话&#xff0c;选Title&#xff0c;输入你要搜的文章标题 另外&#xff0c;也可以在浏览器直接搜文章标题&#xff0c;得到文章的DOI&#xff0c;然后选DOI&#xff0c;直接搜DOI也行…