前端远端SDK组件加载方案

2024-08-29 16:28

本文主要是介绍前端远端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);});});};
})();

这篇关于前端远端SDK组件加载方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1118369

相关文章

SpringBoot3.X 整合 MinIO 存储原生方案

《SpringBoot3.X整合MinIO存储原生方案》本文详细介绍了SpringBoot3.X整合MinIO的原生方案,从环境搭建到核心功能实现,涵盖了文件上传、下载、删除等常用操作,并补充了... 目录SpringBoot3.X整合MinIO存储原生方案:从环境搭建到实战开发一、前言:为什么选择MinI

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

前端如何通过nginx访问本地端口

《前端如何通过nginx访问本地端口》:本文主要介绍前端如何通过nginx访问本地端口的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、nginx安装1、下载(1)下载地址(2)系统选择(3)版本选择2、安装部署(1)解压(2)配置文件修改(3)启动(4)

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

HTML中meta标签的常见使用案例(示例详解)

《HTML中meta标签的常见使用案例(示例详解)》HTMLmeta标签用于提供文档元数据,涵盖字符编码、SEO优化、社交媒体集成、移动设备适配、浏览器控制及安全隐私设置,优化页面显示与搜索引擎索引... 目录html中meta标签的常见使用案例一、基础功能二、搜索引擎优化(seo)三、社交媒体集成四、移动

HTML input 标签示例详解

《HTMLinput标签示例详解》input标签主要用于接收用户的输入,随type属性值的不同,变换其具体功能,本文通过实例图文并茂的形式给大家介绍HTMLinput标签,感兴趣的朋友一... 目录通用属性输入框单行文本输入框 text密码输入框 password数字输入框 number电子邮件输入编程框

HTML img标签和超链接标签详细介绍

《HTMLimg标签和超链接标签详细介绍》:本文主要介绍了HTML中img标签的使用,包括src属性(指定图片路径)、相对/绝对路径区别、alt替代文本、title提示、宽高控制及边框设置等,详细内容请阅读本文,希望能对你有所帮助... 目录img 标签src 属性alt 属性title 属性width/h