micro-app【微前端系列教程】2025最新版

micro-app 官网 https://jd-opensource.github.io/micro-app/docs.html#/

项目搭建

https://blog.csdn.net/weixin_41192489/article/details/143164336

路由

https://blog.csdn.net/weixin_41192489/article/details/145034614

生命周期

https://blog.csdn.net/weixin_41192489/article/details/145038406

通信

https://blog.csdn.net/weixin_41192489/article/details/145051057

原理解析

JS 隔离

通过自定义的window、document拦截子应用的JS操作,实现一个相对独立的运行空间,避免全局变量污染,让每个子应用都拥有一个相对纯净的运行环境。

样式隔离

<micro-app>标签作为样式作用域,利用标签的name属性为每个样式添加前缀,将子应用的样式影响禁锢在当前标签区域。

.test {
  color: red;
}

/* 转换为 */
micro-app[name=xxx] .test {
  color: red;
}

元素隔离

micro-app模拟实现了类似ShadowDom的功能,元素不会逃离<micro-app>元素边界

  • 子应用只能操作自身的元素
  • 主应用可操作子应用元素

资源路径自动补全

子应用中相对地址的资源会自动补全路径,如

子应用中引用图片/myapp/test.png,在最终渲染时会补全为http://localhost:8080/myapp/test.png

子应用常用操作

判断是否在微前端环境中

if (window.__MICRO_APP_ENVIRONMENT__) {
  console.log('我在微前端环境中')
}

获取应用的name值

window.__MICRO_APP_NAME__

判断当前应用是否是主应用

if (window.__MICRO_APP_BASE_APPLICATION__) {
  console.log('我是主应用')
}

获取真实window

默认情况下子应用window指向代理对象,通过rawWindow可以获取真实window。

window.rawWindow

获取真实document

默认情况下子应用document指向代理对象,通过rawDocument可以获取真实document。

window.rawDocument

资源过滤

方式1 – excludeAssetFilter

在start中注册excludeAssetFilter过滤函数,可以指定部分特殊的动态加载的微应用资源(css/js) 不被 micro-app 劫持处理。

// index.js
import microApp from '@micro-zoe/micro-app'

microApp.start({
  excludeAssetFilter (assetUrl) {
    if (assetUrl === 'xxx') {
      return true // 返回true则micro-app不会劫持处理当前文件
    }
    return false
  }
})

方式2 – 配置 exclude 属性

在link、script、style等元素上设置exclude属性过滤这些资源,当micro-app遇到带有exclude属性的元素会进行删除。

<link rel="stylesheet" href="xx.css" exclude>
<script src="xx.js" exclude></script>
<style exclude></style>

keep-alive模式

在应用之间切换时,保留这些应用的状态,以便恢复用户的操作行为和提升重复渲染的性能。

开启keep-alive后,应用卸载时不会销毁,而是推入后台运行。

<micro-app name='xx' url='xx' keep-alive></micro-app>

开启keep-alive后,生命周期的变化和对 appstate-change 事件的监听方法详见官网

应用嵌套

如子应用A嵌套子应用B,子应用B嵌套子应用C

  • 无论嵌套多少层,name都要保证全局唯一

步骤1

在B应用中自定义tagName

import microApp from '@micro-zoe/micro-app';

microApp.start({
  // 必须是以`micro-app-`开头的小写字母,例如:micro-app-b、micro-app-b-c
  tagName: 'micro-app-xxx', 
})

在B中使用新定义的标签加载C

<micro-app-xxx name='...' url='...'></micro-app-xxx>

步骤2

将B应用切换为umd模式

禁用样式隔离

https://blog.csdn.net/weixin_41192489/article/details/145049601

自定义fetch

通过自定义fetch替换框架自带的fetch,可以修改fetch配置(添加cookie或header信息等等),或拦截HTML、JS、CSS等静态资源。

自定义的fetch必须是一个返回string类型的Promise。

如果跨域请求带cookie,那么Access-Control-Allow-Origin不能设置为*,必须指定域名,同时设置Access-Control-Allow-Credentials: true

import microApp from '@micro-zoe/micro-app'

microApp.start({
  /**
   * 自定义fetch
   * @param {string} url 静态资源地址
   * @param {object} options fetch请求配置项
   * @param {string|null} appName 应用名称
   * @returns Promise<string>
  */
  fetch (url, options, appName) {
    if (url === 'http://localhost:3001/error.js') {
      // 删除 http://localhost:3001/error.js 的内容
      return Promise.resolve('')
    }
    
    const config = {
      // fetch 默认不带cookie,如果需要添加cookie需要配置credentials
      credentials: 'include', // 请求时带上cookie
    }

    return window.fetch(url, Object.assign(options, config)).then((res) => {
      return res.text()
    })
  }
})

