微前端-monorepo-无界

news2024/11/29 11:55:03

文章目录

  • 前言
  • 一、微前端
  • 二 、monorepo
  • 三 、pnpm
    • 硬链接
    • 软链接(符号链接)
    • 幽灵依赖
    • 依赖安装耗时长
    • monorepo项目搭建
    • 子模块复用
  • 四、无界
    • 接入无界
    • 无界预加载
    • 无界传参
  • 总结


前言

本文主要记录微前端框架 无界 的使用与理解以及monorepo代码管理方式。


一、微前端

如今项目体积越来越大,导致维护成本增加,后端以微服务形式将项目拆成不同的服务,前端也需要对项目进行拆解,以达到长久发展的可能性。
在我理解中,微前端就是将前端以某种规则进行隔离,在隔离中也能进行远程访问其他小应用,不受技术栈的影响,带来更多的可能性与可维护性。


二 、monorepo

  • monorepo是一个单仓库多应用的代码管理方式,多个项目集成到一个仓库下,共享工程配置,同时又快捷地共享模块代码。
  • 中大型项目,多模块项目monorepo更适合管理代码,对调试、开发都有很大的帮助。

注:在使用monorepo方式管理项目时,会产生诸多问题,如幽灵依赖、依赖安装耗时的问题,需要使用pnpm进行解决这类问题。


三 、pnpm

  • 项目依赖在基于npm时,每个项目都有自己的项目依赖,都需要保存在本地,而pnpm则时将相同依赖项目的依赖包放在同一个位置,让不同项目共享同一个个依赖包,节约硬盘空间,提升了安装速度。
  • 针对不同版本的依赖,则只会保存不同的文件,不会将所有文件都保存

硬链接

共享了同一个硬盘地址
pnpm通过硬链接直接指向 pnpm仓库 依赖包在硬盘的地址

软链接(符号链接)

只会记录路径,不占用资源
如果依赖包之间有相互依赖,则会通过软连接指向该依赖路径,不会指向硬盘地址。

pnpm

幽灵依赖

npm/yarn 安装依赖时,存在依赖提升,某个项目使用的依赖,并没有在其 package.json 中声明,也可以直接使用,这种现象称之为 “幽灵依赖”;随着项目迭代,这个依赖不再被其他项目使用,不再被安装,使用幽灵依赖的项目,会因为无法找到依赖而报错。

使用pnpm可以解决此类问题

依赖安装耗时长

MonoRepo 中每个项目都有自己的 package.json 依赖列表,随着 MonoRepo 中依赖总数的增长,每次 install 时,耗时会较长。

MonoRepo 中每个项目都有自己的 package.json 依赖列表,随着 MonoRepo 中依赖总数的增长,每次 install 时,耗时会较长。

monorepo项目搭建

项目构建需要一个注应用来搭载各个子应用,在安装依赖时需要在最外层创建 pnpm-workspace.yaml 配置文件,通过配置就可以轻松的下载所有项目的依赖。这样会将子项目中公共的依赖提取到外层modules中
项目结构

packages:
  # all packages in direct subdirs of packages/
  - 'main'
  # all packages in subdirs of components/
  - 'web/**'
  • 在外层目录下可以通过 pnpm -F <子项目文件名> <命令> 的形式执行子项目中的命令

子模块复用

  • 在外层创建common文件,将应用公共的模块提取到该文件夹下,比如axios等。
  • 在主项目main目录下,执行 pnpm -F <项目名称> add common

commob依赖

这样就可以直接在项目中使用common中的东西

import {a} from 'common'

四、无界

对于一些常见的微前端框架(qiankun、micro-app、EMP),对vite都不太友好,所以这里采用无界来搭建微前端框架

特点

  • 接入简单只需要四五行代码
  • 不需要针对vite额外处理
  • 预加载
  • 应用保活机制

不足

  • 隔离js使用一个空的iframe进行隔离
  • 子应用axios需要自行适配
  • iframe沙箱的src设置了主应用的host,初始化iframe的时候需要等待iframe的location.orign从’about:blank’初始化为主应用的host,这个采- - 用的计时器去等待的不是很优雅。
  • 底层原理 使用shadowDom 隔离css,js使用空的iframe隔离,通讯使用的是proxy

接入无界

  • 在主项目main目录下安装wujie
pnpm i wujie
  • 在主项目main目录下安装对应类型项目的封装插件,该插件是对wujie的封装,从而使wujie的使用更快捷
pnpm i wujie-vue3
  • 在主应用main.ts中引入对应的wujie框架,并注册
import Wujie from 'wujie-vue3'
app.use(router).use(Wujie)
  • 子应用的使用,在主应用中使用WujieVue标签进行使用,在url中传入应用启动地址
  <WujieVue url="http://localhost:5174/" name="vue3"></WujieVue> 
  <WujieVue url="http://localhost:5175/" name="react"></WujieVue> 

界面效果

注:官网只对vue和react进行了封装其他框架需要自行封装

无界预加载

预加载能力可以极大的提升子应用打开的首屏时间

