Openblocks 应用引入第三方 JavaScript 库:内置库清单、应用级/工作区级加载与沙箱执行原理
低代码后端前端开发工具【免费下载链接】openblocks The Open Source Retool Alternative项目地址https://gitcode.com/gh_mirrors/op/openblocks点击查看免费下载Openblocks 内置了 lodash、moment、uuid、numbro、papaparse 等常用 JavaScript 库开发者可直接在查询与组件属性表达式中使用对于内置库未覆盖的场景Openblocks 支持通过 URL 手动引入任意第三方库加载范围可精确控制到单个应用应用级或整个工作区工作区级。本文将以 cowsay 为例完整演示两种引入方式并结合client前端与server/api-service后端的源码深入讲解外部库从输入 URL到沙箱执行的完整链路与安全边界帮助你在自建应用中安全、高效地复用社区生态。内置 JavaScript 库开箱即用Openblocks 为常见场景预置了一批 JS 库无需任何配置即可在 JS 查询、代码编辑器以及组件属性表达式中直接调用。根据官方文档内置库清单及版本如下库官方文档版本lodashlodash 官方文档4.17.21momentmoment 官方文档2.29.3uuiduuidjs/uuid8.3.2支持 v1/v3/v4/v5numbronumbro 格式化文档2.3.6papaparsePapa Parse 文档5.3.2对应前端文案en.ts也明确提示lodash, moment, uuid, numbro 内置在系统中可直接使用。这五类库基本覆盖了日常低代码开发中的高频诉求lodash数组/对象/字符串处理、深拷贝、节流防抖等工具函数moment日期时间解析、格式化与计算uuid按 v1/v3/v4/v5 算法生成唯一标识numbro数字格式化货币、百分比、千分位等papaparseCSV 的解析与序列化适合在应用中处理表格数据的导入导出。需要留意的是这些内置库与手动引入的外部库一样都是在应用初始化之前加载的见 preLoadComp.tsx 的预加载机制因此库的数量和体积会影响应用启动性能应按需引入而非盲目堆叠。手动引入第三方库两种作用域当内置库无法满足需求时Openblocks 支持配置预加载preloadJavaScript 库作用域分为应用级与工作区级两种应用级App-level库只在该应用内加载生效。应用 A 配置的库应用 B 无法使用隔离性最强适合仅在单个应用内使用的专用库。工作区级Workspace-level打开工作区内任意应用时都会加载这些库所有应用均可访问。由于每个应用打开时都要加载并执行若其中包含复杂且并非每个应用都用到的 JS 函数会对应用性能产生一定影响因此建议只把全局通用的库提升到工作区级。从源码角度看这两级配置最终都会汇聚到同一条加载链路上工作区级配置保存在orgCommonSettings组织公共设置中应用级配置保存在应用自身的libs组件状态中。执行时由 PreloadComp.run() 统一处理async run(id: string) { const { orgCommonSettings {} } getGlobalSettings(); const { preloadCSS, preloadJavaScript, preloadLibs, runJavaScriptInHost } orgCommonSettings; await this.children.css.run(id, preloadCSS || ); await this.children.libs.run(id, preloadLibs || [], !!runJavaScriptInHost); await this.children.script.run(id, preloadJavaScript || , !!runJavaScriptInHost); }其中preloadLibs就是工作区级的库 URL 列表而应用级列表由libs组件维护runJavaScriptInHost是工作区高级设置决定外部库运行在沙箱中还是宿主环境中详见下文沙箱与受限全局变量。引入第三方库前必须了解的约束在动手添加 URL 之前有几个官方强调的前提条件必须先确认否则很可能添加成功但用不了外部库在浏览器中加载和执行NodeJS 专属库依赖fs、path、process等 Node 内置模块当前不支持。外部库的 URL 必须支持跨域CORS。加载过程本质是fetch(url)拉取脚本文本见 jsLibraryUtils.ts因此 CDN 或自建静态资源服务必须允许跨域访问。库的导出必须直接挂在window对象上例如window.cowsay ...仅声明var xxx xxx之类的全局变量不会生效。源码层面preLoadComp.tsx 在执行脚本时会通过onSetGlobalVars回调记录写入沙箱 window 的全局变量名用于在界面中展示Exported as信息这也印证了导出必须写入 window 才能被识别与使用。外部库运行在受限沙箱环境中以下全局变量不可用parent、document、location、chrome、setTimeout、fetch、setInterval、clearInterval、setImmediate、XMLHttpRequest、importScripts、Navigator、MutationObserver这些限制在核心沙箱实现 evalScript.tsx 中有直接对应functionBlacklist包含top、parent、document、location、chrome、fetch、XMLHttpRequest、importScripts、Navigator、MutationObserver表达式作用域expressionBlacklist还会额外拦截setTimeout、setInterval、setImmediate。当脚本访问这些黑名单变量时代理Proxy会返回createBlackHole()构造的黑洞对象从而阻断对真实浏览器的访问。这意味着依赖 DOM 操作或网络请求的传统库如直接操作document的 UI 类库在沙箱中无法正常工作。URL 输入有前端校验。在 JSLibraryModal.tsx 中输入的 URL 必须匹配/^https?./才被接受否则提示Invalid URL若库已存在会提示JavaScript library already exists。官方推荐使用 unpkg.com 或 jsdelivr.net 提供的 CDN 地址见 en.ts 的输入提示。实战一应用级引入以 cowsay 为例官方文档以 cowsay 为例演示应用级引入这里完整还原操作步骤。前置素材cowsay GitHub 仓库piuccio/cowsay库的 UMD 构建地址https://unpkg.com/cowsay1.5.0/build/cowsay.umd.js操作步骤打开应用进入编辑器导航到设置Settings页面在JavaScript library标签页下点击加号。将 cowsay 的链接粘贴到输入框点击Add New完成添加。界面上还会展示推荐库列表点击下载图标即可快速安装推荐的 JS 库推荐库由服务端下发详见下文推荐库与元信息接口。创建一个JS 查询JS query插入如下代码调用 cowsay 生成 ASCII 奶牛图案return cowsay.say({ text: hello openblocks });也可以在文本组件的值value表达式中直接调用cowsay.say()获得相同效果{{ cowsay.say({ text: hello openblocks }) }}需要再次强调cowsay 是在应用级引入的因此工作区内其他应用无法使用它。若多个应用都需要该库应改用工作区级引入。实战二工作区级引入工作区级库对所有应用生效适合全站通用的工具库如 lodash 之外的自定义工具集。操作步骤进入 Openblocks 首页选择Settings设置 Advanced高级。在JavaScript library标签页下点击Add。粘贴第三方 JS 库的链接点击Add New将其添加到工作区同样也可以通过下载图标快速添加推荐库。添加完成后工作区内任意应用均可访问这些库。从源码看工作区级配置对应 AdvancedSetting.tsxpreloadLibs以 URL 字符串数组的形式保存通过setCommonSettings写回组织公共设置已添加的库以树形列表展示JSLibraryTree.tsx列表会自动从 URL 中解析出库名与版本parseJSLibraryURL并支持查看文档、删除等操作。相关字段定义见 commonSettingApi.tspreloadCSS、preloadJavaScript、preloadLibs、runJavaScriptInHost等。底层原理从输入 URL 到沙箱执行理解了操作步骤后再看一遍完整的技术链路有助于排查添加成功但调用失败类问题。1. 前端加载执行链核心实现在 preLoadComp.tsxfetchJSLibrary(url)jsLibraryUtils.ts直接fetch(url)并以纯文本方式拉取脚本源码这就是要求 URL 支持跨域的原因loadScript(url)preLoadComp.tsx#L51-L73通过evalFunc(code, {}, {}, { scope: function, disableLimit: this.runInHost, onSetGlobalVars })在沙箱中执行脚本。disableLimit为true即工作区开启了runJavaScriptInHost时沙箱限制被放开脚本可以访问真实浏览器全局否则按黑名单拦截。每个成功加载的 URL 会记录在success表中避免重复执行loadAllLibs()preLoadComp.tsx#L75-L87将应用级与工作区级全部 URL 并行执行Promise.all加载单个库失败只记录日志不会阻断其他库。2. 沙箱与黑名单核心沙箱位于 evalScript.tsx。脚本在with(this){ return (function(){ use strict; ... }).call(this); }形式下执行this是一个 Proxy 包装的 mock window读取黑名单变量时返回createBlackHole()黑洞对象避免脚本获得真实浏览器能力evalScript.tsx#L74-L77向沙箱 window 写入全局变量时触发onSetGlobalVars回调前端借此在树形列表中展示Exported as对受保护变量执行set/defineProperty/deleteProperty会被抛错拒绝setPrototypeOf同样被禁止disableLimittrue时走getPropertyFromNativeWindow直接读取真实 window 属性相当于脱离沙箱、在宿主中运行。3. URL 解析与元信息展示JSLibraryTree.tsx 通过parseJSLibraryURLjsLibraryUtils.ts从 URL 中解析库名与版本正则/(?:npm\/|gh\/|unpkg\.com\/)([^/])(?:([^/]))?/i支持cdn.jsdelivr.net/npm/jquery3.2.1、unpkg.com/jquery3.2.1等常见 CDN 形态未显式带版本时按latest处理对应测试见 jsLibraryUtils.test.ts。随后前端调用/misc/js-library/metas获取库的描述、主页与最新版本信息用于展示。4. 后端推荐库与元信息接口后端 JsLibraryController.java 提供两个接口GET /misc/js-library/metas?namea,b,c按库名查询元信息数据来自 npm registryhttps://registry.npmjs.com/name包含描述、主页回退到 repository URL与dist-tags.latest版本并带有一天的本地缓存GET /misc/js-library/recommendations返回推荐库列表推荐库名称与下载地址硬编码在 recommendedJsLibraries.json目前包含jspdf、jmespath、jsonpath、i18next四个库元信息同样通过 npm registry 抓取并缓存。前端 jsLibraryApi.ts 的fetchMetas/fetchRecommends即对应这两个接口。常见问题与排查建议现象可能原因与排查方向输入 URL 后提示Invalid URL前端校验要求 URL 以https?开头检查是否缺少协议头或包含非法字符提示JavaScript library already exists该 URL 已在应用级或工作区级列表中存在可先在列表中删除再重新添加添加成功但调用时报xxx is not defined库未通过window.xxx导出var xxx不生效或库依赖document等沙箱受限变量在沙箱中被黑洞拦截NodeJS 专属库同样无法运行安装失败提示installation failed云端环境下多为沙箱中不可用自托管环境可查看具体错误消息。若工作区开启了runJavaScriptInHost选项外部库将以宿主模式运行限制更少但安全性需自行评估页面加载变慢工作区级库会在每个应用初始化前加载执行检查是否把只在个别应用使用的复杂库提升到了工作区级参考源码路径前端预加载组件client/packages/openblocks/src/comps/comps/preLoadComp.tsxURL 解析与拉取工具client/packages/openblocks/src/util/jsLibraryUtils.ts 及测试 jsLibraryUtils.test.ts添加库弹窗client/packages/openblocks/src/components/JSLibraryModal.tsx库列表展示client/packages/openblocks/src/components/JSLibraryTree.tsx沙箱执行引擎client/packages/openblocks-core/src/eval/utils/evalScript.tsx工作区高级设置client/packages/openblocks/src/pages/setting/advanced/AdvancedSetting.tsx公共设置字段定义client/packages/openblocks/src/api/commonSettingApi.ts后端元信息与推荐接口server/api-service/openblocks-server/src/main/java/com/openblocks/api/misc/JsLibraryController.java推荐库清单server/api-service/openblocks-server/src/main/resources/recommendedJsLibraries.json官方文档原文docs/build-apps/use-third-party-libraries.md赞分享低代码后端前端开发工具【免费下载链接】openblocks The Open Source Retool Alternative项目地址https://gitcode.com/gh_mirrors/op/openblocks点击查看免费下载相关推荐Monty 内置标准库模块清单与沙箱导入边界解析Monty 内置标准库模块清单与沙箱导入边界解析 Monty一个以 Rust 编写、面向 AI 场景的最小化安全 Python 解释器不提供可扩展的模块搜索语言运行时编程语言Agent 沙箱人工智能ScriptCat 脚本执行架构解析三条执行路径与 with(){} 沙箱编译原理ScriptCat 脚本执行架构解析三条执行路径与 with {} 沙箱编译原理 ScriptCat脚本猫是一个可执行用户脚本的浏览器扩展。本文基于仓库中前端开发者工具插件系统AgentScope 怎么配置 Apple Container 沙箱工作区运行工具调用AgentScope 怎么配置 Apple Container 沙箱工作区运行工具调用 在 Apple silicon 的 Mac 上跑 AgentScope人工智能大模型AI Agent多智能体Agent 框架Agent 编排工具调用RAGMCP 服务语音创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

