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

前端远端SDK组件加载方案

背景

  作者维护的可视化搭建平台所提供的投放数据配置表单是基于搭建物料中配置的JSON Schema经过统一的渲染生成的,这就意味着:表单项的类型是预先约定好的,虽然这可以满足业务绝大部分的诉求,但是总有一些高度定制的配置项需要支持业务自定义。作为一个通用的平台,内部耦合业务逻辑是个很愚蠢的办法,所以便开了业务自定义扩展渲染组件的口子。

原理

  支持UMD类型的像InputSelect这些基础组件一样的可用于表单渲染的组件通过cdn远程加载。

组件设计

  要想使用UMD的组件首先要做一个容器组件用于渲染。同时该容器组件又要用于表单渲染。所以组件props设计如下:

interface PropsType {render?: {name: string;  // library name entry: string; // 自定义渲染组件 umd 格式 urlstyle: string; // 自定义渲染组件 css文件};value: any;onChange: (value: any) => void;[x: string]: any; // 业务自定义参数
}

render参数用于组件渲染,其他参数用于组件逻辑

组件核心逻辑

CustomRender

const CustomRender: React.FC<PropsType> = (props) => {const {render,...otherProps} = props;const [Com, setCom] = useState<any>();useEffect(() => {if (!render?.entry) {return;}(async () => {// 加载UMD组件const C = await importScript(render?.entry, render?.name);// 加载组件样式render?.style && importStyle(render?.style);setCom(() => C);})();}, [render?.entry]);return (<ErrorBoundary fallback={<div>配置项加载失败</div>}><div>{Com ? <Com {...otherProps} /> : <div>加载中...</div>}</div></ErrorBoundary>);
};

importScript

export const importScript = (() => {// 自执行函数,创建一个闭包,保存 cache 结果const cache: { [x: string]: any } = {};return (url: string, name?: string) => {// 如果有缓存,则直接返回缓存内容if (cache[url]) return Promise.resolve(cache[url]);return new Promise((resolve, reject) => {// 保存最后一个 window 属性 keyconst lastWindowKey = Object.keys(window).pop();// 创建 scriptconst script = document.createElement('script');script.setAttribute('src', url);document.head.appendChild(script);// 监听加载完成事件script.addEventListener('load', () => {document.head.removeChild(script);// 最后一个新增的 key,就是 umd 挂载的,可自行验证const newLastWindowKey = name || Object.keys(window).pop();console.log('newLastWindowKey', newLastWindowKey);// 获取到导出的组件const res = lastWindowKey !== newLastWindowKey ? window[newLastWindowKey] : {};const Com = res.default ? res.default : res;cache[url] = Com;resolve(Com);});// 监听加载失败情况script.addEventListener('error', (error) => {reject(error);});});};
})();

importStyle

export const importStyle = (() => {return (url: string) => {if (document.querySelector(`link[href='${url}']`)) {return;}return new Promise((resolve, reject) => {// 创建 linkconst link = document.createElement('link');link.setAttribute('rel', 'stylesheet');link.setAttribute('href', url);document.head.appendChild(link);// 监听加载完成事件link.addEventListener('load', () => {resolve(link);});// 监听加载失败情况link.addEventListener('error', (error) => {reject(error);});});};
})();

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java 入门指南:Map 接口
  • 航空制造领域中三维工艺技术的应用
  • 更换 CentOS 7 YUM 源至国内镜像:简易教程与操作指南
  • SAP与生产制造MPM系统集成案例
  • 位图
  • VS2022 QT环境显示中文乱码问题
  • 一种低成本RS485光耦脉宽补偿电路
  • Qt是不是经常写个QWidget输入参数?
  • 2024年第十五届蓝桥杯图形化省赛真题分享包含答案
  • RabbitMQ 是什么?应用场景有哪些?
  • 字节跳动-生活服务-java后端-一面
  • 基于yolov8的绝缘子缺陷检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
  • (每日一问)基础知识:堆与栈的区别
  • mac m1 配置 frp
  • 如何让ChatGPT说话更像人类
  • 【Amaple教程】5. 插件
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • create-react-app项目添加less配置
  • CSS 三角实现
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • JAVA 学习IO流
  • JavaScript创建对象的四种方式
  • JAVA多线程机制解析-volatilesynchronized
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • js 实现textarea输入字数提示
  • k8s如何管理Pod
  • Laravel 中的一个后期静态绑定
  • Node项目之评分系统(二)- 数据库设计
  • Solarized Scheme
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 规范化安全开发 KOA 手脚架
  • 简单易用的leetcode开发测试工具(npm)
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 学习HTTP相关知识笔记
  • 阿里云API、SDK和CLI应用实践方案
  • ​VRRP 虚拟路由冗余协议(华为)
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (1)Android开发优化---------UI优化
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (Java入门)学生管理系统
  • (WSI分类)WSI分类文献小综述 2024
  • (安卓)跳转应用市场APP详情页的方式
  • (二)Eureka服务搭建,服务注册,服务发现
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (区间dp) (经典例题) 石子合并
  • (三)elasticsearch 源码之启动流程分析
  • (十三)Maven插件解析运行机制
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)Windows2003安全设置/维护
  • (转)负载均衡,回话保持,cookie
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...