只需要在preloadApp中将 exec 设置为true即可

在主项目下main.ts文件中配置exec

preloadApp({url:"http://localhost:5174/", name:"vue3",exec: true})
preloadApp({url:"http://localhost:5175/", name:"react",exec: true})

由于子应用提前渲染可能会导致阻塞主应用的线程,所以无界提供了类似 react-fiber 方式来防止阻塞线程
react-fiber模拟了requestIdleCallback API ,预加载都被requestIdleCallback包裹,在浏览器空闲的时候提前预加载一些内容
requestIdleCallback API会有两种情况:

  • 浏览器在每一帧执行一系列任务,如果有剩余时间就执行 requestIdleCallback
    • 处理用户事件
    • 执行定时器任务
    • 执行requestAnimationFrame动画
    • 执行dom的回流与重绘
    • 计算更新图层的绘制指令
    • 绘制指令合并主线程
  • 浏览器没有任务执行,会有50ms空余时间去执行 requestIdleCallback

无界传参

无界的通讯系统又三种方式进行通讯分别是:

  • props通讯

主应用可以通过props注入数据和方法:

<WujieVue name="xxx" url="xxx" :props="{ data: xxx, methods: xxx }"></WujieVue>

子应用可以通过$wujie来获取:

const props = window.$wujie?.props; // {data: xxx, methods: xxx}

props通讯

  • window通讯
    主应用调用子应用的全局数据
window.document.querySelector("iframe[name=子应用id]").contentWindow.xxx;

子应用调用主应用的全局数据

window.parent.xxx;

window通讯

  • eventBus通讯
    发布订阅模式的通讯
    主应用使用方式:
// 如果使用wujie
import { bus } from "wujie";

// 如果使用wujie-vue
import WujieVue from "wujie-vue";
const { bus } = WujieVue;

// 如果使用wujie-react
import WujieReact from "wujie-react";
const { bus } = WujieReact;

// 主应用监听事件
bus.$on("事件名字", function (arg1, arg2, ...) {});
// 主应用发送事件
bus.$emit("事件名字", arg1, arg2, ...);
// 主应用取消事件监听
bus.$off("事件名字", function (arg1, arg2, ...) {});

子应用使用方式:

// 子应用监听事件
window.$wujie?.bus.$on("事件名字", function (arg1, arg2, ...) {});
// 子应用发送事件
window.$wujie?.bus.$emit("事件名字", arg1, arg2, ...);
// 子应用取消事件监听
window.$wujie?.bus.$off("事件名字", function (arg1, arg2, ...) {});


总结

本文主要记录了微前端无界的使用与理解。

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

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

相关文章

小红书群禁言

群禁言在2023上半年炒得沸沸扬扬&#xff0c;结果官方一个关闭接口操作&#xff0c;谁都没办法了 不过还好&#xff0c;现在有了完美的解决方案&#xff1a;群撤回助手&#xff01; 24小时帮你管群&#xff0c;自定义规则、白名单&#xff0c;有广告自动秒撤&#xff01;多发广…

PyQt6 GUI界面设计和Nuitka包生成exe程序(全笔记)

PyQt6 GUI界面设计和Nuitka包,生成exe程序全笔记 目录一、PyQt6包安装1.1 进行环境配置和安装1.2 检查包是否安装成功。1.3 运行desinger.exe二、GUI界面设计,写程序,并能运行成功。三、Nuitka打包生成exe程序3.1 做Nuitka安装准备工作(1)安装C编译器,设置环境变量3.2 安…

Mysql优化原理分析

一、存储引擎 1.1 MyISAM 一张表生成三个文件 xxx.frm&#xff1a;存储表结构xxx.MYD&#xff1a;存储表数据xxx.MYI&#xff1a;存储表索引 索引文件和数据文件是分离的&#xff08;非聚集&#xff09; select * from t where t.col1 30; 先去t.MYI文件查找30对应的索引…

赴日IT 如何提高去日本做程序员的几率?

其实想去日本做IT工作只要满足学历、日语、技术三个必要条件&#xff0c;具备这些条件应聘就好&#xff0c;不具备条件你就想办法具备这些条件&#xff0c;在不具备条件之前不要轻易到日本去&#xff0c;日本IT行业虽然要求技术没有国内那么高&#xff0c;但也不是随便好进入的…

通过RD Client远程连接windows电脑踩坑点

通过RD Client远程连接windows电脑操作的个人踩坑点&#xff0c;记录下来&#xff0c;防止下一次还犯。 配置&#xff1a; win10专业版腾讯云服务器Ubuntu22.04小米平板RD client 首先是安装frp 这一部分参考的是&#xff1a;通过RD Client远程连接windows电脑&#xff08;…

FireFox禁用HTTP2

问题 最近需要调试接口&#xff0c;但是&#xff0c;Chrome都是强制使用h2协议&#xff0c;即HTTP/2协议。为了排除h2协议排除对接口调用的影响&#xff0c;需要强制浏览器使用HTTP1协议。 解决 FireFox 设置firefox的network.http.http2.enabled为禁用&#xff0c;这样就禁…

