当前位置: 首页 > news >正文

React远程组件

什么是远程组件?

远程组件指的是从远程服务器动态加载的组件,这些组件可以是React、Vue等框架的组件。

为什么需要远程组件

本质上就是为了解决复用问题,那引出新的问题有几种公共项目代码复用方式?

Git仓库

将公共代码单独抽到一个仓库去维护
优点如下
版本控制: 可以精确控制每个子模块的版本,避免不同项目使用不同版本的共同代码。
独立性: 子模块可以独立于主项目进行开发和发布。
清晰结构: 项目结构清晰,易于管理和理解。
缺点如下
管理复杂: 每次都需要手动更新。

npm包

发布到仓库中,需要的项目npm install
缺点:每次更新版本都需要重新publish

Monorepo

优点
统一管理: 所有相关项目都在同一个仓库中,便于统一管理和版本控制。
原子提交: 可以进行跨项目的原子提交,确保所有相关更改都是一致的。
代码共享: 共享代码可以直接引用,无需额外的包管理或子模块配置。
缺点
仓库大小: 单个仓库可能会变得非常大,影响克隆和拉取的速度。
复杂性: 需要更复杂的工具和流程来管理大型仓库,如 Lerna、Nx 等。
权限管理: 需要更细致的权限管理,确保不同团队成员只能访问他们需要的部分。

使用场景

有些公共组件会频繁的根据需求变更,对于多个项目共用的组件库来说,修改组件其影响范围是不可控的。此外,每次修改公共代码后需要更新版本,有时候可能只是个很小的更新没必要更新整个代码库版本。
因此对于某个经常需要迭代的公共代码/组件可以单独打包放到CDN上动态加载。

优点

1、方便的版本控制。多个项目依赖不同版本,可以打包多分放到CDN上,对应项目加载即可;
2、高效率。通过动态加载,可以在不重新构建和部署整个应用的情况下,更新和扩展前端功能,用户体验也好,可保证用户体验到最新的代码;
3、代码复用,多个项目使用可以有加载;

缺点

1、需要请求对应文件,如果组件太大,加载速度就会慢;
2、如果组件服务崩溃,可能导致组件加载错误,从而使整个业务不可用;

简陋版代码展示

要远程加载的组件源码,写完后建议打包成umd格式。