CH592蓝牙MCU深度解析:RISC-V内核、低功耗设计与实战避坑指南

CH592蓝牙MCU深度解析:RISC-V内核、低功耗设计与实战避坑指南

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

2026/10/12 5:12:02 阅读更多 →
从三明治定理看AI模型精度陷阱:越精确为何越脆弱

从三明治定理看AI模型精度陷阱:越精确为何越脆弱

1. 从数学定理到AI日常:一次精度失控的复盘先说个真实经历。几个月前,某团队内部做了一个图像分类的Demo,训练集和验证集的表现漂亮得吓人,准确率一路干到98%以上。大家兴冲冲部署到测试环境,结果真实图片一进来&#…

2026/10/12 5:12:02 阅读更多 →
研华IPC-510工业级稳定性设计与实战选型指南

研华IPC-510工业级稳定性设计与实战选型指南

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

2026/10/12 5:12:02 阅读更多 →

最新新闻

Doris JSON数组解析优化:从正则切分到JSONB+EXPLODE的实践

Doris JSON数组解析优化:从正则切分到JSONB+EXPLODE的实践

1. 这个版本优化到底解决了什么问题1.1 日志场景里的 JSON 数组字段做数仓的人大概率都有过这种经历:上游埋点日志为了省事,把一个事件的所有上下文全塞进一个大 JSON 字段里,其中一定会有个数组字段,比如用户浏览商品列表、曝光位…