性能优化

预加载

  • 预加载即在子应用尚未渲染时提前加载静态资源,从而提升子应用的首次渲染速度。
  • 预加载会在浏览器空闲时间执行

详见官网

资源共享

当多个子应用拥有相同的js或css资源,可以指定这些资源在多个子应用之间共享,在子应用加载时直接从缓存中提取数据,从而提高渲染效率和性能。

方式1 – globalAssets

用于设置全局共享资源,它和预加载的思路相同,在浏览器空闲时加载资源并放入缓存。

// index.js
import microApp from '@micro-zoe/micro-app'

microApp.start({
  globalAssets: {
    js: ['js地址1', 'js地址2', ...], // js地址
    css: ['css地址1', 'css地址2', ...], // css地址
  }
})

方式2 – global 属性

在link、script设置global属性会将文件提取为公共文件,共享给其它应用。

设置global属性后文件第一次加载会放入公共缓存,其它子应用加载相同的资源时直接从缓存中读取内容,从而提升渲染速度。

<link rel="stylesheet" href="xx.css" global>
<script src="xx.js" global></script>

开启 umd 模式

  • 默认模式:子应用在初次渲染和后续渲染时会顺序执行所有js,以保证多次渲染的一致性。
  • umd模式:子应用暴露出mount、unmount方法,此时只在初次渲染时执行所有js,后续渲染只会执行这两个方法,在多次渲染时具有更好的性能和内存表现。

推荐使用umd模式,以获得更好的性能和内存表现,默认模式更适合渲染和卸载不频繁的子应用。

开启方式详见官网

插件系统

详见官网

部署

https://jd-opensource.github.io/micro-app/docs.html#/zh-cn/deploy

调试插件 Micro-App-DevTools

https://jd-opensource.github.io/micro-app/docs.html#/zh-cn/micro-app-devtools

常见问题

资源路径自动补全失效

原因:一些框架和库在特定场景下创建的元素无法被拦截和处理,或者当关闭样式隔离和沙箱时,也会导致自动补全失效。

解决方案:publicPath

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git merge与rebase区别以及实际应用

在 Git 中&#xff0c;merge 和 rebase 是两种将分支的更改合并到一起的常用方法。虽然它们都可以实现类似的目标&#xff0c;但它们的工作方式和效果有所不同。 1. Git Merge 定义&#xff1a;git merge 是将两个分支的历史合并在一起的一种操作。当你执行 git merge 时&…

HTML实战课堂之简单的拜年程序

一、目录&#xff1a; &#xfffc;&#xfffc; 一、目录&#xff1a; 二、祝福 三&#xff1a;代码讲解 &#xff08;1&#xff09;详细解释&#xff1a; 1.HTML部分 2. CSS部分 三、运行效果&#xff08;随机截图&#xff09;&#xff1a; 四、完整代码&#xff1a; 二、祝福…

Postman接口测试03|执行接口测试、全局变量和环境变量、接口关联、动态参数、断言

目录 七、Postman 1、安装 2、postman的界面介绍 八、Postman执行接口测试 1、请求页签 3、响应页签 九、Postman的环境变量和全局变量 1、创建环境变量和全局变量可以解决的问题 2、postman中的操作-全局变量 1️⃣手动设置 2️⃣代码设置 3️⃣界面获取 4️⃣代…

Linux第二课:LinuxC高级 学习记录day01

0、大纲 0.1、Linux 软件安装&#xff0c;用户管理&#xff0c;进程管理&#xff0c;shell 命令&#xff0c;硬链接和软连接&#xff0c;解压和压缩&#xff0c;功能性语句&#xff0c;结构性语句&#xff0c;分文件&#xff0c;make工具&#xff0c;shell脚本 0.2、C高级 …

python学opencv|读取图像(二十九)使用cv2.getRotationMatrix2D()函数旋转缩放图像

【1】引言 前序已经学习了如何平移图像&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;二十七&#xff09;使用cv2.warpAffine&#xff08;&#xff09;函数平移图像-CSDN博客 在此基础上&#xff0c;我们尝试旋转图像的同时缩放图像。 【2】…

logback日志

一、使用两个以上spring环境变量做三目操作 <springProperty name"application_name" scope"context" source"spring.application.name"/><springProperty name"trace_app_name" scope"context" source"sprin…

计算机网络 (34)可靠传输的工作原理

