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

发布时间:2026/11/5 23:32:15

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/10/26 10:36:57

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

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

2026/11/3 23:03:59

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

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

2026/11/5 16:51:33

EasyU优启通PE维护盘实战指南:制作、启动与核心操作全解析

1. 为什么一个PE维护盘值得单独拿出来聊装系统、修引导、救数据、清病毒,这些活儿但凡干过几次的人都知道,真正决定效率的往往不是你手速多快,而是手边那套PE环境靠不靠谱。EasyU(圈内习惯叫优启通)就是在这个场景下被…

2026/11/5 16:26:13

Rust原来很简单二:所有权系统

Part 2 核心篇 —— 所有权系统 本篇覆盖 第 6 ~ 10 章:所有权、借用与引用、生命周期、字符串与切片、内存模型。 ⚠️ 这是全书最重要的一篇。 把它吃透,Rust 从此“很简单”;跳过它,你会处处碰壁。请慢下来,动手敲每一段代码。 第 6 章 所有权:Rust 的第一性原理 6…

2026/11/5 15:00:49

基于Hadoop+Spark的民宿智能推荐系统设计与实现

1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享…

2026/11/5 14:10:30

ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计

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

2026/11/5 14:10:30

UART接口24位ADC搭配RS485,解决远距离温度监控难题

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

2026/11/5 14:10:30

UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践

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

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

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

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

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