2026/10/12 5:54:29 阅读更多 →
no_DS.zip:macOS 隐藏文件清理与跨平台交付包净化指南

no_DS.zip:macOS 隐藏文件清理与跨平台交付包净化指南

简介:一个仅763B的ZIP压缩包,内含run.bat与no-ds.js两个文件,面向对Windows批处理与JavaScript脚本协同工作感兴趣的开发者和技术爱好者。ZIP格式使这个小巧的脚本组合便于存储和传播,压缩包共2个文件,其中run.bat为批…

2026/10/12 5:54:29 阅读更多 →
Flutter开发实战:从Widget布局到状态管理与打包

Flutter开发实战:从Widget布局到状态管理与打包

1. 先说说我为什么盯着 Flutter 不放在移动开发这行做了快十年,我先后用过原生、跨平台方案,也带过几个项目从零搭架构。这期间最让我头疼的不是写业务逻辑,而是“一套代码交付多个平台”这件事:iOS 和 Android 的定制逻辑、多端对…

2026/10/12 5:54:29 阅读更多 →
在 Xcode 里使用 Cursor 编程:把 Base URL 改到 TaoToken 的配置与验证

在 Xcode 里使用 Cursor 编程:把 Base URL 改到 TaoToken 的配置与验证

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

2026/10/12 5:54:29 阅读更多 →
私有IP与公有IP详解:从RFC1918到NAT端口映射,彻底搞懂内网外网通信

私有IP与公有IP详解:从RFC1918到NAT端口映射,彻底搞懂内网外网通信

聊到 IP 地址,很多刚入门的朋友第一件事就是打开浏览器去搜“我的 IP 是多少”,然后看到一串类似58.xxx.xxx.xxx的数字,又去路由器后台看一眼,发现 WAN 口和 LAN 口的地址完全不一样,甚至和自己电脑上ipconfig出来的结…

2026/10/12 5:54:29 阅读更多 →
从Shape案例彻底搞懂Java抽象类设计与落地细节

从Shape案例彻底搞懂Java抽象类设计与落地细节

写这篇的时候,我心里其实挺有感触的。很多人学抽象类,都是从 Shape 这个类入手的——课本上画个圆、画个矩形,定义个area()方法,然后就没下文了。结果到了实际项目里,一用就懵:抽象类到底该放哪些方法&…

2026/10/12 5:53:28 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/11 14:36:54 阅读更多 →