import { Button, Form } from 'antd/es';
import React from 'react';const YuButton = (props:{p_click?:()=>voidm_click?:()=>void
})=>{const style = { marginRight: 5 };return (<><Button type="primary" onClick={props.p_click} style={style}>主要按钮</Button><Button type="primary" onClick={props.m_click} style={style} loading>主要按钮</Button><Button type="primary" style={style} disabled>禁用</Button></>);
}
const YuText = (props:{Items:{label: string, content:string}[]
})=>{
return props?.Items?.length > 0 ? (<Formname="basic"labelCol={{ span: 8 }}wrapperCol={{ span: 16 }}autoComplete="off">{props.Items.map((item)=>{return <Form.Item  label={item.label}>{item.content}</Form.Item>})}</Form>
) : <div>暂无数据</div>
}export default {YuButton,YuText
}
function App() {return (<div className="App"><header className="App-header"><RemoteComponent  name='YuButton'>Click Me</RemoteComponent><RemoteComponent  name='YuText' Items={[{label:'label', content:"12312"}]}>Click Me</RemoteComponent><RemoteComponent  name='YuText1' Items={[{label:'label', content:"12312"}]}>Click Me</RemoteComponent></header></div>);
}
const RemoteComponent = ({name, children, ...props}) => {const Component = useMemo(() => {return React.lazy(() => fetchComponent(name))}, [name])return (<Suspensefallback={<div style={{alignItems: 'center', justifyContent: 'center', flex: 1}}><span style={{fontSize: 50}}>Loading...</span></div>}><Component {...props}>{children}</Component></Suspense>)
}const fetchComponent = async (name) => {const text = await fetch(`/index.umd.js?ts=${Date.now()}` // 将打包的放到CDN上,这里填写CDN的地址加载这个打包后的js文件).then((res) => {if (!res.ok) {throw new Error('Network response was not ok')}return res.text()})const module = getParsedModule(text, name)if(Object.keys(module.exports).includes(name)){return {default: module.exports[name]} // 这里我们可以得到打包后的组件}return {default: ()=> <div style={{color:'red'}}>加载失败</div>}
}const packages = { // 需要什么包传什么包(为了减小打包体积),或者在打包的时候将这些需要的包一起打包进去react: React,'antd/es': {Button, Form}
}
const getParsedModule = (code) => {let module = {exports: {},}const require = (name) => {return packages[name]}Function('require, exports, module', code)(require, {}, module)// 打包UMD格式的话把这些传进去return module
}

效果展示

在这里插入图片描述

相关文章:

React远程组件

什么是远程组件&#xff1f; 远程组件指的是从远程服务器动态加载的组件&#xff0c;这些组件可以是React、Vue等框架的组件。 为什么需要远程组件 本质上就是为了解决复用问题&#xff0c;那引出新的问题有几种公共项目代码复用方式&#xff1f; Git仓库 将公共代码单独抽…...

ssm教师上课系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 [2 系统…...

【C】分支和循环--猜数字游戏

分支和循环 练习&#xff1a;猜数字游戏 游戏要求&#xff1a; 1&#xff1b;电脑自动生成1~100的随机数 2&#xff1b;玩家猜数字&#xff0c;猜数字的过程中&#xff0c;根据猜测数据的大小给出大了或小了的反馈&#xff0c;直到猜出&#xff0c;游戏结束 随机数生成 函数…...

Liunx 操作redis

1,到Liunx的redis的安装目录下/home/redis/redis-7.2.3/src 执行命令 ./redis-cli2,执行命令后&#xff0c;出现以下 127.0.0.1:6379>3,输入密码 127.0.0.1:6379> AUTH 你的密码4,切换db库 127.0.0.1:6379> SELECT 55,操作命令 查看当前 db库的缓存 127.0.0.1:63…...

C#教程笔记

C#开发的程序依附.NET平台 编译器->IL中间语言->CLR->机器指令 .NET CORE平台 跨平台 .cs后缀名 快捷键 CtrlKD格式化CtrlL或CtrlX删除一行CtrlY反撤销cwTab快速生成命令行输出Ctrl空格或CtrlJ获取提示///方法注释CtrlMO代码全部折叠CtrlML代码全部展开 上升沿0变1 安…...

Docker 部署 RocketMQ

1.拉取RocketMQ镜像 这里以dockerhub上 RocketMQ 5.2.0版本的镜像为例&#xff0c;介绍部署过程。 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/rocketmq:5.2.02.创建容器共享网络 RocketMQ 中有多个服务&#xff0c;需要创建多个容器&#xff0c;创建 docke…...

linux安装mysql数据库(最完整的yum源安装)

1.下载YUM库 wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm这里介绍一下wegt命令 wget 是一个非常强大的命令行工具&#xff0c;用于从网络上下载文件。它支持HTTP、HTTPS和FTP协议&#xff0c;并且可以通过HTTP代理进行下载。以下是 wget 的…...

工业物联网关-TCP透传

TCP透传功能提供类似于DTU(Data Transmit Unit)的功能&#xff0c;用户在网络端使用TCP协议连接网关&#xff0c;与串口通道绑定&#xff0c;建立起TCP与串口的通道&#xff0c;网关相当于一个中转点。 菜单选择"数据上行-tcp透传"&#xff0c;查看当前透传通道列表&…...

sentinel原理源码分析系列(六)-统计指标

调用链和统计节点构建完成&#xff0c;进入统计指标插槽&#xff0c;统计指标在最后执行的&#xff0c;等后面的插槽执行完&#xff0c;资源调用完成了&#xff0c;根据资源调用情况累计。指标统计是最重要的插槽&#xff0c;所有的功能都依靠指标数据&#xff0c;指标的正确与…...

【代理模式使用场景】

一般来说&#xff0c;代理模式使用场景是远程代理、虚拟代理、安全代理等。下面来详细介绍下这三个场景是什么&#xff0c;实现原理和特点。不过在介绍三个场景前&#xff0c;我们还是先来回顾下代理模式。 代理模式 定义 是结构型设计模式&#xff0c;引入一个对象控制对另…...

ARM-8 代码还原动态调试之 pstree 条件表达式

out_string(lvl level - 1 ? last ? sym->last_2 : sym->branch_2 : more[lvl 1] ? sym->vert_2 : sym->empty_2); 条件表达式执行顺利&#xff1a; lvl level - 1 ? last ? sym->last_2 : sym->branch_2 : more[lvl 1] ?…...

Spring Boot技术栈在电影评论网站中的应用

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…...

DDOS防护

DDoS攻击简介 分布式拒绝服务&#xff08;DDoS&#xff09;攻击是一种网络攻击方式&#xff0c;通过控制大量的受感染系统&#xff08;称为“僵尸网络”&#xff09;向目标服务器发送大量的网络流量或请求&#xff0c;目的是使目标服务器超载&#xff0c;无法提供正常服务。这…...

【Vue】Vue(九)OptionsAPI与CompositionAPI的区别

文章目录 OptionsAPI与CompositionAPI在代码使用和逻辑上的区别一、代码使用方面的区别&#xff08;一&#xff09;组件定义的结构&#xff08;二&#xff09;响应式数据的定义与使用&#xff08;三&#xff09;逻辑复用的实现方式 二、逻辑方面的区别&#xff08;一&#xff0…...

MySQL 【日期】函数大全(四)

目录 1、MAKEDATE() 根据年份和一年中天数创建一个日期并返回。 2、MAKETIME() 指定的时、分、秒创建一个时间并返回。 3、MINUTE() 函数提取并返回时间的分钟部分。 4、MONTH() 函数提取日期的月份部分并作为数字返回。 5、MONTHNAME() 返回给定日期的月份的名字。 6、N…...

Jlink 直接读取单片机数据

1. 驱动版本 因人而异&#xff0c;这里我使用的是 “J-Flash V6.96” 本人驱动链接&#xff1a;夸克网盘 提取码&#xff1a;rgzk 2. 打开软件 3. 创建jlink工程 4. 选择芯片 此处本人使用芯片 “STM32F103VCT6” 5. 连接单片机 连接成功反馈 6. 读取单片机内部数据 …...

VScode运行C语言终端输出中文乱码问题解决方案

VScode运行C语言输出中文乱码问题解决方案 由于 VSCode 的终端是对系统的 cmd 命令行工具的调用&#xff0c;而 cmd 的默认编码为 GBK。当我们在 VSCode 中以 UTF-8 编码进行代码编写且代码里含有中文字符时&#xff0c;在终端运行代码便会出现中文乱码现象。要解决此问题&…...

Leetcode刷题. 贪心算法

贪心算法&#xff1a; 比较传统的解释&#xff1a;将整个问题拆解为几个小问题&#xff0c;找到小问题的最优解&#xff0c;加起来就是整个问题的全局最优解。对于现在的我理解贪心就是一种感觉&#xff0c;给出证明很难&#xff0c;解题思路一般就是认真读题&#xff0c;发掘题…...

强化学习的数学原理-01基本概念

state: T h e s t a t u s o f a g e n t w i t h r e s p e c t t o t h e e n v i r o n m e n t The \quad status \quad of \quad agent \quad with \quad respect \quad to \quad the \quad environment Thestatusofagentwithrespecttotheenvironment (agent 相对于环境的…...

D41【python 接口自动化学习】- python基础之函数

day41 函数参数传递错误 学习日期&#xff1a;20241018 学习目标&#xff1a;函数&#xfe63;-54 避坑指南&#xff1a;列表作为参数传递出错了怎么办&#xff1f; 学习笔记&#xff1a; 列表类型的特殊性 list1[x,y,z] tuple1(list1,b,c)# 修改元组中的列表&#xff0c;会…...

跨设备移动计算的挑战与突破:Portable-VirtualBox实现系统随身化方案

跨设备移动计算的挑战与突破&#xff1a;Portable-VirtualBox实现系统随身化方案 【免费下载链接】Portable-VirtualBox Portable-VirtualBox is a free and open source software tool that lets you run any operating system from a usb stick without separate installatio…...

AI+经济学:当因果推断遇上强化学习,如何重塑政策与市场?

AI经济学&#xff1a;当因果推断遇上强化学习&#xff0c;如何重塑政策与市场&#xff1f;当经济学家还在为模型的假设争论不休时&#xff0c;AI已经学会了从数据洪流中直接“阅读”经济的脉搏。这不是替代&#xff0c;而是一场工具箱的全面升级。引言 在数字经济时代&#xff…...

Phi-4-mini-reasoning实战案例:为数学竞赛平台提供实时解题思路生成API

Phi-4-mini-reasoning实战案例&#xff1a;为数学竞赛平台提供实时解题思路生成API 1. 项目背景与需求 数学竞赛平台"MathMaster"面临一个关键挑战&#xff1a;如何为参赛学生提供实时、准确的解题思路指导。传统人工解答方式存在响应慢、成本高、覆盖范围有限等问…...

OpenClaw隐私保护机制:Qwen3.5-9B-AWQ-4bit处理证件照自动打码

OpenClaw隐私保护机制&#xff1a;Qwen3.5-9B-AWQ-4bit处理证件照自动打码 1. 为什么需要自动化隐私保护 去年帮家人整理电子档案时&#xff0c;我遇到了一个棘手问题&#xff1a;上百张包含身份证、银行卡的照片需要手动打码。用PS一张张处理不仅耗时&#xff0c;还容易遗漏…...

PaveBench:一个用于路面病害感知与交互式视觉语言分析的多功能基准

作者 Dexiang Li, Zhenning Che, Haijun Zhang∗, Dongliang Zhou∗, Zhao Zhang, Yahong Han ∗ 通讯作者 https://arxiv.org/pdf/2604.02804v1 摘要 路面状况评估对道路安全与养护至关重要。现有研究已取得显著进展。然而&#xff0c;大多数研究侧重于分类、检测和分割等传统…...

破局Xbox存档困境:XGP-save-extractor技术原理与实战指南

破局Xbox存档困境&#xff1a;XGP-save-extractor技术原理与实战指南 【免费下载链接】XGP-save-extractor Python script to extract savefiles out of Xbox Game Pass for PC games 项目地址: https://gitcode.com/gh_mirrors/xg/XGP-save-extractor 用户痛点场景剧场…...

5分钟成为Switch游戏安装专家:Awoo Installer终极指南

5分钟成为Switch游戏安装专家&#xff1a;Awoo Installer终极指南 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer 还在为Switch游戏安装而烦恼吗&a…...

5种手柄映射方案让手游玩家实现主机级操控体验

5种手柄映射方案让手游玩家实现主机级操控体验 【免费下载链接】escrcpy &#x1f4f1; Display and control your Android device graphically with scrcpy. 项目地址: https://gitcode.com/GitHub_Trending/es/escrcpy 手机游戏操控优化一直是困扰玩家的核心痛点&…...

SpringCloud之分布式基础

1.单体架构单体架构是将所有业务功能&#xff08;商品、订单、用户、支付、物流等&#xff09;打包在一个应用项目中&#xff0c;部署在同一台服务器上的传统架构模式。架构流程&#xff1a;用户 → 通过域名&#xff08; gulishop.com &#xff09;访问 → 绑定服务器公网 IP …...

业务流程及业务流程优化

业务流程业务流程是指为了实现特定业务目标&#xff0c;将一系列相互关联的活动、任务按照一定的顺序和规则进行组织和执行的过程。它涵盖了从业务起始到结束的整个过程&#xff0c;涉及到人员、设备、信息等多种资源的协调与运用。以下是对业务流程的详细阐述&#xff1a;构成…...