NocoBase RunJS 动态加载 UMD/AMD 库:ctx.requireAsync() 使用与原理全解析

发布时间:2026/9/17 17:05:16

NocoBase RunJS 动态加载 UMD/AMD 库:ctx.requireAsync() 使用与原理全解析 NocoBase RunJS 动态加载 UMD/AMD 库ctx.requireAsync() 使用与原理全解析【免费下载链接】nocobaseNocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production-proven infrastructure and a WYSIWYG no-code interface, so you get both speed and reliability.项目地址: https://gitcode.com/GitHub_Trending/no/nocobasectx.requireAsync()是 NocoBase RunJS 运行环境中按 URL 异步加载UMD/AMD或挂载到全局的脚本也可加载 CSS的核心 API适用于 JSBlock、JSField、JSItem、JSColumn、事件流、JSAction 等需要按需引入第三方库如 ECharts、Chart.js、FullCalendar UMD 版、jQuery 插件的场景。读完本文你将掌握ctx.requireAsync()的完整参数、URL 简写规则、返回值约定理解其底层基于 RequireJS 与?raw解析的实现原理并能直接写出可运行的真实图表与工具库加载代码。适用场景凡 RunJS 中需按需加载 UMD/AMD/global 脚本或 CSS 的场景均可使用包括 JSBlock、JSField、JSItem、JSColumn、事件流、JSAction 等。典型用途ECharts 图表加载echartsUMD 产物绘制饼图、折线图、柱状图Chart.js加载chart.umd.min.js渲染柱状图、折线图FullCalendarUMD 版加载日历组件dayjsUMD加载日期工具库jQuery 插件在页面注入后按库文档使用全局变量。与 ctx.importAsync() 的分工是UMD/AMD/global 脚本用ctx.requireAsync()ESM 模块用ctx.importAsync()。若库同时提供 ESM 版本应优先使用ctx.importAsync()以获得更好的模块语义与 Tree-shaking 支持。类型定义requireAsyncT any(url: string): PromiseT;参数参数类型说明urlstring脚本或 CSS 地址。支持简写包名版本/文件路径经 ESM CDN 解析时加?raw取原始 UMD 文件或完整 URL。传入.css时加载并注入样式。返回值加载后的库对象即 UMD/AMD 回调的第一个模块值。许多 UMD 库会挂到window如window.echarts此时返回值可能为undefined实际使用时按库文档访问全局变量即可传入.css时返回loadCSS的结果。URL 格式说明简写路径如echarts5/dist/echarts.min.js在默认 ESM CDNesm.sh下会请求https://esm.sh/echarts5/dist/echarts.min.js?raw。?raw用于获取原始 UMD 文件而非 ESM 包装完整 URL可直接写任意 CDN 地址如https://cdn.jsdelivr.net/npm/dayjs1/dayjs.min.jsCSS传入.css结尾的 URL 会加载并注入页面支持example.css?v123这类带 query 的形式。与 ctx.importAsync() 的区别维度ctx.requireAsync()ctx.importAsync()加载目标UMD/AMD/global 脚本ESM 模块典型库ECharts、Chart.js、FullCalendarUMD、jQuery 插件Vue、dayjsESM、Tabulator、dnd-kit返回值UMD/AMD 回调第一个模块值常为库对象或undefined库挂到window模块命名空间对象仅一个 default 导出时直接返回 default加载机制RequireJSAMD浏览器原生import()库同时提供 ESM 与 UMD 时优先用ctx.importAsync()。依赖 React 的库在使用ctx.importAsync()时还需加?depsreact18.2.0,react-dom18.2.0确保与页面共用同一 React 实例详见 ctx.importAsync()。源码实现原理ctx.requireAsync()的实现位于 flowContext.ts核心逻辑分三步this.defineMethod(requireAsync, async (url: string) { // 1. 判断是否为 CSS 文件支持 example.css?v123 等形式 if (isCssFile(url)) { return this.loadCSS(url); } // 2. 解析为完整 CDN URLraw 模式追加 ?raw const u resolveModuleUrl(url, { raw: true }); // 3. 通过 RequireJS 加载 return await runjsRequireAsync(this.requirejs, u); });1. CSS 识别与注入isCssFile来自 resolveModuleUrl.ts去掉?与#后判断扩展名是否为.css。命中后走loadCSS内部创建link relstylesheet并追加到document.head加载失败会reject(new Error(Failed to load CSS: ...))。2. 简写 URL 的?raw解析resolveModuleUrl(url, { raw: true })的逻辑resolveModuleUrl.ts完整 URLhttp:///https://开头原样返回不做任何改写相对/简写路径拼接 CDN 前缀与后缀前缀取window.__esm_cdn_base_url__默认https://esm.shraw 模式在路径后追加?raw若已带 query 则用raw且即使配置了 ESM_CDN_SUFFIX 也不会添加后缀——这正是取 UMD 原始文件而不是 ESM 包装的关键例如dayjs1/dayjs.min.js最终解析为https://esm.sh/dayjs1/dayjs.min.js?raw。3. RequireJS 加载与全局串行锁底层加载由 runjsModuleLoader.ts 中的runjsRequireAsync完成requirejs( [url], (...args: any[]) resolve(args[0]), // 返回回调第一个模块值 reject, );由于 NocoBase 前端整体使用 RequireJSAMD加载插件与模块runjsRequireAsync与runjsImportAsync共用一把存放在globalThis.__nocobaseRunjsModuleLoadLock的全局 Promise 链互斥锁withRunjsModuleLoadLock避免并发加载时对全局对象的临时改动互相干扰无论任务成功或失败都会释放锁防止死锁。4. 编辑器补全与代码片段在 RunJS 代码编辑器中输入ctx.requireAsync()会自动补全为const lib await ctx.requireAsync(https://cdn.example.com/lib.umd.js)相关补全定义见 runjsCompletions.ts内置代码片段sn-require加载 AMD 模块演示了最简用法见 require-amd.snippet.ts。示例基础用法// 简写路径经 ESM CDN 解析为 ...?raw const echarts await ctx.requireAsync(echarts5/dist/echarts.min.js); // 完整 URL const dayjs await ctx.requireAsync(https://cdn.jsdelivr.net/npm/dayjs1/dayjs.min.js); // 加载 CSS 并注入页面 await ctx.requireAsync(https://cdn.example.com/theme.css);ECharts 图表const container document.createElement(div); container.style.height 400px; container.style.width 100%; ctx.render(container); const echarts await ctx.requireAsync(echarts5/dist/echarts.min.js); if (!echarts) throw new Error(ECharts library not loaded); const chart echarts.init(container); chart.setOption({ title: { text: ctx.t(销售概览) }, series: [{ type: pie, data: [{ value: 1, name: ctx.t(A) }] }], }); chart.resize();Chart.js 柱状图async function renderChart() { const loaded await ctx.requireAsync(chart.js4.4.0/dist/chart.umd.min.js); const Chart loaded?.Chart || loaded?.default?.Chart || loaded?.default; if (!Chart) throw new Error(Chart.js not loaded); const container document.createElement(canvas); ctx.render(container); new Chart(container, { type: bar, data: { labels: [A, B, C], datasets: [{ label: ctx.t(数量), data: [12, 19, 3] }], }, }); } await renderChart();dayjsUMDconst dayjs await ctx.requireAsync(dayjs1/dayjs.min.js); console.log(dayjs?.default || dayjs);由于 UMD 库导出方式各异module.exports、window挂载等读取时经常需要做?.default ||兜底示例中的sn-require片段也采用了同样的写法require-amd.snippet.ts。注意事项返回值形式UMD 库导出方式各异返回值可能为库对象或undefined若为undefined可按库文档从window访问如window.echarts依赖网络需访问 CDN内网环境可通过ESM_CDN_BASE_URL环境变量对应运行时window.__esm_cdn_base_url__默认https://esm.sh指向自建服务可选ESM_CDN_SUFFIX后缀如 jsDelivr 的/esm但 raw 模式下不会追加后缀与 importAsync 选择库同时提供 ESM 与 UMD 时优先用ctx.importAsync()例如 Vue、dayjsESM等现代库应走 ESM 路径。相关ctx.importAsync()加载 ESM 模块适合 Vue、dayjsESM等ctx.render()将图表等渲染到容器ctx.libs内置 React、antd、dayjs 等无需异步加载。【免费下载链接】nocobaseNocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production-proven infrastructure and a WYSIWYG no-code interface, so you get both speed and reliability.项目地址: https://gitcode.com/GitHub_Trending/no/nocobase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/17 17:00:16

