低代码沙箱接入
沙箱是搭建产物(对于 Tango 主要是源码)的运行环境,它是一个独立的环境,可以在其中运行搭建产物,以便于开发者可以在不影响生产环境的情况下进行调试和测试。
Tango 沙箱由三个部分构成,包括低代码沙箱前端组件、在线打包器、沙箱后端服务,如下图所示。
- 沙箱前端组件:一个开箱即用的沙箱组件,只需要传入代码和配置就可以完成应用的渲染。
- 在线打包器:提供搭建产物的浏 览器端构建能力,类似于一个浏览器版本的 webpack,此部分逻辑主要来自于 sandpack 项目。
- 沙箱后端服务:对依赖的资源进行预构建,以及提供资源合并等服务,用来加速沙箱内部的构建打包过程。
tip
在接入前,请确认本地或服务器上已经安装了 Node.js 与 npm/yarn,且 Node.js 的版本大于等于 16。若本地没有安装 Node.js 或版本不满足需求,可以使用 nvm 来安装并实现多版本管理。
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
nvm install 16
nvm use 16
npm install --global yarn
沙箱的前端组件接入
Tango 封装了一份标准的沙箱实现 @music163/tango-sandbox
,在与 Tango 设计器一同使用时,你只需要传入 bundlerURL
指定沙箱地址即可。
点击展开代码
<Designer engine={engine} sandboxQuery={sandboxQuery}>
<DesignerPanel>
<Sidebar></Sidebar>
<WorkspacePanel>
<WorkspaceView mode="design">
<Sandbox
// 将 bundlerURL 替换为已部署的沙箱的地址
bundlerURL="https://sandbox.example.com"
// 从沙箱的全局变量中获取挂载的 UMD 组件库的 menuData 与 prototypes 信息
// 如果上述信息可以通过其他方式获取到,你也可以直接调用相关方法注册
onMessage={(e) => {
if (e.type === 'done') {
const sandboxWindow: any = sandboxQuery.window;
if (sandboxWindow.TangoAntd) {
if (sandboxWindow.TangoAntd.menuData) {
setMenuData(sandboxWindow.TangoAntd.menuData);
}
if (sandboxWindow.TangoAntd.prototypes) {
workspace.setComponentPrototypes(sandboxWindow.TangoAntd.prototypes);
}
}
if (sandboxWindow.localTangoComponentPrototypes) {
workspace.setComponentPrototypes(sandboxWindow.localTangoComponentPrototypes);
}
setMenuLoading(false);
}
}}
/>
</WorkspaceView>
<WorkspaceView mode="code">
<CodeEditor />
</WorkspaceView>
</WorkspacePanel>
<SettingPanel />
</DesignerPanel>
</Designer>
CodeSandboxProps
如果你需要直接使用沙箱组件,可以参考如下常用的 props 定义,这些 props 主要暴露了 CodeSandbox 内部的一些参数,以及封装了 Tango 所需的事件回调方法。不过这些参数仅是简单透出而已,不代表这些参数能兼容 Tango 的设计器,例如在 Tango 的设计器里 template
应该始终为 create-react-app
,因为 Tango 目前仅支持 React 的 JavaScript 应用搭建。
属性 | 说明 | 类型 | 默认值 |
---|---|---|---|
bundlerURL | 沙箱地址 | string | - |
iframeId | iframe 唯一标识符,当有多个实例的时候必须要传 | string | sandbox-container |
template | 模板类型 | angular-cli | create-react-app | create-react-app-typescript | svelte | parcel | vue-cli | static | solid | create-react-app |
moduleType | 模块类型 | esm | cjs | - |
files | 文件列表 | { [path: string]: { code: string } } | - |
entry | 入口文件 | string | /index.js |
dependencies | 依赖信息 | { [depName: string]: string } | - |
externalResources | 单独注入的 JS 与 CSS 资源 | string[] | - |
startRoute | 起始路由 | string | / |
routerMode | 路由类型 | history | hash | history |
eventHandlers | 事件监听 | { [path: string]: (e: Event) => void } | - |
onFileChange | 文件发生变更时触发事件 | (files: { [path: string]: { code: string } }, sandpack: ISandpackContext) => void | - |
onMessage | 沙箱消息监听事件 | (frame: HTMLIFrameElement) => void | - |
style | 沙箱样式 | React.CSSProperties | - |
在线打包器
Tango 预置的沙箱方案是基于 CodeSandbox 实现的,并在之上做了适配 Tango 的修改,你可以在 这里 查看我们修改后的实现。由于沙箱的能力并不属于 Tango 的核心部分,因此你需要单独部署 CodeSandbox 的沙箱服务。