前言 计算机网络可靠传输的工作原理主要依赖于一系列协议和机制&#xff0c;以确保数据在传输过程中能够准确无误地到达目的地。 一、基本概念 可靠传输指的是数据链路层的发送端发送什么&#xff0c;在接收端就收到什么&#xff0c;即保证数据的完整性、正确性和顺序性。由于网…

如何用通俗易懂的方式解释大模型中的SFT,SFT过程需要大量标记的prompt和response吗?

想象你在培训一个超级助理 假设你新买了一个智能管家机器人&#xff0c;它已经看过海量的书籍和资料&#xff08;这就是预训练过程&#xff09;。但是呢&#xff0c;它还不太懂得"做人的艺术"——不知道该用什么语气说话、怎么回应你的需求。 现在你要训练它成为一…

istio-proxy oom问题排查步骤

1. 查看cluster数量 cluster数量太多会导致istio-proxy占用比较大的内存&#xff0c;此时需检查是否dr资源的host设置有配置为* 2. 查看链路数据采样率 若采样率设置过高&#xff0c;在压测时需要很大的内存来维护链路数据。可以调低采样率或增大istio-proxy内存。 检查iop中…

科研绘图系列:R语言绘制分组箱线图(boxplot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图输出系统信息介绍 科研绘图系列:R语言绘制分组箱线图(boxplot) 加载R包 library(ggpubr) library(ggplot2) library(tidyverse) # dev…

【SpringAOP】Spring AOP 底层逻辑:切点表达式与原理简明阐述

前言 &#x1f31f;&#x1f31f;本期讲解关于spring aop的切面表达式和自身实现原理介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &am…

IOS HTTPS代理抓包工具使用教程

打开抓包软件 在设备列表中选择要抓包的 设备&#xff0c;然后选择功能区域中的 HTTPS代理抓包。根据弹出的提示按照配置文件和设置手机代理。如果是本机则会自动配置&#xff0c;只需要按照提醒操作即可。 iOS 抓包准备 通过 USB 将 iOS 设备连接到电脑&#xff0c;设备需解…

Elasticsearch:使用 Playground 与你的 PDF 聊天

LLMs作者&#xff1a;来自 Elastic Toms Mura 了解如何将 PDF 文件上传到 Kibana 并使用 Elastic Playground 与它们交互。本博客展示了在 Playground 中与 PDF 聊天的实用示例。 Elasticsearch 8.16 具有一项新功能&#xff0c;可让你将 PDF 文件直接上传到 Kibana 并使用 Pla…

ClickHouse vs StarRocks 选型对比

一、面向列存的 DBMS 新的选择 Hadoop 从诞生已经十三年了&#xff0c;Hadoop 的供应商争先恐后的为 Hadoop 贡献各种开源插件&#xff0c;发明各种的解决方案技术栈&#xff0c;一方面确实帮助很多用户解决了问题&#xff0c;但另一方面因为繁杂的技术栈与高昂的维护成本&…

机器翻译优缺点

随着科技的飞速发展&#xff0c;机器翻译是近年来翻译行业的热门话题&#xff0c;在人们的生活和工作中日益普及&#xff0c;使用机器能够提高翻译效率&#xff0c;降低成本。尽管关于机器翻译为跨语言交流带来了诸多便利&#xff0c;但在译文的正确率和局限性方面存在一定争议…

【redis初阶】浅谈分布式系统

目录 一、常见概念 1.1 基本概念 2.2 评价指标&#xff08;Metric&#xff09; 二、架构演进 2.1 单机架构 2.2 应用数据分离架构 2.3 应用服务集群架构 2.4 读写分离/主从分离架构 2.5 引入缓存 ⸺ 冷热分离架构 2.6 数据库分库分表 2.7 业务拆分 ⸺ 引入微服务 redis学习&…

【Linux】文件 文件描述符fd

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;Linux 目录 &#x1f33b;个人主页&#xff1a;路飞雪吖~ 一、C文件接口 &#x1f31f;写文件 &#x1f320;小贴士&#xff1a; &#x1f320;stdin && stdout && stderr Linux下…

uni-app如何引入echarts

在uni-app官网的官网插件中找echarts 打开图片对应的echarts&#xff0c;点击下载并导入插件 如果是vue3使用const echarts require(../../uni_modules/lime-echart/static/echarts.min);引入echarts <template><view><view style"width:750rpx; height:…

ue5 GAS 从零开始00

技能属性GAS 技能 属性 创建一个项目c 插件搜索 gameplay 保证这里勾选上 把这三个弄上去 “GameplayAbilities”,“GameplayTags”,“GameplayTasks” 这样就加载了三个模块 一定要先关ue 先关掉ue 生成 如果没编过&#xff0c;你就检查模块名字是不是没写对 一定要…

基于SpirngBoot的家电销售管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…