城市大脑数字底座:一网统管云平台建设与OpenStack+K8s实战

简介:这份资源是城市大脑一体化数字底座与城市中枢平台建设的完整解决方案文档,面向智慧城市、数字政府领域的规划者、架构师及项目交付人员。内容系统梳理了数据中台、AI中台、技术中台、业务中台及云平台基础设施五类需求,并给出顶层设计、…

2026/9/17 17:00:16

Debian 12下Samba深度配置:协议、ACL与SELinux实战

1. 为什么今天还要亲手配Samba——不是“过时”,而是“不可替代”很多人看到“Samba服务器配置教程”第一反应是:这玩意儿不是早被NAS盒子、云盘、企业网盘取代了吗?我用Windows共享不就完事了?——这恰恰是踩坑的起点。去年帮一家…

2026/9/17 18:15:22

内地专才申请怎样少走弯路?紧扣自身背景匹配对应服务机构

你有没有想过,明明符合条件,却在专才申请上卡了半年?更离谱的是,有人材料齐全、雇主真实聘用,结果还是被拒。这背后,不是运气差,而是对“真实聘用”和“本地难以招聘”的理解偏差。业内有句话&a…

2026/9/17 18:15:22

高通Camera Pipeline XML可视化与拓扑验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/17 18:15:22