【数据分享】2006-2021年我国城市级别的集中供热相关指标(免费获取\20多项指标)

《中国城市建设统计年鉴》中细致地统计了我国城市市政公用设施建设与发展情况&#xff0c;在之前的文章中&#xff0c;我们分享过基于2006-2021年《中国城市建设统计年鉴》整理的2006—2021年我国城市级别的市政设施水平相关指标、2006-2021年我国城市级别的各类建设用地面积数…

Nginx百科之gzip压缩、黑白名单、防盗链、零拷贝、跨域、双机热备

引言 早期的业务都是基于单体节点部署&#xff0c;由于前期访问流量不大&#xff0c;因此单体结构也可满足需求&#xff0c;但随着业务增长&#xff0c;流量也越来越大&#xff0c;那么最终单台服务器受到的访问压力也会逐步增高。时间一长&#xff0c;单台服务器性能无法跟上业…

Hadoop 集群小文件归档 HAR、小文件优化 Uber 模式

文章目录 小文件归档 HAR小文件优化 Uber 模式 小文件归档 HAR 小文件归档是指将大量小文件合并成较大的文件&#xff0c;从而减少存储开销、元数据管理的开销以及处理时的任务调度开销。 这里我们通过 Hadoop Archive (HAR) 来进行实现&#xff0c;它是一种归档格式&#xf…

xss-labs靶场通关详解

文章目录 前言level1level2level3level4level5level6level7level8level9level10level11level12level13level14level15level16level17level18level19&level20 前言 赶着假期结尾的时候&#xff0c;赶紧给自己找点任务做。现在对xss还是一知半解&#xff0c;只是了解个大概&a…

红黑树及其应用介绍(万字长文)

红黑树 定义与性质 红黑树是一种特殊的二叉查找树&#xff0c;它遵循了特定的规则使得其具有了平衡性。红黑树的定义包括以下几个方面&#xff1a; 每个节点要么是红色&#xff0c;要么是黑色。根节点是黑色的。每个叶子节点&#xff08;NIL节点&#xff0c;空节点&#xff…

使用c的标准库函数创建线程

#include <stdio.h> #include <threads.h> #include <time.h>int thrd_proc(void * varg){// 打印10次int times 10;struct timespec ts {1,0}; // 1秒, 0纳秒while(times--){printf("%s\n",(char *)varg);// 每隔1秒,打印一次thrd_sleep(&t…

23062网络编程day4

作业&#xff1a; 多进程并发服务器根据流程图重新编写。 #include <myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr,"__%d__",__LINE__);\perror(msg);}while(0) #define PORT 8888 #define IP "192.168.114.104" void handler(int sig) {whi…

ELK安装、部署、调试(四)KAFKA消息队列的安装和部署

1.简介 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。 这种动作&#xff08;网页浏览&#xff0c;搜索和其他用户的行动&#xff09;是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通…

【docker】运行redis

拉取redis镜像 有多种选择&#xff1a; redis&#xff08;基础版&#xff09;redis/redis-stack&#xff08;包含redis stack server和RedisInsight&#xff09;redis/redis-stack-server&#xff08;仅包含redis stack server&#xff09; docker pull redis docker pull r…

AE2018 安装过程

双击打开安装包&#xff0c;大概等五分钟后。 出现下边安装界面。 安装成功。 可以将图标发送到桌面快捷方式。

用列表实现堆栈和用列表实现队列(实现队列最好用 collections.deque)学习

实现队列的代码测试 from collections import dequedeque1 deque([a, b, c]) deque1.append(1) deque1.append(2) deque1.append(3) for i in range(4,20):deque1.append(i)print(deque1)deque1.popleft()print(deque1)运行结果 E:\Python\Python38\python.exe D:/pythonpro…

零撸大肉,赛博尔Seppol游戏,无限制闯关打碎片,装备,直接变现项目。

2023年7月10日&#xff0c;在上海外滩酒店—— 由来自硅谷、华尔街的技术先锋&#xff0c;与中国科技翘楚阿里、腾讯的骨干团队联手呈现&#xff0c;区块链元宇宙游戏塞波尔 Seppol于上海精彩亮相路演。 1&#xff0c;栖息之地&#xff0c;宠物可放入栖息之地进行挖矿&#xf…

在css中设计好看的阴影

在css中设计好看的阴影 在本文中&#xff0c;我们将学习如何将典型的盒子阴影转换为更好看的的阴影。 统一角度 当我们想要一个元素有阴影时&#xff0c;会添加box-shadow属性并修改其中的数字&#xff0c;直到满意为止。 问题是&#xff0c;通过像这样单独创建每个阴影&…

ctfshow—萌新—杂项1

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up ed400fbcff269bd9c65292a97488168a 首先这是一个md5&#xff0c;然后在线解密一下&#xff0c;解密站点 https://www.somd5.com/ 解密出来的内容是helloctf 然后去掉ctf就是最终的答案 结果就是flag{hello}…