DDR5内存设计核心:JESD305 2022规范下的RDIMM与LRDIMM技术解析

简介:JESD305规范是JEDEC于2022年1月发布的DDR5 LRDIMM与RDIMM共同标准,面向内存模块设计工程师、服务器硬件研发人员及数据中心选型者,旨在统一两类高密度内存模块的接口定义与互操作要求。DDR5作为DDR4的升级版,提供更高带宽与更…

2026/9/17 18:15:22

Qt C++图像处理软件设计:从架构到发布全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/17 18:10:21

HCIA-Datacom实战:数据封装、VLAN与NAT配置详解

简介:HCIA-Datacom核心技术笔记总结是一份面向网络工程师、网络管理员、学生及企业IT人员的系统学习资料,针对网络协议理解不深、配置经验不足等常见痛点。笔记以清晰的章节结构从网络基础讲起,依次涵盖数据封装、OSI与TCP/IP模型、Wireshark…

2026/9/16 12:52:37

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/17 0:03:13

WiFi密码安全测试:从原理到实战的字典暴力破解指南

1. 写在前面:我为什么要研究WiFi密码这件事先交代一下背景。我身边有不少朋友,家里的WiFi密码常年是"12345678"或者"88888888",问就是"好记"。直到有一次,隔壁邻居蹭网蹭到我家路由器后台都进不去&…

2026/9/17 0:03:13

redis-py服务控制与监控函数实战:从ping到slowlog的巡检指南

我用 redis-py 写了快五年的业务代码,坦白说,真正让我觉得这个客户端“像一个成熟工具箱”的,不是 get/set 那套基本操作,而是它那批专门做服务控制与状态监控的辅助函数。日常开发里,大家把redis.Redis(host..., deco…

2026/9/17 0:03:13

SpringBoot+Vue3实现中小企业设备管理系统开发实践

1. 项目概述与核心价值中小企业设备管理系统是制造业、服务业等领域的基础信息化工具。传统设备管理往往依赖Excel表格或纸质记录,存在数据孤岛、流程混乱、维护成本高等痛点。这套基于Java SpringBootVue3MyBatis的技术方案,通过前后端分离架构实现了设…

2026/9/16 22:55:57

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/16 22:56:09

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/16 22:56:16

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码