低代码 面试题
本题库共收录 57 道面试题(基础 11 / 进阶 19 / 深入 16 / 架构 11)。 本文件收录低代码(Low-Code / No-Code)相关面试题,目标题量 32 道。 题型覆盖:概念题、代码分析题、手写代码题、场景设计题、系统设计题、框架原理题、性能优化题、安全题、工程化题、软技能题、综合开放题。 难度覆盖:基础、进阶、深入、架构。 每道题除标准参考答案外,另附口头回答版,便于面试时快速组织语言。
目录
基础题(8 道)
FB-52-CO-B-001:低代码(Low-Code)和无代码(No-Code)有什么区别?
题型:概念题 难度:🟢 基础 岗位层级:初级 / 高级 面试知识域:52 低代码 标签:低代码、无代码、概念对比、开发模式 出现频率:高频 预计回答时长:3-5 分钟
题目描述: 请解释低代码(Low-Code)和无代码(No-Code)的核心区别,并说明它们各自适合什么样的场景和人群。
参考答案:
低代码和无代码都强调通过可视化、拖拽、配置等方式减少手写代码量,但目标人群和灵活度不同。
| 维度 | 低代码(Low-Code) | 无代码(No-Code) |
|---|---|---|
| 目标用户 | 专业开发者、IT 人员 | 业务人员、 citizen developer |
| 代码参与度 | 仍需写代码处理复杂逻辑、扩展、集成 | 尽量不写代码,完全配置化 |
| 灵活性 | 高,可二次开发、出码、写自定义插件 | 低,受平台能力限制 |
| 典型场景 | 企业级应用、复杂审批、与中后台系统集成 | 简单表单、H5、营销页、轻量小程序 |
| 可维护性 | 较强,有版本、代码仓库、CI/CD | 依赖平台,迁移成本高 |
| 代表产品 | OutSystems、Mendix、宜搭、微搭 | Notion、Airtable、简道云 |
核心差异一句话概括:
- 低代码是“少写代码”,用可视化提升开发效率,但保留专业开发入口。
- 无代码是“不写代码”,让业务人员自助搭建,但扩展天花板低。
最佳实践:
- 复杂业务系统优先选低代码,保证可扩展和可出码。
- 临时性、轻量、个人或部门级应用可选无代码。
- 企业内两者常组合使用:无代码做轻量表单,低代码做核心系统。
评分维度:
- 能准确区分目标用户和代码参与度(40%)
- 能说出典型场景和代表产品(30%)
- 能结合企业实践给出选型建议(30%)
常见错误:
- 认为低代码就是完全不用写代码。
- 把低代码和无代码混为一谈。
- 忽略无代码在复杂场景下的扩展瓶颈。
延伸追问:
- 如果业务人员用无代码搭了一个关键流程,后期要接入公司统一权限体系,你会怎么处理?
- 低代码平台如何保证生成的应用可维护?
相关题目:
参考资源:
口头回答版:
低代码和无代码都是减少手写代码、用可视化方式搭应用,但目标人群不一样。低代码主要给开发者用,复杂逻辑还能写代码扩展,适合企业级系统;无代码面向业务人员,尽量不写代码,适合做简单表单、H5。简单说,低代码是“少写代码”,无代码是“不写代码”。复杂业务我建议用低代码,保证能扩展、能出码、能进 CI/CD。
FB-52-CO-B-002:什么是搭建协议(Schema)?它在低代码平台中起什么作用?
题型:概念题 难度:🟢 基础 岗位层级:初级 / 高级 面试知识域:52 低代码 标签:低代码、Schema、搭建协议、DSL、JSON 出现频率:高频 预计回答时长:3-5 分钟
题目描述: 请解释低代码平台中的“搭建协议”或“Schema”是什么,并说明它在设计态和运行态分别起什么作用。
参考答案:
搭建协议(Schema)是低代码平台用来描述页面、组件、数据、交互的结构化数据协议,通常以 JSON 形式存在。它是设计器、渲染器、出码器之间的“通用语言”。
Schema 的核心作用:
设计态:设计器读取和写入 Schema。
- 拖拽组件时,向 Schema 中插入节点。
- 属性面板修改时,更新对应节点的 props。
- 画布根据 Schema 实时渲染预览。
运行态:渲染器解析 Schema 生成真实 UI。
- 根据
componentName查找组件映射表。 - 将
props、children、style等注入组件。 - 处理事件绑定、数据绑定、联动逻辑。
- 根据
出码态:代码生成器将 Schema 转译为可维护源码。
- 例如转译为 React / Vue / 小程序代码。
一个最简单的页面 Schema 示例:
{
"componentName": "Page",
"props": { "title": "用户列表" },
"children": [
{
"componentName": "Button",
"props": { "type": "primary", "text": "新增用户" },
"events": {
"onClick": { "action": "openModal", "args": ["addUser"] }
}
},
{
"componentName": "Table",
"props": { "dataSource": "{{ users }}" }
}
]
}Schema 设计的关键原则:
- 稳定:协议升级要向后兼容。
- 完整:能表达页面结构、样式、交互、数据、生命周期。
- 可扩展:支持自定义组件、自定义属性、自定义动作。
- 可迁移:尽量对齐社区标准(如 JSON Schema、React/Vue 组件结构)。
评分维度:
- 能说明 Schema 是结构化协议并用于描述页面(40%)
- 能区分设计态、运行态、出码态三个作用(40%)
- 能给出 Schema 示例并说明关键字段(20%)
常见错误:
- 认为 Schema 只是组件树,忽略数据、事件、生命周期。
- 把 Schema 和 UI 代码混为一谈。
- 设计 Schema 时不考虑版本兼容性。
延伸追问:
- Schema 和 JSX / Vue SFC 有什么本质区别?
- 如果 Schema 协议要升级,如何做到向后兼容?
相关题目:
参考资源:
口头回答版:
搭建协议,也叫 Schema,就是低代码平台用 JSON 来描述页面长什么样、有什么组件、组件什么属性、绑了什么数据、有什么交互。它是设计器、渲染器和出码器之间的通用语言。设计态设计器读写它,运行态渲染器根据它生成真实页面,出码态把它转成 React 或 Vue 代码。设计 Schema 要稳定、可扩展、向后兼容。
FB-52-CO-B-003:低代码平台的组件物料一般由哪些部分组成?
题型:概念题 难度:🟢 基础 岗位层级:初级 / 高级 面试知识域:52 低代码 标签:低代码、组件物料、元数据、属性面板、设计器 出现频率:高频 预计回答时长:3-5 分钟
题目描述: 请说明低代码平台中“组件物料”的构成,以及每个部分分别服务于设计器、渲染器还是出码器。
参考答案:
组件物料是低代码平台可拖拽、可渲染的最小单元。一个完整的物料通常包含三部分:运行时组件、物料元数据、配置描述。
运行时组件(Runtime Component)
- 真实负责 UI 渲染的组件,通常是 React / Vue / 原生 Web Component。
- 服务渲染器和画布预览。
- 示例:
Input、Button、Table等。
物料元数据(Material Meta)
- 描述组件的基本信息:组件名、图标、分组、包名、版本、依赖。
- 服务设计器组件面板,决定组件展示在哪里、如何分组。
配置描述(Configure / Setter Schema)
- 描述属性面板如何渲染该组件的属性。
- 包括每个属性的类型、默认值、可选值、联动显示规则。
- 服务属性面板。
示例:一个 Input 物料的完整定义
{
"componentName": "Input",
"title": "输入框",
"icon": "InputIcon",
"group": "基础组件",
"npm": {
"package": "@alilc/lowcode-materials",
"version": "1.0.0",
"exportName": "Input"
},
"props": [
{
"name": "placeholder",
"title": "占位提示",
"setter": "StringSetter",
"defaultValue": "请输入"
},
{
"name": "size",
"title": "尺寸",
"setter": {
"componentName": "SelectSetter",
"props": { "options": ["small", "middle", "large"] }
},
"defaultValue": "middle"
}
],
"configure": {
"supports": { "events": ["onChange", "onFocus", "onBlur"] }
}
}设计器、渲染器、出码器分别使用物料的不同部分:
| 工具 | 使用物料的哪部分 |
|---|---|
| 设计器组件面板 | 物料元数据 |
| 属性面板 | 配置描述(Setter Schema) |
| 画布预览 / 运行态 | 运行时组件 |
| 出码器 | 运行时组件名 + props 映射 |
最佳实践:
- 运行时组件与物料描述解耦,同一组件可配多套物料描述。
- 物料元数据要支持版本管理,避免组件升级后旧 Schema 无法解析。
- Setter 要尽量复用,不要为每个组件重复造轮子。
评分维度:
- 能说出运行时组件、物料元数据、配置描述三部分(40%)
- 能说明每部分服务的工具(30%)
- 能给出物料定义的示例并解释关键字段(30%)
常见错误:
- 只关注运行时组件,忽略物料元数据和配置描述。
- 把组件 props 和 Setter 配置混为一谈。
- 物料没有版本字段,导致升级后无法回滚。
延伸追问:
- 如果一个组件在渲染器和设计器里行为不一样,怎么设计?
- 物料如何进行版本管理和灰度发布?
相关题目:
参考资源:
口头回答版:
低代码平台的组件物料一般包括三部分:运行时组件、物料元数据、配置描述。运行时组件是真正渲染 UI 的;物料元数据告诉设计器组件叫什么名字、图标、分组;配置描述告诉属性面板这个组件有哪些属性、怎么编辑。设计器用元数据和配置描述,渲染器用运行时组件,出码器把它们拼成代码。物料一定要解耦,还要做版本管理。
FB-52-CO-B-004:属性面板(Setter)在低代码平台中的作用是什么?
题型:概念题 难度:🟢 基础 岗位层级:初级 / 高级 面试知识域:52 低代码 标签:低代码、属性面板、Setter、表单、配置 出现频率:高频 预计回答时长:2-3 分钟
题目描述: 请说明低代码平台中属性面板的作用,以及常见的 Setter 类型有哪些。
参考答案:
属性面板(Setter Panel)是低代码设计器中用于编辑选中组件属性的区域。用户选中画布上的组件后,属性面板根据该组件物料的 props 配置动态生成表单,让用户通过填写、选择、绑定变量等方式配置组件行为。
属性面板的核心职责:
- 动态渲染配置表单:根据物料配置描述生成对应的表单控件。
- 数据绑定支持:支持把属性绑定到变量、表达式、数据源。
- 联动与校验:根据其他属性值动态显示/隐藏/禁用某些配置项。
- 实时同步:修改属性后实时更新 Schema 和画布预览。
常见 Setter 类型:
| Setter | 用途 |
|---|---|
| StringSetter | 字符串输入 |
| NumberSetter | 数字输入 |
| BooleanSetter | 开关 |
| SelectSetter | 下拉选择 |
| RadioSetter / CheckboxSetter | 单选 / 多选 |
| ColorSetter | 颜色选择 |
| JSONSetter | JSON 编辑器 |
| ExpressionSetter | 表达式输入,如 {{ user.name }} |
| EventSetter | 事件动作编排 |
| ImageSetter / IconSetter | 图片 / 图标选择 |
数据绑定示例:
{
"name": "title",
"title": "标题",
"setter": "StringSetter",
"defaultValue": "默认标题",
"supportVariable": true
}用户在属性面板里可以输入普通文本,也可以输入 {{ currentUser.name }} 绑定到变量。
最佳实践:
- Setter 要组件化、可注册,便于扩展自定义 Setter。
- 属性变更最好走统一的
onChange通道,避免各个 Setter 各自改 Schema。 - 复杂属性支持表达式和变量绑定,但不能让用户随意写任意 JS,防止 XSS。
评分维度:
- 能说明属性面板是编辑组件属性的区域(40%)
- 能列举 4 种以上常见 Setter(30%)
- 能提到数据绑定和实时同步(30%)
常见错误:
- 认为属性面板就是静态表单,忽略动态生成和数据绑定。
- 表达式输入不做任何安全过滤。
- Setter 设计得过于零散,无法复用。
延伸追问:
- 如果某个属性的可选项依赖另一个属性,Setter 怎么设计?
- 属性面板里的表达式如何安全执行?
相关题目:
参考资源:
口头回答版:
属性面板就是设计器右边用来编辑选中组件属性的地方。用户选中一个组件,属性面板根据这个组件物料的配置描述动态生成表单,比如字符串输入、下拉选择、颜色选择这些 Setter。它还支持把属性绑定到变量或表达式,改了之后要实时同步到 Schema 和画布。常见 Setter 有 StringSetter、SelectSetter、BooleanSetter、ExpressionSetter、EventSetter 等。
FB-52-CO-B-005:低代码平台中的数据绑定有哪些常见方式?
题型:概念题 难度:🟢 基础 岗位层级:初级 / 高级 面试知识域:52 低代码 标签:低代码、数据绑定、表达式、变量、数据源 出现频率:高频 预计回答时长:3-5 分钟
题目描述: 请说明低代码平台中常见的数据绑定方式,并对比它们的优缺点和适用场景。
参考答案:
数据绑定是把页面元素和数据源关联起来的机制,让 UI 能随数据变化自动更新。低代码平台常见的绑定方式有四种:静态值绑定、变量绑定、表达式绑定、数据源绑定。
| 绑定方式 | 说明 | 示例 | 适用场景 |
|---|---|---|---|
| 静态值 | 直接写死值 | "hello" | 固定文案、默认配置 |
| 变量绑定 | 绑定到上下文变量 | {{ user.name }} | 表单回显、用户信息展示 |
| 表达式绑定 | 支持简单运算和函数调用 | {{ items.length > 0 ? '有数据' : '无数据' }} | 条件渲染、简单计算 |
| 数据源绑定 | 绑定到 API / 远程数据源 | dataSource: "api://users/list" | 表格、列表、远程搜索 |
示例对比:
{
"componentName": "Text",
"props": {
"content": {
"type": "variable",
"value": "user.name"
}
}
}{
"componentName": "Table",
"props": {
"dataSource": {
"type": "dataSource",
"id": "ds_userList",
"params": { "pageSize": 10 }
}
}
}数据绑定的实现要点:
- 解析器(Parser):把
{{ }}或dataSource://语法解析为可执行表达式。 - 上下文(Context):维护页面可用变量,如
state、props、context、urlParams。 - 响应式更新:数据变化后通知依赖该数据的组件重新渲染。
- 错误处理:表达式执行失败时不能导致整个页面崩溃,要有降级展示。
最佳实践:
- 简单场景用静态值或变量绑定,复杂计算用表达式绑定。
- 远程数据统一抽象为数据源,便于做缓存、分页、错误处理、权限控制。
- 表达式执行要沙箱化,避免用户输入任意代码带来的安全风险。
评分维度:
- 能说出 4 种常见数据绑定方式(40%)
- 能对比优缺点和适用场景(30%)
- 能说明解析器和上下文的作用(30%)
常见错误:
- 所有数据都走表达式绑定,导致可读性差、难以调试。
- 数据源和变量没有统一抽象,每个组件各自管理请求。
- 表达式执行没有错误边界,一个字段写错导致整页白屏。
延伸追问:
- 如果表达式里访问了一个不存在的变量,应该怎么处理?
- 数据源绑定如何做缓存和去重请求?
相关题目:
参考资源:
口头回答版:
低代码平台数据绑定主要有四种:静态值、变量绑定、表达式绑定、数据源绑定。静态值就是写死;变量绑定是
{{ user.name }}这种;表达式可以做简单运算;数据源绑定是接 API。简单展示用变量,复杂计算用表达式,远程数据统一走数据源。实现时要有一个解析器、一个上下文管理变量,表达式执行要沙箱化、要有错误处理。
FB-52-CA-B-006:下面 Schema 渲染后的结果是什么?
题型:代码分析题 难度:🟢 基础 岗位层级:初级 / 高级 面试知识域:52 低代码 标签:低代码、Schema、渲染器、代码分析、表达式 出现频率:中频 预计回答时长:3-5 分钟
题目描述:
某低代码平台的 Schema 如下:
{
"componentName": "Page",
"state": {
"count": 1,
"visible": false
},
"children": [
{
"componentName": "Text",
"props": {
"content": "{{ count + 1 }}"
}
},
{
"componentName": "Button",
"condition": "{{ visible }}",
"props": {
"text": "提交"
}
},
{
"componentName": "Button",
"props": {
"text": "增加",
"onClick": {
"action": "setState",
"args": ["count", "{{ count + 1 }}"]
}
}
}
]
}假设平台支持 {{ }} 表达式绑定、condition 条件渲染、setState 动作,请问:
- 页面初次渲染时,
Text组件显示什么内容?提交按钮是否显示? - 点击
增加按钮一次后,Text内容变成什么?
参考答案:
初次渲染:
Text的content绑定{{ count + 1 }},count初始为 1,所以显示 2。提交按钮的condition绑定{{ visible }},visible初始为false,所以不显示。
点击
增加按钮后:- 执行
setState,将count更新为{{ count + 1 }},即 2。 Text重新渲染,显示2 + 1 = 3。
- 执行
关键点:
condition控制组件是否渲染,值为 falsy 时不渲染。setState的args里第二个参数是表达式,需要先解析再赋值。- 表达式中的变量来自页面
state。
常见执行流程:
初始化 state -> 解析表达式 -> 渲染组件 -> 触发动作 -> 更新 state -> 重新解析表达式 -> 重新渲染评分维度:
- 正确判断初次渲染结果(40%)
- 正确判断点击后结果(40%)
- 能解释 condition 和 setState 的执行机制(20%)
常见错误:
- 认为
condition是 CSS 显示隐藏,实际是是否渲染。 - 忽略
setState的第二个参数是表达式,需要先求值。 - 认为
count + 1是字符串拼接而不是数值运算。
延伸追问:
- 如果
condition写成"{{ !visible }}",结果会怎样? setState动作为什么不直接写死为2,而是用表达式?
相关题目:
参考资源:
口头回答版:
初次渲染时,Text 显示 2,因为 count 是 1,
count + 1等于 2;提交按钮不显示,因为 visible 是 false,condition 为 false 时不渲染。点击增加按钮后,count 变成 2,Text 会重新渲染显示 3。这里要注意 condition 是控制是否渲染,不是 display none;setState 的第二个参数是表达式,要先求值再更新。
FB-52-CD-B-007:请手写一个简单的 Schema 渲染器
题型:手写代码题 难度:🟢 基础 岗位层级:初级 / 高级 面试知识域:52 低代码 标签:低代码、Schema、渲染器、React、递归 出现频率:中频 预计回答时长:5-10 分钟
题目描述: 给定一个低代码 Schema 和组件映射表,请用 React 实现一个递归渲染器 Renderer,支持解析 componentName、props、children、condition。
参考答案:
假设 Schema 结构如下:
{
"componentName": "Page",
"props": { "title": "首页" },
"children": [
{
"componentName": "Text",
"props": { "content": "Hello Low-Code" }
},
{
"componentName": "Button",
"condition": "{{ showBtn }}",
"props": { "text": "点击我" }
}
]
}组件映射表:
const components = {
Page: ({ children, title }) => (
<div className="page">
<h1>{title}</h1>
{children}
</div>
),
Text: ({ content }) => <p>{content}</p>,
Button: ({ text, onClick }) => <button onClick={onClick}>{text}</button>
};渲染器实现:
import React from 'react';
// 简易表达式解析器:把 {{ expr }} 替换成 context 中的值
function parseExpression(value, context = {}) {
if (typeof value !== 'string') return value;
const match = value.trim().match(/^\{\{\s*(.+?)\s*\}\}$/);
if (!match) return value;
const expr = match[1];
try {
// 简易实现:用 new Function 在 context 上下文中执行
const keys = Object.keys(context);
const values = keys.map(k => context[k]);
const fn = new Function(...keys, `return (${expr})`);
return fn(...values);
} catch (e) {
console.error('表达式解析失败', expr, e);
return undefined;
}
}
// 递归解析 props 中的表达式
function parseProps(props, context) {
if (!props) return {};
const result = {};
for (const key of Object.keys(props)) {
result[key] = parseExpression(props[key], context);
}
return result;
}
function Renderer({ schema, context = {} }) {
const { componentName, props, children, condition } = schema;
// 条件渲染
if (condition !== undefined) {
const visible = parseExpression(condition, context);
if (!visible) return null;
}
const Component = components[componentName];
if (!Component) {
console.warn(`未找到组件: ${componentName}`);
return null;
}
const parsedProps = parseProps(props, context);
const renderedChildren = Array.isArray(children)
? children.map((child, index) => (
<Renderer key={index} schema={child} context={context} />
))
: children;
return <Component {...parsedProps}>{renderedChildren}</Component>;
}
export default Renderer;使用方式:
<Renderer
schema={pageSchema}
context={{ showBtn: true }}
/>关键点:
- 用递归处理
children。 condition先求值,为 falsy 时直接返回 null。parseProps递归或遍历处理 props 中的表达式。- 生产环境建议用更安全的沙箱表达式引擎替换
new Function。
评分维度:
- 能实现递归渲染 children(30%)
- 能解析 props 中的表达式(30%)
- 能处理 condition 条件渲染(20%)
- 能提到安全沙箱和错误处理(20%)
常见错误:
- 没有递归处理 children,只渲染一层。
- 表达式解析用
eval,存在安全风险。 - 没有处理组件找不到的兜底情况。
key使用数组 index,在列表动态变化时可能有问题。
延伸追问:
- 如果 props 里嵌套对象也有表达式,怎么递归解析?
- 如何避免
new Function带来的 XSS 风险?
相关题目:
参考资源:
口头回答版:
手写 Schema 渲染器,核心是递归。拿到一个 Schema 节点,先看 condition 满不满足;不满足就不渲染。然后用 componentName 去组件映射表里找组件,解析 props 里的表达式,再递归渲染 children。表达式解析我示例里用了 new Function,但生产环境要换成安全的沙箱引擎。还要注意组件找不到时的兜底处理。
FB-52-SC-B-008:如何设计一个低代码表单设计器?
题型:场景设计题 难度:🟢 基础 岗位层级:初级 / 高级 面试知识域:52 低代码 标签:低代码、表单设计器、Schema、拖拽、场景设计 出现频率:高频 预计回答时长:5-10 分钟
题目描述: 请设计一个低代码表单设计器,支持从左侧组件面板拖拽字段到画布、编辑字段属性、预览表单效果。请说明核心模块和它们之间的关系。
参考答案:
表单设计器可以拆分为五个核心模块:组件面板、画布、属性面板、Schema 状态管理、预览渲染器。
组件面板(Component Panel)
- 展示可用字段组件,如输入框、下拉框、日期选择、单选、多选等。
- 支持拖拽(Drag & Drop)到画布。
- 每个组件对应一个物料定义,包含字段默认值和 Setter 配置。
画布(Canvas)
- 渲染当前表单 Schema 的预览效果。
- 支持选中字段、拖拽排序、删除字段。
- 区分设计态和运行态:设计态显示拖拽手柄、选中态、删除按钮。
属性面板(Setter Panel)
- 选中字段后,根据字段的物料配置渲染属性表单。
- 支持编辑 label、字段名、默认值、占位符、校验规则、联动规则等。
Schema 状态管理
- 维护当前表单的 JSON Schema,是各模块的单一数据源。
- 提供增删改查字段的 API,如
addField、removeField、updateField、moveField。
预览渲染器(Preview Renderer)
- 根据 Schema 渲染真实表单,通常复用运行时渲染器。
- 支持表单校验、提交、重置。
模块关系图:
组件面板 ──拖拽──> 画布 ──选中──> 属性面板
│ │ │
└──── 操作 Schema 状态 <─────────┘
│
预览渲染器示例 Schema:
{
"fields": [
{
"key": "name",
"label": "姓名",
"component": "Input",
"props": { "placeholder": "请输入姓名" },
"rules": [{ "required": true, "message": "姓名不能为空" }]
},
{
"key": "gender",
"label": "性别",
"component": "Select",
"props": {
"options": [
{ "label": "男", "value": "male" },
{ "label": "女", "value": "female" }
]
}
}
]
}最佳实践:
- Schema 是单一数据源,避免各模块各自维护状态。
- 组件面板和属性面板都要基于物料配置,便于扩展新字段。
- 画布拖拽排序要实时更新 Schema 中字段顺序。
- 预览功能要和最终运行态使用同一套渲染器,保证所见即所得。
评分维度:
- 能说出 4 个以上核心模块(30%)
- 能说明模块之间的关系(30%)
- 能给出表单 Schema 示例(20%)
- 能提到设计态和运行态的区分(20%)
常见错误:
- 画布和预览渲染器用两套实现,导致预览和实际运行不一致。
- 属性面板写死字段配置,无法扩展新组件。
- 没有统一的 Schema 状态管理,数据流混乱。
延伸追问:
- 表单设计器里怎么做字段拖拽排序?
- 如果字段配置里要支持自定义校验规则,Setter 怎么设计?
相关题目:
参考资源:
口头回答版:
表单设计器主要分五个模块:组件面板、画布、属性面板、Schema 状态管理、预览渲染器。组件面板提供可拖拽字段;画布展示表单并支持选中、排序、删除;属性面板编辑选中字段的属性;Schema 状态管理是单一数据源;预览渲染器根据 Schema 渲染真实表单。关键是预览和运行要用同一套渲染器,保证所见即所得,Schema 要统一维护。
进阶题(8 道)
FB-52-CO-A-001:低代码平台中的事件与动作编排机制是如何工作的?
题型:概念题 难度:🟡 进阶 岗位层级:高级 / 专家 面试知识域:52 低代码 标签:低代码、事件编排、动作编排、Action、事件总线 出现频率:高频 预计回答时长:5-10 分钟
题目描述: 请说明低代码平台中事件与动作编排的设计思路,包括事件如何触发、动作如何定义和执行、动作之间如何传递数据。
参考答案:
事件与动作编排是低代码平台实现交互逻辑的核心。用户不需要写代码,而是通过配置“当什么事件发生时,执行什么动作”来完成交互。
核心概念:
事件(Event)
- 组件对外暴露的触发点,如
onClick、onChange、onSubmit。 - 事件由用户操作或组件内部状态变化触发。
- 组件对外暴露的触发点,如
动作(Action)
- 事件触发后执行的逻辑单元,如
setState、openModal、callDataSource、navigate。 - 每个动作有类型和参数。
- 事件触发后执行的逻辑单元,如
动作链(Action Chain)
- 一个事件可以触发多个动作,按顺序执行。
- 支持条件分支、循环、异常处理。
上下文(Context)
- 动作执行时共享的数据环境,包含
state、props、eventArgs、dataSource结果等。
- 动作执行时共享的数据环境,包含
示例 Schema:
{
"componentName": "Button",
"props": {
"text": "查询"
},
"events": {
"onClick": [
{
"actionType": "validate",
"args": ["searchForm"]
},
{
"actionType": "callDataSource",
"args": ["ds_userList"],
"outputs": { "list": "result.data" }
},
{
"actionType": "setState",
"args": ["users", "{{ list }}"]
}
]
}
}动作执行器(Action Executor)的核心逻辑:
async function executeActions(actions, context) {
for (const action of actions) {
const handler = actionRegistry[action.actionType];
if (!handler) throw new Error(`未知动作: ${action.actionType}`);
// 解析动作参数中的表达式
const parsedArgs = action.args.map(arg => parseExpression(arg, context));
// 执行动作,并更新上下文
const result = await handler(...parsedArgs);
Object.assign(context, result);
// 处理动作输出映射
if (action.outputs) {
for (const [key, expr] of Object.entries(action.outputs)) {
context[key] = parseExpression(expr, context);
}
}
}
}最佳实践:
- 动作要注册化,便于扩展自定义动作。
- 动作执行支持同步和异步,支持
await。 - 复杂业务逻辑建议支持“自定义动作”或“脚本动作”,但要在沙箱中执行。
- 动作链要有错误处理和中断机制。
评分维度:
- 能说明事件、动作、动作链、上下文四个概念(40%)
- 能给出事件编排的 Schema 示例(30%)
- 能说明动作执行器的基本逻辑(30%)
常见错误:
- 事件和动作混在一起,概念不清晰。
- 动作之间没有上下文传递,导致数据无法流转。
- 异步动作没有 await,导致执行顺序混乱。
- 自定义动作没有沙箱隔离,存在安全风险。
延伸追问:
- 如果某个动作执行失败,后面的动作还执行吗?
- 动作链里如何做条件分支和循环?
相关题目:
参考资源:
口头回答版:
事件与动作编排就是“当组件发生什么事件,就执行一系列动作”。事件比如 onClick、onChange;动作比如设状态、调接口、打开弹窗。一个事件可以配多个动作组成动作链,按顺序执行。动作之间靠上下文传数据,比如前一个动作调接口拿到结果,后一个动作把结果设到状态里。动作要注册化,支持同步异步,自定义动作要放沙箱里执行。
FB-52-CO-A-002:低代码表单设计器中的关键技术点有哪些?
题型:概念题 难度:🟡 进阶 岗位层级:高级 / 专家 面试知识域:52 低代码 标签:低代码、表单设计器、校验、联动、字段模型 出现频率:高频 预计回答时长:5-10 分钟
题目描述: 请说明设计一个低代码表单设计器时需要重点关注哪些技术点,如字段模型、校验、联动、布局等。
参考答案:
低代码表单设计器的技术点可以分为六个方面:字段模型、校验体系、联动机制、布局系统、数据源、扩展机制。
字段模型(Field Model)
- 每个表单字段对应一个模型,包含
key、label、component、props、rules、value。 - 表单数据通常用集中式模型管理,如 Formily 的 Field / Form 模型。
- 支持字段级状态:touched、dirty、validating、errors。
- 每个表单字段对应一个模型,包含
校验体系(Validation)
- 支持必填、正则、长度、范围、自定义函数校验。
- 支持字段级校验和表单级校验。
- 支持同步校验和异步校验。
- 校验规则可配置化,用 JSON 描述:
{
"rules": [
{ "required": true, "message": "必填" },
{ "pattern": "^1[3-9]\\d{9}$", "message": "手机号格式错误" }
]
}- 联动机制(Linkage)
- 字段显示/隐藏、禁用、选项变化、值变化等依赖其他字段。
- 联动规则可用表达式或函数描述:
{
"key": "companyName",
"visible": "{{ type === 'enterprise' }}"
}布局系统(Layout)
- 支持栅格布局、分组、标签页、卡片。
- Schema 中引入容器组件,如
Grid、FormItem、Card。
数据源(Data Source)
- 下拉框、单选、多选的选项可来自静态数据或远程接口。
- 支持字段级数据加载、分页、搜索。
扩展机制(Extension)
- 支持注册自定义字段组件。
- 支持注册自定义校验规则。
- 支持自定义联动函数。
最佳实践:
- 字段模型和 UI 渲染解耦,便于同一份 Schema 渲染不同 UI。
- 校验规则尽量用成熟库(如 yup、zod、ajv)解析。
- 联动规则尽量用响应式机制实现,避免轮询或手动触发。
- 大数据表单注意虚拟化或分片渲染。
评分维度:
- 能说出 4 个以上关键技术点(30%)
- 能详细说明校验和联动机制(35%)
- 能提到字段模型和扩展机制(20%)
- 能给出 JSON 示例(15%)
常见错误:
- 直接用 UI 组件的 state 管理表单数据,导致校验和联动难以实现。
- 联动规则写死成一堆 if-else,难以维护。
- 忽略异步校验和表单级校验。
延伸追问:
- 表单的联动规则很多时,如何避免性能问题?
- 如果两个字段互相联动,会不会出现循环依赖?
相关题目:
参考资源:
口头回答版:
表单设计器关键技术点有六个:字段模型、校验、联动、布局、数据源、扩展。字段模型要集中管理每个字段的状态和值;校验支持必填、正则、异步、表单级;联动用表达式控制显示隐藏禁用;布局用栅格和容器组件;选项可以接远程数据源;还要支持自定义组件和规则。核心是字段模型和 UI 解耦,校验用成熟库。
FB-52-CO-A-003:低代码表格设计器需要解决哪些核心问题?
题型:概念题 难度:🟡 进阶 岗位层级:高级 / 专家 面试知识域:52 低代码 标签:低代码、表格设计器、列配置、分页、数据源 出现频率:中频 预计回答时长:5-10 分钟
题目描述: 请说明设计一个低代码表格设计器时需要解决的核心问题,包括列配置、数据源、分页、排序、操作列等。
参考答案:
表格是低代码平台最常用的数据展示组件之一。表格设计器需要解决以下核心问题:
列配置(Column Configuration)
- 每列对应一个字段,配置标题、字段名、宽度、对齐方式、格式化、渲染组件。
- 支持列的增删改、拖拽排序、固定列、合并列。
- 列渲染可绑定自定义组件,如 Tag、Button、Link、Image。
数据源绑定(Data Source Binding)
- 表格数据通常来自远程 API,需要配置数据源 ID、请求参数、分页参数。
- 支持静态数据作为调试数据。
分页与加载(Pagination & Loading)
- 支持前端分页和后端分页。
- 配置分页器位置、每页条数、快速跳转。
- 加载状态、空状态、错误状态处理。
排序与筛选(Sort & Filter)
- 列头排序:支持单字段排序、多字段排序。
- 列头筛选:支持枚举筛选、范围筛选。
- 排序和筛选参数需要同步到数据源请求中。
操作列(Action Column)
- 每行可配置操作按钮,如编辑、删除、查看详情。
- 操作按钮可绑定事件和动作编排。
- 支持根据行数据动态显示/隐藏按钮。
行选择与批量操作(Row Selection & Batch Actions)
- 支持单选、多选、全选。
- 批量操作按钮如批量删除、批量导出。
示例 Schema:
{
"componentName": "Table",
"props": {
"dataSource": "ds_userList",
"pagination": { "pageSize": 10, "showQuickJumper": true },
"rowSelection": { "type": "checkbox" }
},
"columns": [
{ "title": "姓名", "dataIndex": "name", "width": 120 },
{ "title": "状态", "dataIndex": "status", "component": "Tag" },
{
"title": "操作",
"type": "action",
"actions": [
{ "text": "编辑", "event": "onEdit" },
{ "text": "删除", "event": "onDelete", "visible": "{{ status !== 'deleted' }}" }
]
}
]
}最佳实践:
- 列配置和表格数据解耦,列配置变更不触发数据重新请求。
- 远程数据统一走数据源层,便于做权限、缓存、错误处理。
- 大数据量表格要考虑虚拟滚动。
- 操作列的权限要和平台权限体系打通。
评分维度:
- 能说出 5 个以上核心问题(30%)
- 能详细说明列配置和数据源(30%)
- 能说明分页、排序、筛选、操作列设计(25%)
- 能给出表格 Schema 示例(15%)
常见错误:
- 表格列配置写死,无法动态扩展。
- 前端分页处理大数据量,导致页面卡顿。
- 操作列按钮权限没有控制。
- 排序筛选参数和数据源没有打通。
延伸追问:
- 表格列很多时,如何优化首屏渲染性能?
- 如果表格数据量达到 10 万行,应该怎么设计?
相关题目:
参考资源:
口头回答版:
表格设计器要解决几个核心问题:列怎么配置,包括标题、字段、宽度、渲染组件;数据源怎么绑定,通常是远程 API;分页是前端还是后端;排序筛选参数怎么同步到请求;操作列怎么做编辑删除按钮;还有行选择、批量操作。列配置要和数据解耦,远程数据统一走数据源层,大数据量要虚拟滚动。
FB-52-CD-A-004:请实现一个属性面板配置解析器
题型:手写代码题 难度:🟡 进阶 岗位层级:高级 / 专家 面试知识域:52 低代码 标签:低代码、属性面板、Setter、解析器、手写代码 出现频率:中频 预计回答时长:5-10 分钟
题目描述: 给定一个组件的物料配置描述,请实现一个 SetterRenderer,能够根据配置渲染对应的表单控件,并支持表达式的显示与编辑切换。
参考答案:
假设物料配置描述如下:
{
"props": [
{
"name": "title",
"title": "标题",
"setter": "StringSetter",
"defaultValue": "默认标题"
},
{
"name": "size",
"title": "尺寸",
"setter": {
"componentName": "SelectSetter",
"props": { "options": ["small", "middle", "large"] }
},
"defaultValue": "middle"
},
{
"name": "visible",
"title": "是否显示",
"setter": "BooleanSetter",
"defaultValue": true
}
]
}Setter 组件注册表:
const setterComponents = {
StringSetter: ({ value, onChange }) => (
<input value={value} onChange={e => onChange(e.target.value)} />
),
NumberSetter: ({ value, onChange }) => (
<input type="number" value={value} onChange={e => onChange(Number(e.target.value))} />
),
BooleanSetter: ({ value, onChange }) => (
<input type="checkbox" checked={value} onChange={e => onChange(e.target.checked)} />
),
SelectSetter: ({ value, onChange, options }) => (
<select value={value} onChange={e => onChange(e.target.value)}>
{options.map(opt => <option key={opt} value={opt}>{opt}</option>)}
</select>
)
};SetterRenderer 实现:
import React, { useState } from 'react';
function SetterRenderer({ config, value, onChange }) {
const { name, title, setter, defaultValue, supportVariable = true } = config;
const [isVariable, setIsVariable] = useState(false);
// 统一 setter 格式
const setterConfig = typeof setter === 'string'
? { componentName: setter, props: {} }
: setter;
const SetterComponent = setterComponents[setterConfig.componentName];
if (!SetterComponent) {
return <div>未知 Setter: {setterConfig.componentName}</div>;
}
const displayValue = value !== undefined ? value : defaultValue;
return (
<div className="setter-item">
<label>{title}</label>
{supportVariable && (
<button onClick={() => setIsVariable(!isVariable)}>
{isVariable ? '普通值' : '变量'}
</button>
)}
{isVariable ? (
<input
value={typeof displayValue === 'string' ? displayValue : ''}
placeholder="{{ variable }}"
onChange={e => onChange(e.target.value)}
/>
) : (
<SetterComponent
{...setterConfig.props}
value={displayValue}
onChange={onChange}
/>
)}
</div>
);
}
// 属性面板入口
function PropsPanel({ propsConfig, values, onChange }) {
return (
<div className="props-panel">
{propsConfig.map(config => (
<SetterRenderer
key={config.name}
config={config}
value={values[config.name]}
onChange={newValue => onChange(config.name, newValue)}
/>
))}
</div>
);
}关键点:
- Setter 配置支持字符串简写和对象完整写法。
- 支持变量表达式和普通值的切换。
- 属性变更统一通过
onChange(name, value)回调。 - 未注册 Setter 要有兜底提示。
评分维度:
- 能根据配置动态选择 Setter 组件(30%)
- 能处理 setter 的字符串和对象两种格式(20%)
- 能实现普通值和变量表达式的切换(25%)
- 能统一属性变更通道(15%)
- 有错误兜底(10%)
常见错误:
- 每个属性单独处理,没有统一的 Setter 注册表。
- 变量表达式和普通值混用,没有切换机制。
- Setter props 透传不完整。
- 没有默认值处理。
延伸追问:
- 如果某个属性的 Setter 要根据另一个属性值动态变化,怎么实现?
- Setter 的值变更如何实时同步到 Schema?
相关题目:
参考资源:
口头回答版:
实现属性面板解析器,首先要有一个 Setter 注册表,把 StringSetter、SelectSetter 这些注册进去。然后根据物料配置里的 setter 字段动态渲染对应组件。Setter 配置可能是字符串简写,也可能是对象形式。还要支持普通值和变量表达式的切换。属性变更统一走 onChange,没注册的 Setter 要兜底提示。
FB-52-SC-A-005:如何实现低代码表单中的字段联动?
题型:场景设计题 难度:🟡 进阶 岗位层级:高级 / 专家 面试知识域:52 低代码 标签:低代码、表单联动、表达式、响应式、场景设计 出现频率:高频 预计回答时长:5-10 分钟
题目描述: 在低代码表单中,经常需要根据一个字段的值动态控制另一个字段的显示、禁用、选项或值。请设计一个字段联动机制。
参考答案:
字段联动是表单设计器的高频需求。常见的联动类型有:显示/隐藏、禁用/启用、选项变化、值变化、校验规则变化。
联动机制可以抽象为三个要素:
- 被依赖字段(Source):值变化时触发联动。
- 联动规则(Rule):描述在什么条件下做什么动作。
- 目标字段(Target):受规则影响的字段。
联动规则 Schema 示例:
{
"key": "companyName",
"label": "公司名称",
"component": "Input",
"reactions": [
{
"when": "{{ type === 'enterprise' }}",
"then": { "visible": true, "required": true }
},
{
"when": "{{ type !== 'enterprise' }}",
"then": { "visible": false, "value": "" }
}
]
}联动执行流程:
源字段值变化 -> 匹配依赖该字段的规则 -> 求值 when 表达式 -> 执行 then 动作 -> 更新目标字段状态实现方案:
方案一:集中式联动引擎
class FormLinkageEngine {
constructor(formModel, rules) {
this.formModel = formModel;
this.rules = rules;
this.formModel.subscribe(this.run.bind(this));
}
run(changedField) {
this.rules.forEach(rule => {
if (rule.dependencies.includes(changedField)) {
const value = this.formModel.getValue(changedField);
const shouldApply = evaluate(rule.when, this.formModel.values);
if (shouldApply) {
this.applyEffect(rule.target, rule.effect);
}
}
});
}
applyEffect(targetKey, effect) {
const field = this.formModel.getField(targetKey);
if ('visible' in effect) field.setVisible(effect.visible);
if ('disabled' in effect) field.setDisabled(effect.disabled);
if ('value' in effect) field.setValue(effect.value);
if ('options' in effect) field.setOptions(effect.options);
}
}方案二:响应式联动(Formily 风格)
- 每个字段是响应式对象,依赖字段变化自动触发 effect。
- 用
@formily/reactive或 MobX 实现。
最佳实践:
- 联动规则尽量声明式,避免写大量命令式代码。
- 支持表达式和函数两种写法,简单场景用表达式,复杂场景用函数。
- 避免循环依赖,联动引擎要能检测并告警。
- 隐藏字段的值和校验要正确处理:隐藏时不参与提交,但重新显示时要保留原值。
评分维度:
- 能抽象出源字段、规则、目标字段三个要素(30%)
- 能给出联动规则 Schema 示例(25%)
- 能说明集中式或响应式实现方案(30%)
- 能提到循环依赖和隐藏字段处理(15%)
常见错误:
- 用大量 if-else 手动控制字段状态,难以维护。
- 隐藏字段仍然参与校验和提交。
- 联动规则没有依赖声明,任何字段变化都全量重新计算。
- 两个字段互相依赖导致死循环。
延伸追问:
- 如果 A 字段控制 B 字段显示,B 字段控制 C 字段显示,这种链式联动怎么保证顺序?
- 联动规则很多时,如何优化性能?
相关题目:
参考资源:
口头回答版:
字段联动可以抽象成三个东西:被依赖字段、联动规则、目标字段。比如用户类型选了企业,公司名称字段才显示。规则用声明式 Schema 写,when 是条件表达式,then 是要做的动作,比如 visible、disabled、value、options。实现可以用集中式联动引擎,字段值变了就扫描依赖它的规则,求值后更新目标字段;也可以用响应式方案。要注意隐藏字段不参与提交,还要避免循环依赖。
FB-52-PE-A-006:低代码平台有哪些常见的性能优化手段?
题型:性能优化题 难度:🟡 进阶 岗位层级:高级 / 专家 面试知识域:52 低代码 标签:低代码、性能优化、渲染、Schema、懒加载 出现频率:高频 预计回答时长:5-10 分钟
题目描述: 请说明低代码平台在设计态和运行态分别可能遇到哪些性能问题,以及对应的优化手段。
参考答案:
低代码平台的性能问题分为设计态和运行态两个层面。
一、设计态性能优化
画布渲染优化
- 复杂页面组件多,画布容易卡顿。
- 用大节点树做虚拟化或按需渲染可视区域。
- 选中态、hover 态用 CSS 而不是重渲染整个树。
属性面板优化
- 避免每个属性变化都触发全量 Schema 序列化。
- 用防抖(debounce)处理输入型 Setter。
- 属性面板和画布用统一不可变数据模型,减少不必要重渲染。
拖拽排序优化
- 拖拽过程中不要实时修改 Schema,拖拽结束后再更新。
- 用 placeholder 占位,避免频繁 DOM 操作。
Schema 体积控制
- 避免把运行时不需要的信息塞进 Schema。
- 对历史版本 Schema 做压缩存储。
二、运行态性能优化
渲染器优化
- 解析 Schema 时做缓存,相同结构复用虚拟 DOM。
- 用
React.memo/Vue的v-memo减少不必要重渲染。 - 大数据列表/表格使用虚拟滚动。
表达式执行优化
- 表达式解析结果缓存,避免每次渲染重新编译。
- 复杂表达式提前预编译为函数。
数据源优化
- 接口请求去重、缓存、分页。
- 表格滚动加载、搜索防抖。
按需加载
- 组件和物料按路由或功能懒加载。
- 设计器功能模块按需加载。
JSON 操作优化
- 大 Schema 用 Immutable 更新,避免深拷贝。
- 用路径更新代替全量替换。
最佳实践:
- 性能优化前先测量,用 Chrome Performance、React DevTools Profiler 定位瓶颈。
- 设计态和运行态的性能策略不同,要分开考虑。
- 尽量减少设计态 Schema 的序列化和反序列化次数。
评分维度:
- 能区分设计态和运行态性能问题(30%)
- 能说出 3 个以上设计态优化手段(25%)
- 能说出 3 个以上运行态优化手段(25%)
- 能提到先测量再优化(20%)
常见错误:
- 一遇到卡顿就加 memo,不做根因分析。
- 设计态和运行态用同一套优化策略。
- 忽略大数据表单和表格的虚拟滚动。
- 每次属性变更都全量保存 Schema。
延伸追问:
- 如果画布有 1000 个组件,如何优化交互响应?
- 低代码渲染器如何避免每次表达式都重新编译?
相关题目:
参考资源:
口头回答版:
低代码平台性能分设计态和运行态。设计态要注意画布大节点树的渲染、属性面板的防抖、拖拽排序不要实时改 Schema、Schema 体积控制。运行态要优化渲染器,用 memo 和虚拟滚动;表达式解析结果缓存;数据源做去重缓存分页;组件按需加载;Schema 更新用不可变数据。优化前一定要先测量,用 Profiler 找瓶颈。
FB-52-EN-A-007:低代码平台的组件物料如何做版本管理?
题型:工程化题 难度:🟡 进阶 岗位层级:高级 / 专家 面试知识域:52 低代码 标签:低代码、物料版本、热更新、工程化、兼容性 出现频率:中频 预计回答时长:5-10 分钟
题目描述: 请说明低代码平台中组件物料的版本管理策略,包括如何支持多版本共存、旧 Schema 兼容、以及热更新机制。
参考答案:
组件物料的版本管理是低代码平台工程化的重要部分,关系到存量应用能否稳定运行。
一、版本管理策略
物料包语义化版本
- 物料以 npm 包形式发布,遵循 SemVer(主版本.次版本.修订号)。
- 主版本升级通常对应 Breaking Change,次版本新增特性,修订号修复 bug。
Schema 中记录物料版本
- 每个组件节点在 Schema 中记录使用的物料包名和版本:
{
"componentName": "Button",
"npm": {
"package": "@company/lowcode-materials",
"version": "1.2.3"
},
"props": { "type": "primary" }
}多版本共存
- 平台同时注册多个版本的物料包。
- 渲染器根据 Schema 中的版本号加载对应版本的运行时组件。
- 设计器也根据版本号加载对应版本的物料元数据和 Setter 配置。
版本兼容层
- 对旧版本 Schema 做迁移(migration)处理。
- 物料包提供
migrate函数,把旧 Schema 转换到新版本。
// 迁移示例:把 v1 的 size 字段映射到 v2 的 size 字段
function migrateV1ToV2(node) {
if (node.props.size === 'default') {
node.props.size = 'middle';
}
return node;
}二、热更新机制
设计态热更新
- 物料包更新后,设计器重新加载物料元数据。
- 已经拖拽到画布的组件保持原版本,新拖拽的组件使用新版本。
- 或提示用户一键升级存量组件到新版。
运行态热更新
- 运行时通过 CDN 动态加载物料包的 UMD 资源。
- 更新物料包后刷新页面即可生效,不需要重新发布应用。
- 关键业务应用建议锁定版本,避免物料更新带来线上风险。
三、灰度发布
- 新物料版本先在小范围应用灰度。
- 通过应用配置控制使用哪个物料版本。
- 观察错误率和性能指标后再全量推广。
最佳实践:
- Schema 必须记录物料版本,不能依赖运行时默认版本。
- 物料升级要提供迁移脚本和回滚方案。
- 关键应用锁定物料版本,避免非预期更新。
- 建立物料发布审批流程和变更日志。
评分维度:
- 能说明 SemVer 和 Schema 中记录版本的重要性(30%)
- 能说明多版本共存和兼容层方案(30%)
- 能说明设计态和运行态热更新机制(25%)
- 能提到灰度和回滚(15%)
常见错误:
- Schema 不记录物料版本,依赖运行时最新版本。
- 物料 Breaking Change 不做迁移,导致旧应用报错。
- 热更新没有版本锁定,关键应用被意外更新。
- 忽略物料包的依赖版本冲突。
延伸追问:
- 如果两个物料包依赖同一个底层库的不同版本,怎么处理?
- 物料升级后,旧应用的 Schema 如何自动迁移?
相关题目:
参考资源:
口头回答版:
物料版本管理首先要用 SemVer 发布 npm 包,Schema 里要记录每个组件用的物料包名和版本。渲染器和设计器根据版本号加载对应版本,实现多版本共存。旧 Schema 要做迁移,物料包提供 migrate 函数。热更新方面,设计态新拖拽的组件可以用新版本,运行态通过 CDN 动态加载;但关键应用要锁定版本。还要有灰度发布和回滚机制。
FB-52-SE-A-008:低代码平台需要考虑哪些安全问题?
题型:安全题 难度:🟡 进阶 岗位层级:高级 / 专家 面试知识域:52 低代码 标签:低代码、安全、XSS、表达式、权限 出现频率:高频 预计回答时长:5-10 分钟
题目描述: 请说明低代码平台在设计和运行阶段需要重点关注的安全问题,包括表达式执行、数据展示、权限控制等方面。
参考答案:
低代码平台因为允许用户配置页面和逻辑,扩大了攻击面,需要重点关注以下安全问题:
- 表达式/脚本执行安全(XSS & RCE)
- 用户可能在表达式或自定义脚本中注入恶意代码。
- 风险:
eval、new Function、直接执行用户输入字符串。 - 防御:
- 使用沙箱执行表达式,限制可访问的全局变量。
- 白名单机制,只允许访问特定上下文变量。
- 禁止访问
window、document、localStorage等敏感对象。
// 危险示例
eval(userExpression);
// 安全示例:使用沙箱解析器
function safeEvaluate(expr, context) {
const sandbox = new Proxy(context, {
has: () => true,
get: (target, key) => {
if (key in target) return target[key];
throw new Error(`禁止访问: ${String(key)}`);
}
});
return new Function('context', `with(context) { return (${expr}) }`)(sandbox);
}数据展示安全(XSS)
- 用户输入的数据通过组件渲染到页面时,如果没有转义,可能触发 XSS。
- 防御:组件默认对文本内容做 HTML 转义,富文本组件使用白名单过滤标签。
接口调用安全
- 用户配置的数据源可能访问未授权接口。
- 防御:
- 数据源接口需要走平台网关,统一鉴权。
- 后端接口自己做权限校验,不能信任前端参数。
- 禁止前端直接配置跨域请求到任意第三方域名。
权限控制
- 页面、按钮、数据行、字段级别都需要权限控制。
- 权限规则应该由服务端校验,前端只作为展示控制。
上传安全
- 图片、文件上传要限制类型、大小,服务端扫描恶意文件。
- 上传后文件访问路径要控制权限。
SSRF(服务端请求伪造)
- 如果平台代表用户发起请求,要限制可请求的 URL 白名单。
- 不能让用户配置任意后端代理请求。
最佳实践:
- 安全策略默认开启,不能让用户关闭。
- 关键操作需要后端二次校验。
- 定期进行安全审计和渗透测试。
- 对用户上传、用户配置的表达式做输入校验和输出转义。
评分维度:
- 能说出 4 个以上安全维度(30%)
- 能详细说明表达式沙箱和 XSS 防御(35%)
- 能说明接口和权限安全(20%)
- 能提到上传和 SSRF(15%)
常见错误:
- 直接用
eval执行用户表达式。 - 认为 XSS 只存在于输入框,忽略组件渲染的数据绑定。
- 前端做权限控制就认为安全,忽略后端校验。
- 允许用户配置任意第三方接口。
延伸追问:
- 如何设计一个既安全又灵活的表达式引擎?
- 如果业务需要执行自定义 JavaScript,怎么做沙箱隔离?
相关题目:
参考资源:
口头回答版:
低代码平台安全问题比较多。第一是表达式执行安全,不能用 eval,要用沙箱执行,限制能访问的变量;第二是数据展示 XSS,组件默认要转义;第三是接口调用安全,数据源要走网关鉴权,后端要二次校验;第四是页面、按钮、字段级别的权限控制;第五是上传安全;第六是 SSRF,不能让平台代理用户请求任意地址。安全策略要默认开启,关键操作后端再验。
深入题(8 道)
FB-52-FS-P-001:低代码渲染引擎的核心原理是什么?
题型:框架原理题 难度:🔴 深入 岗位层级:专家 / 架构师 面试知识域:52 低代码 标签:低代码、渲染引擎、Schema、虚拟 DOM、运行时 出现频率:高频 预计回答时长:8-15 分钟
题目描述: 请深入说明低代码渲染引擎的核心原理,包括它是如何解析 Schema、处理数据绑定、事件绑定、条件渲染和循环渲染的。
参考答案:
低代码渲染引擎是连接 Schema 和真实 UI 的桥梁。它的核心任务是把 JSON 描述的页面结构转换为可交互的界面。
一、核心模块
Schema 解析器(Parser)
- 把原始 Schema 解析为内部节点树。
- 处理循环渲染(
loop)、条件渲染(condition)、插槽(slot)等语法糖。
表达式引擎(Expression Engine)
- 解析
{{ }}表达式,从上下文中取值。 - 支持变量、运算符、函数调用、过滤器。
- 必须在沙箱中执行。
- 解析
组件映射表(Component Map)
- 根据
componentName查找运行时组件。 - 支持运行时动态注册组件。
- 根据
渲染器(Renderer)
- 递归遍历节点树,创建组件实例并传递 props。
- 处理 children、循环、条件、事件绑定。
上下文管理器(Context Manager)
- 维护页面级状态、URL 参数、全局变量、数据源结果。
- 提供
getValue、setValue、callDataSource等 API。
二、关键渲染流程
Schema -> Parser 解析 -> 节点树
|
v
Renderer 递归渲染
|
+---------------+---------------+
| | |
解析 props 解析 condition 解析 loop
| | |
v v v
表达式求值 判断是否渲染 循环生成子节点
| | |
+---------------+---------------+
|
v
查找组件并创建 React/Vue 节点三、条件渲染与循环渲染示例
{
"componentName": "List",
"condition": "{{ items.length > 0 }}",
"loop": "{{ items }}",
"loopArgs": ["item", "index"],
"props": {
"title": "{{ item.name }}"
}
}渲染器处理逻辑:
function renderNode(node, context) {
// 1. 条件渲染
if (node.condition !== undefined) {
const visible = evaluate(node.condition, context);
if (!visible) return null;
}
// 2. 循环渲染
if (node.loop) {
const list = evaluate(node.loop, context);
if (!Array.isArray(list)) return null;
return list.map((item, index) => {
const loopContext = {
...context,
[node.loopArgs[0]]: item,
[node.loopArgs[1]]: index
};
return renderSingleNode(node, loopContext);
});
}
return renderSingleNode(node, context);
}四、事件绑定
事件绑定把组件事件映射为动作链:
function bindEvents(nodeProps, eventsConfig, context) {
const events = {};
for (const [eventName, actions] of Object.entries(eventsConfig || {})) {
events[eventName] = (...args) => {
context.eventArgs = args;
executeActions(actions, context);
};
}
return events;
}最佳实践:
- 渲染器和设计器画布尽量复用同一套实现,保证所见即所得。
- 表达式引擎要预编译缓存,避免每次渲染重新解析。
- 大页面使用虚拟化或分片渲染。
- 节点树解析结果可缓存,相同 Schema 不再重复解析。
评分维度:
- 能说出渲染引擎的 4 个以上核心模块(25%)
- 能说明 Schema 到 UI 的完整渲染流程(25%)
- 能解释条件渲染、循环渲染、事件绑定的实现(30%)
- 能提到表达式沙箱和性能优化(20%)
常见错误:
- 认为渲染引擎只是递归创建组件,忽略解析器和表达式引擎。
- 条件渲染用 CSS 隐藏而不是控制渲染。
- 循环渲染没有提供独立的上下文,导致变量污染。
- 事件绑定直接执行字符串代码,没有做动作编排抽象。
延伸追问:
- 渲染引擎如何处理组件错误边界?
- 如何实现渲染器与设计器画布共享同一套代码?
相关题目:
参考资源:
口头回答版:
低代码渲染引擎核心是把 JSON Schema 转成真实 UI。主要模块有 Schema 解析器、表达式引擎、组件映射表、渲染器、上下文管理器。解析器把 Schema 转成节点树;表达式引擎解析
{{ }}里的变量;渲染器递归遍历节点树,处理条件渲染、循环渲染、事件绑定;最后根据 componentName 找到组件创建出来。循环渲染要给每次迭代创建独立上下文,事件绑定要映射到动作链。表达式要在沙箱里执行,还要做预编译缓存。
FB-52-SD-P-002:如何设计一个低代码页面渲染引擎?
题型:系统设计题 难度:🔴 深入 岗位层级:专家 / 架构师 面试知识域:52 低代码 标签:低代码、渲染引擎、系统设计、运行时、组件映射 出现频率:高频 预计回答时长:10-15 分钟
题目描述: 请设计一个低代码页面渲染引擎,要求支持组件渲染、数据绑定、事件动作、生命周期、错误处理,并能够与设计态共享核心能力。
参考答案:
一、整体架构
+---------------------+
| Schema |
+---------------------+
|
v
+---------------------+
| Schema Parser | 解析循环、条件、插槽
+---------------------+
|
v
+---------------------+
| Expression Engine | 解析 {{ }} 表达式
+---------------------+
|
v
+---------------------+
| Renderer | 递归渲染组件树
+---------------------+
|
v
+---------------------+
| Component Map | componentName -> 组件
+---------------------+
|
v
+---------------------+
| Real UI |
+---------------------+二、核心设计
Schema 协议层
- 定义统一的节点结构:
componentName、props、children、condition、loop、loopArgs、events、lifeCycles。 - 协议要向后兼容,升级时提供 migrate 能力。
- 定义统一的节点结构:
解析器(Parser)
- 把 Schema 解析为内部渲染节点树。
- 处理语法糖:
loop展开为多个子节点,condition标记跳过渲染。 - 校验节点合法性,如
componentName必填、props 类型校验。
表达式引擎
- 支持
{{ }}语法。 - 提供上下文:state、props、urlParams、dataSource、循环变量。
- 沙箱执行,禁止访问危险全局变量。
- 支持预编译缓存。
- 支持
组件映射与加载
- 组件映射表维护
componentName -> Component。 - 支持按物料包版本加载不同组件。
- 组件未找到时显示占位组件,不能白屏。
- 组件映射表维护
渲染器(Renderer)
- 递归渲染节点树。
- 处理 props 中的表达式、事件绑定、children。
- 支持 Fragment、Portal、Suspense 等特殊组件。
动作执行器
- 事件触发后按动作链顺序执行。
- 动作类型:
setState、callDataSource、openModal、navigate、validate。 - 支持同步/异步、条件分支、错误处理。
生命周期管理
- 页面级生命周期:
onPageLoad、onPageShow、onPageHide。 - 组件级生命周期:
onMount、onUnmount、onUpdate。
- 页面级生命周期:
错误处理
- 组件错误边界捕获渲染异常。
- 表达式执行失败返回默认值并记录日志。
- 数据源请求失败显示友好错误状态。
三、与设计态共享
- 把解析器、表达式引擎、组件映射表抽成独立包。
- 设计态画布复用运行时渲染器,只是额外注入设计态高亮、选中等能力。
- 设计态和运行态用同一套 Schema 协议。
四、扩展机制
- 组件注册:
engine.registerComponent(name, Component, meta)。 - 动作注册:
engine.registerAction(type, handler)。 - 表达式函数注册:
engine.registerFunction(name, fn)。
最佳实践:
- 渲染引擎不要依赖具体框架,核心逻辑用纯 JS 实现,UI 层用 React/Vue 适配。
- 大数据页面要支持分片渲染和虚拟滚动。
- 表达式执行失败不能阻断整页渲染。
评分维度:
- 能设计完整的渲染引擎架构(25%)
- 能说明解析器、表达式引擎、渲染器、动作执行器(30%)
- 能说明生命周期、错误处理、扩展机制(25%)
- 能提到与设计态共享(20%)
常见错误:
- 渲染引擎和框架强耦合,无法迁移。
- 没有错误边界,一个组件报错整页白屏。
- 表达式引擎直接 eval,存在安全风险。
- 设计态和运行态各写一套渲染逻辑。
延伸追问:
- 如果渲染引擎要同时支持 React 和 Vue,架构上怎么抽象?
- 如何处理页面级生命周期的顺序和依赖?
相关题目:
参考资源:
口头回答版:
设计渲染引擎,我会分成几层:Schema 协议层、解析器、表达式引擎、渲染器、组件映射表、动作执行器。Schema 协议要定义清楚节点结构,解析器处理循环条件这些语法糖,表达式引擎解析
{{ }}并在沙箱里执行,渲染器递归生成组件树,动作执行器处理事件。还要加生命周期、错误边界、扩展机制。核心逻辑尽量和框架解耦,设计态画布直接复用运行时渲染器,保证所见即所得。
FB-52-CO-P-003:低代码平台的出码(Code Generation)和二次开发如何设计?
题型:概念题 难度:🔴 深入 岗位层级:专家 / 架构师 面试知识域:52 低代码 标签:低代码、出码、二次开发、代码生成、ProCode 出现频率:高频 预计回答时长:8-15 分钟
题目描述: 请说明低代码平台的出码机制设计思路,包括如何把 Schema 转译为可维护代码,以及如何支持用户在生成代码基础上进行二次开发。
参考答案:
出码(Code Generation)是低代码平台从“配置”走向“可维护源码”的关键能力,也是企业级低代码平台区别于无代码平台的重要标志。
一、出码的目标
- 可维护:生成的代码符合团队编码规范,结构清晰。
- 可读:变量命名、组件结构、注释要友好。
- 可扩展:支持二次开发,用户可以在生成代码上写自定义逻辑。
- 可回滚:修改后可以选择回滚到 Schema 重新生成。
二、出码流程
Schema -> AST 转换 -> 代码模板渲染 -> 生成源码文件 -> 格式化/校验Schema 解析
- 把 Schema 节点树转换为中间表示(IR)。
- 识别页面结构、状态、数据源、事件、生命周期。
代码生成
- 根据目标框架(React / Vue / 小程序)选择代码模板。
- 生成页面组件、状态管理、样式文件、类型定义。
格式化与校验
- 用 Prettier 格式化,ESLint 校验。
- 生成符合团队规范的代码。
三、生成代码示例
Schema:
{
"componentName": "Page",
"state": { "count": 0 },
"children": [
{
"componentName": "Text",
"props": { "content": "{{ count }}" }
},
{
"componentName": "Button",
"props": {
"text": "增加",
"onClick": {
"actionType": "setState",
"args": ["count", "{{ count + 1 }}"]
}
}
}
]
}生成 React 代码:
import { useState } from 'react';
import { Text, Button } from '@company/ui';
export default function Page() {
const [count, setCount] = useState(0);
return (
<div className="page">
<Text content={count} />
<Button text="增加" onClick={() => setCount(count + 1)} />
</div>
);
}四、二次开发机制
- 保护区(Safe Zone)
- 在生成的代码中划分“可手写区”和“不可手写区”。
- 可手写区用注释标记,重新出码时保留。
// --- CUSTOM CODE START ---
function customValidator(value) {
return value.length > 6;
}
// --- CUSTOM CODE END ---扩展点(Extension Points)
- 在 Schema 中预留自定义脚本、自定义组件、自定义 Hook 的入口。
- 出码时把这些扩展点渲染为真实代码。
双向同步(可选)
- 简单修改:在代码上改完后,反向解析回 Schema。
- 复杂修改:建议单向出码,后续在 ProCode 模式维护。
最佳实践:
- 出码不是唯一目标,平台应同时支持运行时渲染和出码两种模式。
- 出码代码质量要高,能直接进代码仓库和 CI/CD。
- 明确平台能力和二次开发的边界,避免无限兜底。
评分维度:
- 能说明出码的目标和流程(25%)
- 能给出 Schema 转代码的示例(25%)
- 能说明保护区、扩展点、双向同步等二次开发机制(30%)
- 能提到出码代码要符合团队规范(20%)
常见错误:
- 生成的代码不可读,无法维护。
- 出码后用户手写代码,重新出码时全部覆盖。
- 认为所有应用都应该出码,忽略运行时渲染的优势。
- 出码代码没有类型定义和单元测试。
延伸追问:
- 出码和运行时渲染各有什么优缺点?
- 如何设计保护区,让手写代码在重新出码时不丢失?
相关题目:
参考资源:
口头回答版:
出码就是把 Schema 转成可维护的源码。流程是 Schema 解析成中间表示,再根据目标框架选模板生成代码,最后用 Prettier 和 ESLint 格式化校验。生成代码要可读、可维护、可扩展。二次开发可以用保护区机制,把用户手写代码包在注释标记里,重新出码时保留;也可以预留扩展点让用户写自定义脚本。出码和运行时渲染不是互斥的,复杂应用出码后可能进 ProCode 模式维护。
FB-52-CD-P-004:请实现一个 JSON Schema 到 React 组件的简易出码器
题型:手写代码题 难度:🔴 深入 岗位层级:专家 / 架构师 面试知识域:52 低代码 标签:低代码、出码、代码生成、React、AST 出现频率:中频 预计回答时长:10-15 分钟
题目描述: 给定一个低代码页面 Schema,请用 JavaScript 实现一个简易出码器,将 Schema 转换为 JSX 字符串。要求支持状态声明、props 传递、事件绑定。
参考答案:
假设 Schema:
{
"componentName": "Page",
"state": {
"count": 0,
"user": { "name": "Alice" }
},
"children": [
{
"componentName": "Text",
"props": { "content": "{{ user.name }}" }
},
{
"componentName": "Button",
"props": {
"text": "增加",
"onClick": {
"actionType": "setState",
"args": ["count", "{{ count + 1 }}"]
}
}
}
]
}出码器实现:
function generateCode(schema) {
const { state = {}, children = [] } = schema;
// 1. 生成 useState 声明
const stateDeclares = Object.entries(state)
.map(([key, value]) => {
const initialValue = JSON.stringify(value);
return `const [${key}, set${capitalize(key)}] = useState(${initialValue});`;
})
.join('\n ');
// 2. 递归生成 JSX
const jsx = children.map(child => renderNode(child)).join('\n ');
return `
import { useState } from 'react';
import { Text, Button } from '@company/ui';
export default function Page() {
${stateDeclares}
return (
<div className="page">
${jsx}
</div>
);
}
`.trim();
}
function renderNode(node) {
const { componentName, props = {}, children = [] } = node;
const propStr = Object.entries(props)
.map(([key, value]) => renderProp(key, value))
.join(' ');
const childrenJsx = Array.isArray(children)
? children.map(child => renderNode(child)).join('\n ')
: '';
if (childrenJsx) {
return `<${componentName} ${propStr}>\n ${childrenJsx}\n </${componentName}>`;
}
return `<${componentName} ${propStr} />`;
}
function renderProp(key, value) {
// 表达式绑定
if (typeof value === 'string' && value.startsWith('{{') && value.endsWith('}}')) {
const expr = value.slice(2, -2).trim();
// onXxx 事件绑定为函数
if (key.startsWith('on')) {
const action = parseAction(expr); // 假设解析动作
return `${key}={() => ${action}}`;
}
return `${key}={${expr}}`;
}
// 普通值
return `${key}={${JSON.stringify(value)}}`;
}
function parseAction(expr) {
// 简易示例:把 setState 动作映射为 setCount(count + 1)
return expr;
}
function capitalize(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
// 输出
console.log(generateCode(schema));生成结果:
import { useState } from 'react';
import { Text, Button } from '@company/ui';
export default function Page() {
const [count, setCount] = useState(0);
const [user, setUser] = useState({"name":"Alice"});
return (
<div className="page">
<Text content={user.name} />
<Button text="增加" onClick={() => setCount(count + 1)} />
</div>
);
}关键点:
- 状态生成要支持对象、数组、基本类型。
- props 要区分普通值、表达式、事件函数。
- children 递归处理。
- 生产环境建议用 AST 生成(如
@babel/generator),而不是字符串拼接。
评分维度:
- 能生成 useState 状态声明(25%)
- 能递归生成 JSX(25%)
- 能处理表达式和事件绑定(30%)
- 能提到 AST 生成更安全可靠(20%)
常见错误:
- 字符串拼接导致 JSX 语法错误。
- 事件绑定直接写成字符串而不是函数。
- 嵌套对象状态生成错误的 useState 声明。
- 没有处理 children 为空的情况。
延伸追问:
- 如果 Schema 支持循环渲染,出码时怎么生成?
- 为什么要用 AST 而不是字符串拼接?
相关题目:
参考资源:
口头回答版:
简易出码器可以基于字符串拼接实现。先遍历 state 生成 useState 声明;然后递归遍历 children 生成 JSX。props 要分情况:普通值直接 JSON.stringify;表达式
{{ }}把内容取出来;onXxx 事件要包成函数。最后拼接成完整文件字符串。但生产环境最好用 Babel AST 来生成代码,更健壮,不容易拼错。
FB-52-SC-P-005:如何设计一个低代码流程设计器?
题型:场景设计题 难度:🔴 深入 岗位层级:专家 / 架构师 面试知识域:52 低代码 标签:低代码、流程设计器、BPMN、DAG、节点编排 出现频率:中频 预计回答时长:8-15 分钟
题目描述: 请设计一个低代码流程设计器,支持拖拽节点、连线、配置节点属性、校验流程合法性,并能够与后端流程引擎对接。
参考答案:
流程设计器用于让用户通过可视化方式编排业务流程,如审批流、工作流、自动化规则。
一、核心模型
节点(Node)
- 表示流程中的一个步骤,如开始、结束、审批、条件判断、任务。
- 节点属性:id、type、name、x、y、config。
边(Edge)
- 表示节点之间的流转关系。
- 边属性:id、source、target、condition。
流程图(Graph)
- 由节点和边组成的有向图。
- 常用 DAG(有向无环图)模型,避免循环死锁。
二、技术选型
| 能力 | 方案 |
|---|---|
| 画布渲染 | SVG / Canvas / HTML + CSS + 库(如 ReactFlow、@antv/x6、BPMN.js) |
| 节点拖拽 | HTML5 Drag & Drop 或库内置能力 |
| 连线 | 锚点连接 + 贝塞尔曲线 |
| 数据模型 | 节点数组 + 边数组,可导出为 BPMN 或自定义 JSON |
| 后端对接 | 调用工作流引擎 API,如 Activiti、Flowable、Camunda |
三、流程合法性校验
- 连通性校验:开始节点必须能到达结束节点。
- 环检测:流程不能出现死循环(除非明确支持循环)。
- 分支覆盖:条件分支必须有默认分支。
- 节点必填校验:每个节点的必要配置是否完整。
- 唯一性校验:节点 id、边 id 不能重复。
function hasCycle(nodes, edges) {
const graph = buildAdjacencyList(edges);
const visited = new Set();
const recStack = new Set();
function dfs(nodeId) {
visited.add(nodeId);
recStack.add(nodeId);
for (const next of graph[nodeId] || []) {
if (!visited.has(next)) {
if (dfs(next)) return true;
} else if (recStack.has(next)) {
return true;
}
}
recStack.delete(nodeId);
return false;
}
for (const node of nodes) {
if (!visited.has(node.id) && dfs(node.id)) return true;
}
return false;
}四、节点属性配置
- 选中节点后,属性面板显示该节点的配置表单。
- 审批节点:配置审批人、审批方式、抄送人。
- 条件节点:配置分支条件表达式。
- 任务节点:配置任务类型、执行人、表单字段。
五、与后端流程引擎对接
- 把流程图 JSON 转换为后端引擎可识别的格式,如 BPMN 2.0 XML。
- 后端部署流程定义,前端支持版本管理和发布。
- 运行时根据流程实例展示当前节点、审批历史、待办任务。
最佳实践:
- 流程模型尽量对齐 BPMN 2.0,便于和成熟工作流引擎对接。
- 画布操作要支持撤销/重做、自动保存。
- 复杂流程支持子流程和分组。
- 流程发布前必须强制校验通过。
评分维度:
- 能抽象出节点、边、图三个核心模型(25%)
- 能说明画布技术选型和节点拖拽连线(25%)
- 能说明流程合法性校验(25%)
- 能说明与后端引擎对接方式(15%)
- 能提到撤销重做和版本管理(10%)
常见错误:
- 流程模型设计过于简单,无法表达分支、并行、子流程。
- 忽略环检测,导致流程死循环。
- 前端只画流程图,不和后端引擎数据模型对齐。
- 没有撤销重做,用户体验差。
延伸追问:
- 如果流程支持会签(多人审批),节点模型怎么设计?
- 流程设计器如何保证前端画布和后端引擎状态一致?
相关题目:
参考资源:
口头回答版:
流程设计器核心是节点和边组成的有向图。节点是流程步骤,边是流转关系。画布可以用 SVG 或 ReactFlow、X6 这些库实现拖拽和连线。关键要做合法性校验:连通性、环检测、分支默认、节点必填。流程图数据可以导出成 BPMN 或自定义 JSON,然后转成后端工作流引擎能识别的格式部署。还要支持撤销重做、自动保存、版本管理。
FB-52-PE-P-006:如何优化低代码平台中大数据量表格的性能?
题型:性能优化题 难度:🔴 深入 岗位层级:专家 / 架构师 面试知识域:52 低代码 标签:低代码、表格性能、虚拟滚动、分页、大数据 出现频率:高频 预计回答时长:8-15 分钟
题目描述: 在低代码平台中,表格经常需要展示大量数据。请说明如何从数据层、渲染层、交互层三个维度优化大数据量表格的性能。
参考答案:
一、数据层优化
后端分页
- 数据量大时优先使用后端分页,只请求当前页数据。
- 配合排序、筛选参数,减少传输数据量。
滚动加载(Infinite Scroll)
- 适合不需要精确分页号的场景。
- 用户滚动到底部时自动加载下一页。
数据缓存
- 同一页数据避免重复请求。
- 使用 SWR 或 React Query 等缓存策略。
字段精简
- 只请求表格展示需要的字段,不要一次性拉全量字段。
二、渲染层优化
- 虚拟滚动(Virtual Scroll)
- 只渲染可视区域内的行,DOM 节点数量固定。
- 常用库:
react-window、react-virtualized、AG Grid。
import { FixedSizeList as List } from 'react-window';
function VirtualTable({ rows, rowHeight, height }) {
return (
<List
height={height}
itemCount={rows.length}
itemSize={rowHeight}
>
{({ index, style }) => (
<div style={style}>
<TableRow data={rows[index]} />
</div>
)}
</List>
);
}行级 Memo
- 行组件用
React.memo或Vue的v-memo避免不必要的重渲染。 - 只有数据变化的行才重新渲染。
- 行组件用
列渲染按需
- 复杂列(如自定义组件、图片)按需渲染。
- 不可见列不渲染或延迟渲染。
减少 re-render
- 表格状态(如选中行)不要和提升为整个表格的 state,避免整表重渲染。
- 用 selector 模式按需订阅。
三、交互层优化
搜索防抖
- 搜索输入延迟 300-500ms 再触发请求。
批量操作
- 选中大量行时,不要为每一行都创建响应式状态。
- 用 Set 存储选中行的 id。
列宽调整、排序优化
- 列宽调整只做本地状态更新,不重新请求数据。
- 排序参数变更后再请求后端数据。
骨架屏和占位
- 数据加载时显示骨架屏,避免白屏和布局抖动。
最佳实践:
- 10 万行以上必须虚拟滚动。
- 性能优化前先测量,用 Chrome Performance 看主线程长任务。
- 表格配置(列、排序、筛选)变更时,区分哪些需要重新请求,哪些只更新本地状态。
评分维度:
- 能从数据层说出 2 个以上优化手段(25%)
- 能从渲染层说出 2 个以上优化手段(35%)
- 能从交互层说出 2 个以上优化手段(25%)
- 能结合具体数据量给出方案选型(15%)
常见错误:
- 数据量大还用前端分页,一次性加载所有数据。
- 虚拟滚动和表格内置样式冲突,导致表头不同步。
- 每个单元格都用复杂自定义组件,渲染性能差。
- 搜索输入每次变化都发请求,不做防抖。
延伸追问:
- 表格列很多(比如 100 列)时,除了虚拟滚动还要做什么?
- 虚拟滚动和表格的排序、筛选怎么结合?
相关题目:
参考资源:
口头回答版:
大数据量表格优化分三层。数据层优先后端分页,配合排序筛选;数据做缓存,只请求需要的字段。渲染层用虚拟滚动,只渲染可视区域;行组件 memo;复杂列按需渲染;减少整表 re-render。交互层搜索要防抖,批量操作用 Set 存选中 id,列宽调整只更新本地状态。10 万行以上必须用虚拟滚动,优化前先测量。
FB-52-EN-P-007:低代码平台的多人协作与实时同步如何实现?
题型:工程化题 难度:🔴 深入 岗位层级:专家 / 架构师 面试知识域:52 低代码 标签:低代码、多人协作、实时同步、OT、CRDT 出现频率:中频 预计回答时长:8-15 分钟
题目描述: 请设计一个低代码平台的多人协作方案,支持多个用户同时编辑同一个应用,并保证数据一致性和冲突处理。
参考答案:
低代码平台多人协作的核心是让多个用户实时看到彼此的修改,并正确处理冲突。
一、技术方案选型
| 方案 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| OT(Operational Transformation) | 操作转换,把并发操作转换为可顺序执行的操作 | 成熟,文本协作常用 | 实现复杂,对 JSON 树结构支持有限 | 文本、简单 JSON |
| CRDT(Conflict-free Replicated Data Types) | 无冲突复制数据类型,每个操作天然可合并 | 适合分布式,离线支持好 | 数据量大时可能有性能开销 | 复杂数据结构、离线协作 |
| 乐观锁 + 版本号 | 每次保存检查版本号,冲突时提示用户 | 简单,易实现 | 实时性差,冲突率高时体验差 | 低并发、简单场景 |
| 锁机制 | 编辑某部分时加锁,其他人只读 | 实现简单,无冲突 | 并发低,体验差 | 强一致性要求 |
二、基于 OT/CRDT 的协作架构
用户 A 编辑 -> 本地应用操作 -> WebSocket -> 服务端 -> 广播给其他用户
|
v
OT/CRDT 协调中心操作抽象
- 把用户对 Schema 的修改抽象为原子操作:addNode、removeNode、updateProp、moveNode。
- 每个操作包含:type、path、value、timestamp、userId、operationId。
实时通信
- 使用 WebSocket 或 SSE 推送操作。
- 消息到达后本地应用操作,更新视图。
冲突处理
- OT:服务端根据已有操作转换新操作,再广播。
- CRDT:本地直接合并,保证最终一致性。
光标与选区同步
- 显示其他用户当前选中的组件或属性。
- 用不同颜色标识不同用户。
三、简化方案:基于版本号的乐观锁
async function saveSchema(schema, baseVersion) {
const response = await fetch('/api/app/save', {
method: 'POST',
body: JSON.stringify({ schema, baseVersion })
});
if (response.status === 409) {
// 版本冲突,提示用户合并或覆盖
showConflictDialog();
}
}四、最佳实践
- 优先采用“协作粒度控制”:不同用户编辑不同页面或不同组件时避免冲突。
- 对 Schema 做细粒度变更追踪,不要整份 Schema 替换。
- 提供操作历史(undo/redo)和版本快照。
- 离线编辑时本地缓存操作,联网后同步。
评分维度:
- 能对比 OT、CRDT、乐观锁等方案(30%)
- 能说明协作架构和操作抽象(25%)
- 能说明冲突处理策略(25%)
- 能提到光标同步、版本快照等细节(20%)
常见错误:
- 直接全量替换 Schema 做同步,导致冲突频繁。
- 忽略离线场景和断网重连。
- 冲突时直接覆盖,不提示用户。
- 没有操作粒度控制,所有人编辑同一份大 JSON。
延伸追问:
- 如果两个用户同时修改同一个组件的同一个属性,怎么合并?
- CRDT 在低代码场景下有什么优缺点?
相关题目:
参考资源:
口头回答版:
多人协作常见方案有 OT、CRDT、乐观锁、锁机制。OT 适合文本,CRDT 适合复杂数据且支持离线,乐观锁实现简单但实时性差。低代码平台建议把对 Schema 的修改抽象成原子操作,比如 addNode、updateProp,通过 WebSocket 实时同步,服务端用 OT 或 CRDT 协调冲突。还要做光标同步、版本快照、undo/redo。简单场景可以用版本号乐观锁,冲突时提示用户合并。
FB-52-CP-P-008:低代码开发和传统 ProCode 开发的边界在哪里?
题型:综合开放题 难度:🔴 深入 岗位层级:专家 / 架构师 面试知识域:52 低代码 标签:低代码、ProCode、边界、选型、综合开放 出现频率:高频 预计回答时长:8-15 分钟
题目描述: 请分析低代码开发和传统 ProCode 开发的边界,什么样的场景适合低代码,什么样的场景必须坚持 ProCode?
参考答案:
低代码和 ProCode 不是非此即彼,而是各有边界。合理划分边界是平台成功的关键。
一、适合低代码的场景
标准化、重复性高的页面
- 表单页、列表页、详情页、审批流。
- 页面结构相似,通过配置即可生成。
变化快、生命周期短的应用
- 运营活动页、问卷调查、临时审批。
- 需要快速上线、快速迭代。
业务人员能理解的逻辑
- 简单的数据展示、表单提交、条件分支。
- 不需要复杂算法和底层优化。
已经有成熟物料和规范的中后台系统
- 组件库、设计系统、接口规范已经统一。
- 低代码平台可以快速组装。
二、必须坚持 ProCode 的场景
高度定制化的交互和动画
- 复杂的可视化编辑、游戏、创意 H5。
- 低代码平台难以表达细粒度交互。
复杂算法和数据处理
- 图像处理、音视频编解码、复杂计算。
- 需要专业开发者用原生代码实现。
高性能要求的场景
- 大规模数据实时渲染、复杂 3D 场景。
- 需要针对性能做深度优化。
强依赖底层能力的系统
- 浏览器插件、桌面应用、嵌入式系统。
- 低代码平台通常无法覆盖这些运行环境。
核心基础架构
- 组件库、渲染引擎、框架本身。
- 需要高可维护性和可测试性。
三、边界划分原则
| 维度 | 低代码 | ProCode |
|---|---|---|
| 开发效率 | 高 | 相对低 |
| 灵活性 | 中低 | 高 |
| 可维护性 | 依赖平台 | 高 |
| 复杂业务 | 不适合 | 适合 |
| 迭代速度 | 快 | 取决于团队 |
| 人员要求 | 业务人员也可参与 | 需要专业开发 |
四、混合开发模式
低代码搭骨架,ProCode 填血肉
- 用低代码快速搭建页面结构和数据流。
- 复杂组件用 ProCode 开发后注册为自定义物料。
出码后 ProCode 维护
- 初期用低代码快速验证。
- 业务稳定后出码,进入常规工程化维护。
扩展点机制
- 低代码平台预留脚本、自定义 Hook、自定义组件入口。
- 让 ProCode 能无缝接入低代码流程。
最佳实践:
- 不要把低代码当成万能方案。
- 平台能力要有明确边界,超过边界引导用户出码或写自定义代码。
- 建立低代码应用评审机制,避免把不适合的应用硬搬到低代码平台。
评分维度:
- 能清晰划分适合低代码和 ProCode 的场景(35%)
- 能从效率、灵活性、可维护性等维度对比(25%)
- 能说明混合开发模式(25%)
- 能给出实际案例或选型建议(15%)
常见错误:
- 认为低代码可以替代所有开发。
- 把复杂业务硬搬到低代码平台,导致平台不堪重负。
- 完全排斥低代码,忽略其在标准化场景下的效率优势。
延伸追问:
- 你们团队如何决定一个新项目用低代码还是 ProCode?
- 如果低代码平台无法表达某个需求,你怎么引导业务方?
相关题目:
参考资源:
口头回答版:
低代码和 ProCode 不是对立的。标准化、重复性高的页面,比如表单、列表、审批流,变化快的临时应用,适合低代码。高度定制化交互、复杂算法、高性能要求、底层架构、核心系统,必须坚持 ProCode。实际项目中常是混合模式:低代码搭骨架,复杂逻辑用 ProCode 自定义组件或脚本,稳定后也可以出码维护。关键是平台要有清晰边界,不要什么都在低代码里做。
架构题(33 道)
FB-52-SD-R-001:如何设计一个企业级低代码平台的整体架构?
题型:系统设计题 难度:⚫ 架构 岗位层级:架构师 面试知识域:52 低代码 标签:低代码、平台架构、企业级、系统设计、分层 出现频率:高频 预计回答时长:15-30 分钟
题目描述: 请设计一个企业级低代码平台的整体架构,包括设计态、运行态、出码、物料、数据源、权限、监控等核心子系统,并说明它们之间的关系。
参考答案:
一、整体架构分层
┌─────────────────────────────────────────────┐
│ 应用层(Applications) │
│ 设计器 │ 预览/运行 │ 应用门户 │ 管理后台 │
├─────────────────────────────────────────────┤
│ 平台能力层(Platform) │
│ 页面设计 │ 流程设计 │ 表单设计 │ 数据建模 │
├─────────────────────────────────────────────┤
│ 引擎层(Engines) │
│ 渲染引擎 │ 出码引擎 │ 表达式引擎 │ 动作引擎 │
├─────────────────────────────────────────────┤
│ 基础服务层(Foundation) │
│ 物料中心 │ 数据源中心 │ 权限中心 │ 用户中心 │
├─────────────────────────────────────────────┤
│ 基础设施层(Infrastructure) │
│ 存储 │ 缓存 │ 消息队列 │ 网关 │ 监控 │
└─────────────────────────────────────────────┘二、核心子系统
设计器(Designer)
- 组件面板、画布、属性面板、大纲树、数据源配置、动作编排。
- 产出 Schema,保存到应用仓库。
渲染引擎(Renderer)
- 解析 Schema 生成真实页面。
- 设计态和运行态复用同一套渲染能力。
出码引擎(Code Generator)
- 将 Schema 转译为 React / Vue / 小程序代码。
- 支持出码后二次开发。
物料中心(Material Center)
- 管理组件物料包,包括元数据、运行时组件、Setter 配置、版本。
- 支持物料注册、发布、灰度、版本管理。
数据源中心(Data Source Center)
- 统一管理 API、数据库、第三方服务。
- 提供参数、缓存、错误处理、权限控制能力。
权限中心(Auth Center)
- 页面权限、按钮权限、数据权限、字段权限。
- 与组织用户中心对接,支持角色、部门、岗位。
流程引擎(Flow Engine)
- 对接 BPMN 工作流引擎,支持审批流、自动化规则。
应用管理与发布
- 应用版本管理、环境管理(开发/测试/生产)、一键发布、回滚。
监控与治理
- 运行时性能监控、错误监控、Schema 合规检查、应用健康度评估。
三、数据流转
设计器 -> Schema -> 渲染引擎 -> 运行时页面
|
v
出码引擎 -> 源码仓库 -> CI/CD -> 线上部署四、关键技术决策
Schema 协议统一
- 所有子系统围绕统一 Schema 协作。
- Schema 升级必须向后兼容。
设计态与运行态解耦
- 设计态关注交互体验,运行态关注渲染性能。
- 但核心渲染逻辑共享。
扩展机制
- 组件、动作、Setter、数据源、校验规则都可注册扩展。
- 插件化架构便于生态建设。
多租户与隔离
- 企业级平台通常多租户,应用、数据、物料需要隔离。
最佳实践:
- 不要一开始就做大而全,先围绕核心场景(如表单、列表)跑通闭环。
- 平台各层边界清晰,避免子系统之间直接耦合。
- 重视 Schema 的长期演进和迁移能力。
评分维度:
- 能设计清晰的分层架构(25%)
- 能说明 6 个以上核心子系统(30%)
- 能说明子系统间数据流转(20%)
- 能提到扩展机制、多租户、Schema 演进(15%)
- 能给出演进路径(10%)
常见错误:
- 架构设计过于庞大,没有 MVP 思路。
- 各子系统直接操作 Schema,没有统一协议。
- 设计态和运行态完全独立开发,导致不一致。
- 忽略企业级特性:权限、多租户、审计。
延伸追问:
- 如果平台要同时支持 React 和 Vue,架构上怎么抽象?
- 如何评估一个企业级低代码平台的成熟度?
相关题目:
参考资源:
口头回答版:
企业级低代码平台我会分成五层:应用层、平台能力层、引擎层、基础服务层、基础设施层。核心子系统包括设计器、渲染引擎、出码引擎、物料中心、数据源中心、权限中心、流程引擎、应用管理、监控治理。所有子系统围绕统一 Schema 协作,设计态和运行态共享渲染能力。要有组件、动作、数据源这些扩展机制,还要考虑多租户、权限、Schema 长期演进。平台不要一开始就做大而全,先跑通核心场景。
FB-52-SD-R-002:低代码平台如何与企业现有业务系统集成?
题型:系统设计题 难度:⚫ 架构 岗位层级:架构师 面试知识域:52 低代码 标签:低代码、系统集成、SSO、网关、数据中台 出现频率:高频 预计回答时长:10-15 分钟
题目描述: 请设计一个低代码平台与企业现有业务系统(如 ERP、CRM、OA、数据中台)集成的方案,包括单点登录、数据集成、流程集成、权限集成。
参考答案:
企业级低代码平台不可能孤立存在,必须能接入现有 IT 体系。
一、单点登录(SSO)集成
统一身份认证
- 对接企业 IAM、LDAP、AD、OAuth2 / OIDC、SAML。
- 用户登录后获取 Token,平台所有请求携带 Token。
账号同步
- 通过 SCIM 协议或企业组织架构接口同步用户、部门、角色。
- 平台本地缓存组织数据,定期同步。
二、数据集成
- API 网关接入
- 企业已有业务系统通过 API 网关暴露接口。
- 低代码平台的数据源中心统一调用网关,不直连业务系统。
低代码应用 -> 数据源中心 -> 企业 API 网关 -> ERP/CRM/OA数据库直连(受控)
- 对允许的场景,低代码平台可配置只读或受限的数据库连接。
- 需要严格的 SQL 审计和权限控制。
数据中台 / 数据湖
- 对接数据中台的元数据服务,自动发现可用数据表和字段。
- 支持数据模型自动生成表单和表格。
消息队列集成
- 通过 Kafka / RabbitMQ / RocketMQ 接收业务系统事件。
- 低代码应用可订阅事件触发流程或页面刷新。
三、流程集成
工作流引擎对接
- 低代码流程设计器生成 BPMN 后,部署到企业统一工作流引擎。
- 运行时任务、审批状态回写到低代码应用。
事件驱动集成
- 业务系统事件触发低代码应用的自动化流程。
- 例如:CRM 客户状态变更 -> 低代码平台发送通知。
四、权限集成
角色权限同步
- 企业统一权限中心管理角色,低代码平台拉取角色列表。
- 页面、按钮、数据行、字段级权限绑定角色。
数据权限
- 通过用户上下文(部门、岗位、项目)控制数据可见范围。
- 数据权限规则由业务系统或数据中台提供,低代码平台透传。
审计日志
- 所有数据操作记录审计日志,对接企业安全审计系统。
五、集成规范
- 统一协议:REST / GraphQL / gRPC。
- 统一数据格式:JSON。
- 统一错误码和错误处理。
- 统一超时、重试、熔断策略。
最佳实践:
- 优先通过网关和消息队列集成,不要直接暴露业务系统内部接口。
- 数据权限和敏感操作必须由后端最终校验。
- 建立集成标准和连接器市场,降低后续接入成本。
评分维度:
- 能说明 SSO、数据、流程、权限四个集成维度(35%)
- 能说明 API 网关、消息队列、数据中台等集成方式(25%)
- 能强调数据权限和审计安全(20%)
- 能给出集成架构图或数据流向(20%)
常见错误:
- 低代码平台直连业务数据库,缺乏权限控制。
- 前端做权限判断,后端不做校验。
- 接口没有统一网关,导致安全边界模糊。
- 忽略审计日志和企业安全合规要求。
延伸追问:
- 如果企业系统接口不规范,低代码平台怎么快速适配?
- 低代码平台如何支持跨系统的数据编排(一个页面调用多个系统接口)?
相关题目:
参考资源:
口头回答版:
低代码平台集成企业系统主要从四块入手。单点登录对接 IAM、OAuth2、LDAP;数据集成走企业 API 网关,也可以对接数据中台,通过消息队列接收事件;流程集成把 BPMN 部署到统一工作流引擎;权限集成拉取企业角色,做页面、按钮、数据行、字段级权限,数据权限由后端最终校验。所有操作要有审计日志。关键是不要直连业务系统内部接口,要走统一网关。
FB-52-SD-R-003:如何建立低代码平台的平台化治理体系?
题型:系统设计题 难度:⚫ 架构 岗位层级:架构师 面试知识域:52 低代码 标签:低代码、平台治理、规范、质量、生态 出现频率:中频 预计回答时长:10-15 分钟
题目描述: 请说明如何对低代码平台进行治理,包括应用生命周期管理、物料管理、质量管控、性能基线、安全合规、运营分析等方面。
参考答案:
平台化治理是低代码平台从“能用”到“好用、可控”的关键。
一、应用生命周期治理
创建审批
- 应用创建需要申请,明确负责人、业务域、安全等级。
版本管理
- Schema 版本、应用版本、发布版本分离。
- 支持版本对比、回滚、分支管理。
环境管理
- 开发、测试、预发、生产环境隔离。
- 发布流程需要审批和自动化测试。
下线与归档
- 长期不用的应用自动识别并归档。
- 下线前通知相关方,保留历史数据。
二、物料治理
物料准入
- 组件发布前需通过代码评审、测试、性能、安全扫描。
- 建立物料评分和认证机制。
物料版本与灰度
- 新物料版本先灰度到部分应用。
- 监控异常后全量或回滚。
物料复用与淘汰
- 统计物料使用频率,淘汰低质量、低使用率的物料。
- 推动业务使用官方推荐物料。
三、质量管控
Schema 合规检查
- 校验 Schema 是否符合平台协议。
- 检测异常:缺失必填属性、循环依赖、未注册组件。
自动化测试
- 单元测试、集成测试、E2E 测试。
- 低代码应用发布前跑自动化用例。
代码/配置审查
- 关键应用发布前需要 Code Review。
- 自定义脚本、数据源配置需要重点审查。
四、性能基线
性能指标采集
- 首屏时间、交互响应时间、内存占用、接口耗时。
- 建立应用性能评分。
性能门禁
- 发布前性能不达标禁止上线。
- 定期巡检存量应用性能。
五、安全合规
安全扫描
- 表达式、自定义脚本沙箱扫描。
- 数据源接口权限校验。
合规审计
- 记录设计、发布、访问、数据操作日志。
- 满足等保、GDPR、SOC2 等合规要求。
六、运营分析
应用大盘
- 应用数量、活跃用户、页面访问量、错误率。
用户行为分析
- 哪些组件、动作、数据源使用最多。
- 识别平台能力缺口。
最佳实践:
- 治理要“软硬结合”:既有规范和流程,也有自动化工具和门禁。
- 治理规则要可配置,不同业务线可以有不同严格程度。
- 从应用、物料、质量、性能、安全、运营六个维度建立指标体系。
评分维度:
- 能从 4 个以上维度说明治理体系(35%)
- 能详细说明应用生命周期和物料治理(25%)
- 能提到质量门禁和性能基线(20%)
- 能说明安全合规和运营分析(20%)
常见错误:
- 只关注平台建设,忽略治理体系建设。
- 治理规则过于死板,影响业务效率。
- 没有自动化工具,全靠人工检查。
- 忽略存量应用的持续治理。
延伸追问:
- 如何平衡治理规范和业务交付效率?
- 如果某个业务团队一直不遵守平台规范,你怎么处理?
相关题目:
参考资源:
口头回答版:
低代码平台治理要从六个维度做:应用生命周期、物料管理、质量管控、性能基线、安全合规、运营分析。应用创建、发布、下线要走审批和版本管理;物料发布前要做评审、测试、灰度;Schema 要做合规检查;发布前跑自动化测试和性能门禁;表达式和数据源要做安全扫描;操作要记审计日志。治理要软硬结合,有规范也有自动化门禁,规则可配置,不能影响业务效率。
FB-52-SS-R-004:作为架构师,你如何推动业务团队使用低代码平台?
题型:软技能题 难度:⚫ 架构 岗位层级:架构师 面试知识域:52 低代码 标签:低代码、推动落地、软技能、组织变革、架构师 出现频率:中频 预计回答时长:10-15 分钟
题目描述: 假设你负责企业低代码平台建设,但业务团队对采用低代码有疑虑。请说明你会如何推动业务团队接受并使用低代码平台。
参考答案:
推动低代码平台落地不仅是技术问题,更是组织变革问题。需要从价值证明、降低门槛、建立信任、激励机制、持续运营五个方面入手。
一、价值证明
找试点场景
- 选择 1-2 个标准化程度高、需求迫切、业务团队愿意配合的场景做试点。
- 例如:内部审批流、运营配置后台、数据报表。
量化收益
- 对比低代码开发和传统开发的周期、人力、缺陷率。
- 用真实数据证明效率提升,如“某表单页从 5 人天降到 0.5 人天”。
二、降低门槛
培训与赋能
- 提供分层培训:业务人员学配置,开发人员学扩展和出码。
- 提供模板市场、最佳实践文档、视频教程。
贴身支持
- 初期派驻“低代码专家”到业务团队,手把手解决问题。
- 建立答疑群和快速响应机制。
完善物料和模板
- 根据业务线特点预置常用模板和组件。
- 让业务团队感觉“搭起来很快”。
三、建立信任
保证稳定性
- 平台 SLA 要明确,发布流程要可靠。
- 建立应急响应和回滚机制。
数据安全承诺
- 明确数据归属、访问范围、审计能力。
- 消除业务团队对安全和合规的顾虑。
成功案例分享
- 定期举办内部分享会,让已经成功的业务团队讲经验。
四、激励机制
认可与奖励
- 对积极使用低代码的团队和个人给予表彰。
- 纳入绩效考核或技术影响力评估。
降低维护负担
- 让业务团队感受到低代码应用维护成本更低。
- 提供持续的运营和优化支持。
五、持续运营
收集反馈
- 建立反馈渠道,定期访谈业务团队。
- 根据反馈迭代平台能力。
能力开放
- 让业务团队能贡献物料、模板、最佳实践。
- 形成平台共建氛围。
最佳实践:
- 不要强行推广,先用成功案例说话。
- 尊重业务团队的现有流程和习惯,平滑过渡。
- 平台团队要有服务意识,把业务团队当客户。
评分维度:
- 能从价值证明、降低门槛、建立信任、激励、运营五个维度回答(35%)
- 能给出具体可执行的措施(30%)
- 能体现对业务团队顾虑的理解(20%)
- 能提到度量指标和反馈闭环(15%)
常见错误:
- 只讲技术先进性,不讲业务收益。
- 强行要求所有团队使用,引发抵触。
- 平台建设完就不管,缺乏运营和支持。
- 忽略业务人员对数据安全和系统稳定性的担忧。
延伸追问:
- 如果业务团队说“低代码做不出我要的效果”,你怎么回应?
- 如何度量低代码平台对业务的真实价值?
相关题目:
参考资源:
口头回答版:
推低代码平台落地,关键是让业务团队看到价值。我会先找标准化高、需求急的试点场景,量化效率收益;然后降低门槛,做培训、给模板、派驻专家支持;同时保证平台稳定和数据安全,建立信任;对积极使用的团队给认可和激励;最后持续收集反馈迭代平台。不能硬推,要把业务团队当客户,用成功案例说话。
FB-52-SD-R-005:如何设计 AI 辅助搭建能力?
题型:系统设计题 难度:⚫ 架构 岗位层级:架构师 面试知识域:52 低代码 标签:低代码、AI、辅助搭建、LLM、智能化 出现频率:高频 预计回答时长:10-15 分钟
题目描述: 请设计一个低代码平台的 AI 辅助搭建能力,支持通过自然语言生成页面、智能推荐组件、自动填充数据绑定、辅助生成逻辑等。
参考答案:
AI 辅助搭建是低代码平台的重要演进方向,可以显著降低使用门槛、提升搭建效率。
一、AI 辅助搭建的核心能力
自然语言生成页面(NL2Page)
- 用户输入“创建一个用户管理页面,包含查询、表格、新增按钮”。
- AI 解析意图,生成完整页面 Schema。
智能推荐组件 / 属性
- 根据用户当前操作推荐下一步可能需要的组件。
- 根据字段名推荐对应组件类型,如
phone->Input+ 手机号校验。
自动数据绑定
- 根据接口文档或数据模型,自动把字段绑定到表单/表格列。
- 根据字段类型推荐 Setter 和校验规则。
逻辑辅助生成
- 根据自然语言描述生成动作链、联动规则、校验规则。
- 例如:“当状态为审核中时,隐藏删除按钮”。
智能纠错与优化
- 检测 Schema 中的常见问题,如未绑定数据源、字段名冲突。
- 推荐性能优化和可访问性改进。
二、系统架构
用户输入 -> 意图识别层 -> Schema 生成层 -> 校验/优化层 -> 设计器应用
|
v
RAG 知识库(物料、模板、最佳实践)
|
v
LLM(GPT / 文心一言 / 通义千问)三、关键技术点
意图识别
- 用 LLM 解析用户自然语言,提取实体和动作。
- 示例:
Schema 生成
- 基于模板 + LLM 生成 Schema。
- 模板保证结构正确,LLM 负责填充细节。
RAG 增强
- 把物料定义、模板库、最佳实践、接口文档作为知识库。
- 生成 Schema 时检索相关知识,提高准确性。
校验与回滚
- AI 生成结果必须经过 Schema 校验。
- 生成结果作为建议,用户确认后才应用到设计器。
- 支持一键撤销。
平台安全与合规
- AI 生成内容不能包含恶意代码或越权接口。
- 敏感数据不上传给外部 LLM,或做脱敏处理。
四、实现示例
自然语言生成页面:
用户:创建一个商品列表页,支持按名称搜索和分页。
AI 输出 Schema:
{
"componentName": "Page",
"children": [
{ "componentName": "SearchForm", "fields": ["name"] },
{ "componentName": "Table", "dataSource": "productList", "columns": ["name", "price", "status"] },
{ "componentName": "Pagination", "dataSource": "productList" }
]
}最佳实践:
- AI 不是替代用户,而是辅助用户,最终决策权在用户。
- 生成结果要可解释,让用户知道 AI 做了什么。
- 从高频、标准化场景切入,逐步扩展能力边界。
评分维度:
- 能说出 4 个以上 AI 辅助搭建能力(30%)
- 能设计 AI 辅助搭建的系统架构(25%)
- 能说明意图识别、RAG、Schema 生成、校验等关键技术(30%)
- 能提到安全和用户确认机制(15%)
常见错误:
- 认为 AI 可以完全替代人工搭建。
- AI 生成结果不经过校验直接应用。
- 忽略敏感数据隐私,直接上传给外部 LLM。
- AI 能力范围过大,导致生成质量不稳定。
延伸追问:
- AI 生成的页面如何保持与团队设计规范一致?
- 如果 AI 推荐错了,用户怎么快速修正?
相关题目:
参考资源:
口头回答版:
AI 辅助搭建可以做几件事:自然语言生成页面、智能推荐组件和属性、自动数据绑定、辅助生成联动和校验逻辑、智能纠错优化。架构上用户输入先过意图识别,再基于模板和 LLM 生成 Schema,然后用 RAG 检索物料和最佳实践增强结果,最后经过校验再应用到设计器。AI 是辅助不是替代,生成结果要用户确认,敏感数据要脱敏或本地处理。
FB-52-CP-R-006:企业应该自研低代码平台还是采购商业化产品?
题型:综合开放题 难度:⚫ 架构 岗位层级:架构师 面试知识域:52 低代码 标签:低代码、自研、采购、选型、综合开放 出现频率:中频 预计回答时长:10-15 分钟
题目描述: 请分析企业建设低代码平台时,自研和采购商业化产品各自的优缺点,并给出选型决策框架。
参考答案:
自研和采购没有绝对优劣,关键看企业自身情况。
一、采购商业化产品
优点:
- 上线快,省去大量研发成本。
- 产品成熟,功能完整,文档和社区支持好。
- 有专业团队持续维护和升级。
缺点:
- 源码不可控,深度定制受限。
- 与企业内部系统集成成本高。
- 授权费用和扩展费用可能较高。
- 数据安全和合规风险(特别是 SaaS 产品)。
适用场景:
- 企业没有足够研发资源。
- 需求标准化,行业产品能覆盖 80% 以上。
- 需要快速验证低代码价值。
二、自研低代码平台
优点:
- 完全可控,能深度适配企业业务和技术栈。
- 与内部系统、组件库、规范无缝集成。
- 长期看,边际成本低,可成为企业核心资产。
缺点:
- 投入大,周期长,技术门槛高。
- 需要持续投入维护,容易成为“烂尾”项目。
- 对架构师和核心团队要求高。
适用场景:
- 企业有独特业务模型,商业化产品难以满足。
- 有长期技术投入意愿和能力。
- 需要把低代码平台作为基础设施或产品对外输出。
三、混合路线
- 初期采购商业化产品做试点,验证价值。
- 同时抽调小团队自研核心引擎和物料体系。
- 业务成熟后逐步迁移到自研平台。
四、选型决策框架
| 评估维度 | 自研 | 采购 |
|---|---|---|
| 业务独特性 | 高 | 低 |
| 技术能力 | 强 | 中弱 |
| 投入预算 | 充足 | 有限 |
| 上线时间要求 | 宽松 | 紧迫 |
| 长期战略价值 | 高 | 中 |
| 数据安全要求 | 高 | 需评估 |
| 集成复杂度 | 可控 | 可能高 |
决策建议:
- 如果业务独特、技术强、预算足、长期做,选自研。
- 如果资源有限、需求标准、要快速见效,选采购。
- 很多中大厂最终走“自研核心 + 采购补充”的混合路线。
评分维度:
- 能客观对比自研和采购的优缺点(35%)
- 能给出清晰的适用场景(25%)
- 能提出决策框架和评估维度(25%)
- 能提到混合路线和风险控制(15%)
常见错误:
- 不考虑企业实际情况,一味主张自研或采购。
- 低估自研平台的长期维护成本。
- 忽略商业化产品的集成和定制限制。
- 没有明确的成功标准和退出机制。
延伸追问:
- 如果采购产品后发现无法满足核心需求,怎么止损?
- 自研平台如何防止做成只有技术团队自嗨的项目?
相关题目:
参考资源:
- Gartner Magic Quadrant for Enterprise Low-Code Application Platforms
- Forrester Wave - Low-Code Development Platforms
口头回答版:
自研还是采购要看企业情况。采购上线快、成熟度高,但定制受限、集成成本高、数据安全要评估;自研可控性强、能深度适配,但投入大、周期长、维护成本高。我的决策框架看几个维度:业务独特性、技术能力、预算、上线时间、长期战略价值、数据安全、集成复杂度。业务独特且技术强就自研;资源有限要快速见效就采购。实际很多中大厂走混合路线,先采购验证,同时小团队自研核心,再逐步迁移。
FB-52-SD-R-007:如何设计低代码平台的扩展性与插件化架构?
题型:系统设计题 难度:⚫ 架构 岗位层级:架构师 面试知识域:52 低代码 标签:低代码、扩展性、插件化、架构、生态 出现频率:中频 预计回答时长:10-15 分钟
题目描述: 请设计一个低代码平台的扩展性与插件化架构,使平台能够持续接入新组件、新功能、新集成能力,而不需要修改平台核心代码。
参考答案:
低代码平台要长期发展,必须具备良好的扩展性。插件化架构是实现扩展性的核心手段。
一、可扩展的能力点
组件扩展
- 自定义组件注册到平台,作为物料使用。
- 组件包可以独立开发、测试、发布。
Setter 扩展
- 自定义属性编辑器,如地图选择器、颜色渐变器、公式编辑器。
动作扩展
- 自定义动作,如发送企微消息、调用特殊硬件、生成 PDF。
数据源扩展
- 支持接入新的数据源类型,如 GraphQL、MQTT、WebSocket、私有协议。
设计器插件
- 扩展设计器 UI,如新增面板、快捷键、右键菜单、导出能力。
出码扩展
- 支持生成不同目标框架代码,如 React、Vue、小程序、Flutter。
二、插件化架构
┌─────────────────────────────────────┐
│ 平台核心(Core) │
│ Schema 协议 │ 渲染引擎 │ 事件总线 │ 插件管理器 │
└─────────────────────────────────────┘
│
┌───────────┼───────────┐
v v v
组件插件 Setter 插件 动作插件
数据源插件 设计器插件 出码插件三、插件注册与管理
- 插件协议
- 每个插件需要实现统一接口:
interface Plugin {
name: string;
version: string;
activate: (ctx: PluginContext) => void;
deactivate?: () => void;
}插件上下文(PluginContext)
- 暴露平台 API:注册组件、注册 Setter、注册动作、订阅事件、扩展面板。
插件加载方式
- 静态加载:构建时打包进平台。
- 动态加载:运行时通过 CDN 或微前端加载 UMD 包。
插件隔离
- 样式隔离:CSS Modules、Shadow DOM。
- JS 隔离:微前端沙箱、iframe。
- 依赖共享:通过共享 scope 避免重复加载。
四、扩展机制示例
注册自定义组件:
ctx.registerComponent({
componentName: 'MapPicker',
component: MapPicker,
meta: { title: '地图选点', icon: 'MapIcon', group: '业务组件' },
props: [
{ name: 'longitude', title: '经度', setter: 'NumberSetter' },
{ name: 'latitude', title: '纬度', setter: 'NumberSetter' }
]
});注册自定义动作:
ctx.registerAction('sendMessage', async (args, context) => {
const { userId, content } = args;
await messageService.send(userId, content);
});最佳实践:
- 平台核心要稳定,插件接口要向后兼容。
- 插件之间尽量减少直接依赖,通过事件总线通信。
- 建立插件市场和认证机制,保证插件质量。
- 插件也要有版本管理和灰度发布。
评分维度:
- 能说出 4 个以上可扩展能力点(25%)
- 能设计插件化架构和插件协议(30%)
- 能说明插件注册、加载、隔离机制(25%)
- 能提到插件市场和版本管理(20%)
常见错误:
- 平台核心和扩展能力耦合,改一个功能要动核心。
- 插件没有隔离机制,导致样式冲突或 JS 污染。
- 插件接口不稳定,升级时大量插件失效。
- 忽略插件的安全审核。
延伸追问:
- 如何保证插件的质量和安全性?
- 如果两个插件都想扩展同一个设计器面板,怎么协调?
相关题目:
参考资源:
口头回答版:
低代码平台扩展性可以从组件、Setter、动作、数据源、设计器插件、出码插件几个点做。架构上平台核心保持稳定,通过插件管理器加载各种插件。插件要实现统一接口,平台暴露 PluginContext 让插件注册能力。插件可以静态打包,也可以运行时动态加载,加载后要做好样式和 JS 隔离。核心接口要向后兼容,插件也要有版本管理和质量认证。
FB-52-SE-R-008:如何设计低代码平台的安全架构?
题型:安全题 难度:⚫ 架构 岗位层级:架构师 面试知识域:52 低代码 标签:低代码、安全架构、XSS、RCE、零信任、审计 出现频率:高频 预计回答时长:10-15 分钟
题目描述: 请设计一个企业级低代码平台的安全架构,覆盖设计态、运行态、数据、网络、权限、审计等层面,并说明如何防止常见攻击。
参考答案:
低代码平台的安全架构需要覆盖全链路,因为平台本身允许用户创建和发布应用,攻击面比普通应用更大。
一、分层安全架构
┌─────────────────────────────────────────┐
│ 应用层安全:输入校验、输出转义、组件安全 │
├─────────────────────────────────────────┤
│ 平台层安全:权限、沙箱、表达式安全、审计 │
├─────────────────────────────────────────┤
│ 服务层安全:网关鉴权、接口权限、数据脱敏 │
├─────────────────────────────────────────┤
│ 基础设施安全:网络隔离、WAF、DDoS、加密 │
└─────────────────────────────────────────┘二、各层安全措施
应用层安全
- XSS 防御:组件默认转义输出,富文本用 DOMPurify 白名单过滤。
- 表达式/脚本沙箱:禁止
eval、new Function,使用受限表达式引擎或 Web Worker 沙箱。 - 上传安全:限制文件类型和大小,服务端扫描病毒,文件访问加权限控制。
平台层安全
- 权限模型:RBAC + ABAC,支持页面、按钮、字段、数据行级权限。
- 设计器权限:谁能编辑、谁能发布、谁能查看。
- 物料审核:自定义组件和插件发布前做安全扫描。
- 沙箱隔离:自定义组件用 iframe 或 Shadow DOM 隔离。
服务层安全
- API 网关统一鉴权,所有请求必须携带有效 Token。
- 接口权限校验:后端不信任前端传参,按用户身份校验数据访问范围。
- 数据源安全:数据源配置加密存储,连接串不暴露给前端。
- SSRF 防护:限制平台代理请求的 URL 白名单。
基础设施安全
- 网络隔离:生产环境数据库不直接暴露。
- WAF:防御 SQL 注入、XSS、CSRF 等 Web 攻击。
- 传输加密:HTTPS/TLS 全链路加密。
- 数据加密:敏感数据静态加密。
三、零信任原则
- 永不信任,始终验证。
- 每个请求都要做身份、权限、上下文校验。
- 最小权限原则:用户只能访问自己需要的数据和功能。
四、安全审计
- 记录用户登录、设计、发布、数据访问、权限变更等操作。
- 日志集中存储,支持追溯和分析。
- 异常行为告警,如大量数据导出、频繁登录失败。
五、常见攻击防御
| 攻击类型 | 防御手段 |
|---|---|
| XSS | 输出转义、CSP、DOMPurify |
| CSRF | Token 校验、SameSite Cookie |
| SQL 注入 | 参数化查询、ORM |
| SSRF | URL 白名单、禁止内网请求 |
| RCE | 表达式沙箱、禁止任意脚本执行 |
| 越权访问 | 后端严格校验数据权限 |
| 文件上传漏洞 | 白名单、大小限制、服务端扫描 |
最佳实践:
- 安全左移:在设计阶段就考虑安全,物料和插件发布前扫描。
- 默认安全:所有安全策略默认开启,不可关闭。
- 定期渗透测试和漏洞扫描。
- 建立安全事件响应机制。
评分维度:
- 能设计分层安全架构(25%)
- 能从应用、平台、服务、基础设施四层说明安全措施(35%)
- 能说明零信任和审计机制(20%)
- 能列出常见攻击及防御手段(20%)
常见错误:
- 只关注运行态安全,忽略设计态和物料安全。
- 前端做权限控制就认为是安全的。
- 允许用户执行任意 JavaScript 或 SQL。
- 数据源配置明文存储在前端。
延伸追问:
- 如果业务必须用自定义脚本,怎么保证安全?
- 低代码平台多租户场景下,如何保证租户间数据隔离?
相关题目:
参考资源:
口头回答版:
低代码平台安全要分层做。应用层防 XSS、表达式沙箱、上传安全;平台层做权限模型、物料审核、沙箱隔离;服务层走 API 网关统一鉴权,后端校验数据权限,数据源配置加密,防 SSRF;基础设施层做网络隔离、WAF、HTTPS、数据加密。还要遵循零信任原则,所有请求都校验身份和权限。审计日志记录关键操作,异常行为告警。安全策略默认开启,定期做渗透测试。
FB-52-CO-A-004:什么是低代码/无代码平台?它们的主要价值是什么?
题型:概念题 难度:🟡 进阶 岗位层级:高级 面试知识域:低代码 标签:低代码、无代码、平台、价值 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请解释低代码和无代码平台的概念,以及它们为企业带来的价值。
参考答案: 低代码/无代码平台:
- 低代码平台:通过可视化建模和少量代码快速构建应用,必要时可手写代码扩展。
- 无代码平台:完全通过拖拽、配置构建应用,无需编写代码。
主要价值:
提升开发效率
- 减少重复编码,缩短交付周期。
- 让业务人员也能参与应用构建。
降低技术门槛
- 非专业开发人员可以搭建简单应用。
- 缓解 IT 资源不足。
快速试错
- 快速验证业务想法。
- 降低创新成本。
统一规范
- 内置组件、流程、权限规范。
- 减少技术债和风格不一致。
敏捷响应业务
- 业务变化时可快速调整。
适用场景:
- 内部管理系统、表单流程、数据看板、营销页面。
- 不适合:超高性能、复杂算法、强定制 UI 的应用。
挑战:
- 灵活性和可扩展性受限。
- 平台锁定风险。
- 复杂场景可能反而降低效率。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码通过可视化加少量代码快速构建应用,无代码则完全配置。价值在提升效率、降低门槛、快速试错、统一规范。适合内部系统、表单流程,不适合高性能强定制场景。
FB-52-CO-A-005:低代码平台的核心架构通常包含哪些部分?
题型:概念题 难度:🟡 进阶 岗位层级:高级 面试知识域:低代码 标签:低代码、架构、设计器、运行时、物料 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明低代码平台通常由哪些核心模块组成。
参考答案: 低代码平台核心架构:
设计器(Designer)
- 可视化拖拽界面。
- 组件树、属性面板、画布、代码/逻辑编辑器。
物料中心(Materials)
- 组件库、模板库、区块库。
- 支持自定义组件注册。
Schema 协议
- 描述页面结构、组件属性、数据绑定、事件。
- 如 JSON Schema、自定义 DSL。
运行时(Runtime)
- 解析 Schema 并渲染真实页面。
- 负责数据流、事件、生命周期。
数据模型/数据源
- 数据表设计、API 配置、数据绑定。
逻辑编排
- 流程图、事件编排、条件分支、变量管理。
权限与发布
- 角色权限、页面权限、版本管理、发布部署。
扩展机制
- 自定义组件、自定义函数、插件市场。
工程化支撑
- 构建、预览、调试、导出代码。
示例:
低代码平台 = 设计器 + 物料 + Schema + 运行时 + 数据 + 逻辑 + 权限评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码平台核心有设计器、物料中心、Schema 协议、运行时、数据模型、逻辑编排、权限发布、扩展机制、工程化支撑。
FB-52-CO-A-006:低代码平台的 Schema 协议应该包含哪些信息?
题型:概念题 难度:🟡 进阶 岗位层级:高级 面试知识域:低代码 标签:低代码、Schema、协议、页面描述 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明低代码平台中描述一个页面所需的 Schema 信息。
参考答案: Schema 协议通常包含:
页面元信息
- 页面 ID、标题、路由、布局类型。
组件树
- 嵌套的组件节点。
- 每个节点包含:组件名、唯一 ID、属性、子节点。
组件属性
- 静态值、动态绑定、表达式。
- 如
text="{{user.name}}"。
样式
- 内联样式、类名、响应式布局。
事件与行为
- 点击、提交、加载等事件。
- 绑定动作:跳转、请求、弹窗、赋值。
数据源
- API 定义、请求参数、数据映射。
生命周期
- 页面加载、组件挂载、数据变化。
状态管理
- 全局状态、页面状态、组件状态。
逻辑编排
- 条件、循环、变量、函数调用。
示例 Schema:
{
"type": "Page",
"children": [{
"componentName": "Button",
"props": {
"text": "提交",
"onClick": { "type": "action", "name": "submitForm" }
}
}]
}评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码 Schema 包含页面元信息、组件树、属性、样式、事件行为、数据源、生命周期、状态管理、逻辑编排。要足够表达页面结构和交互。
FB-52-CO-A-007:低代码平台的运行时如何渲染 Schema?
题型:概念题 难度:🟡 进阶 岗位层级:高级 面试知识域:低代码 标签:低代码、运行时、Schema、渲染 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明低代码平台运行时解析 Schema 并渲染为真实 UI 的过程。
参考答案: 运行时渲染流程:
加载 Schema
- 从服务端或本地获取页面 Schema。
解析 Schema
- 遍历组件树。
- 根据 componentName 查找对应组件实现。
数据绑定解析
- 解析 props 中的表达式和变量绑定。
- 建立数据依赖关系。
状态初始化
- 初始化全局状态、页面状态、组件状态。
递归渲染
- 递归创建组件实例并渲染子节点。
- 将解析后的 props 传入组件。
事件绑定
- 将 Schema 中定义的事件映射到真实事件处理器。
生命周期执行
- 页面加载、组件挂载时执行对应逻辑。
数据请求
- 根据数据源配置发起请求。
- 数据返回后更新状态并触发重渲染。
响应式更新
- 状态变化时,重新渲染依赖该状态的组件。
核心实现:
- 递归函数 + 组件映射表 + 表达式引擎 + 状态管理。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
运行时加载 Schema,解析组件树和数据绑定,初始化状态,递归渲染组件并绑定事件,执行生命周期,发起数据请求,状态变化时响应式更新。
FB-52-CO-A-008:低代码平台如何支持自定义组件?
题型:概念题 难度:🟡 进阶 岗位层级:高级 面试知识域:低代码 标签:低代码、自定义组件、扩展、物料 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明低代码平台支持用户扩展自定义组件的方案。
参考答案: 自定义组件支持方案:
组件注册机制
- 提供 registerComponent API。
- 注册组件名、渲染函数、默认属性、图标、描述。
组件规范
- 定义 props 接口。
- 支持数据绑定、事件抛出、样式配置。
- 提供 meta 信息供设计器识别。
运行时加载
- 通过 UMD/ESM 方式加载自定义组件代码。
- 动态注册到组件映射表。
设计器集成
- 自定义组件出现在组件面板。
- 属性面板根据 meta 自动生成配置项。
沙箱隔离
- 自定义组件运行在受控环境中。
- 限制访问危险 API,防止破坏平台。
版本管理
- 组件版本化,支持升级和回滚。
示例
jsplatform.registerComponent({ name: 'MyChart', component: MyChart, meta: { props: [ { name: 'data', type: 'array', title: '数据' } ] } });
最佳实践:
- 提供组件开发脚手架。
- 提供完整的文档和示例。
- 建立组件审核机制。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码平台通过注册机制支持自定义组件,定义 props 接口和 meta,运行时动态加载,设计器自动生成配置,沙箱隔离,版本管理。
FB-52-CO-B-006:低代码平台如何处理数据绑定和表达式?
题型:概念题 难度:🟢 基础 岗位层级:初级 面试知识域:低代码 标签:低代码、数据绑定、表达式、状态 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明低代码平台中数据绑定和表达式的实现方式。
参考答案: 数据绑定和表达式处理:
绑定语法
- 常见语法:
<span v-pre>{{variable}}</span>、<span v-pre>{{user.name}}</span>、<span v-pre>{{a + b}}</span>。 - 也可用
:或v-bind风格。
- 常见语法:
表达式解析
- 使用模板引擎或 AST 解析器。
- 将
<span v-pre>{{}}</span>中的表达式编译为可执行函数。
作用域链
- 表达式可访问:全局状态、页面状态、组件 props、循环变量。
- 需要明确作用域优先级。
响应式更新
- 建立表达式与状态的依赖关系。
- 状态变化时重新求值并更新视图。
安全限制
- 表达式沙箱执行,禁止访问 window、document 等。
- 可使用 safe-eval、new Function 在受控作用域执行。
复杂逻辑
- 简单表达式直接写在属性中。
- 复杂逻辑用逻辑编排或自定义函数。
示例
jsconst expr = "user.name.toUpperCase()"; const value = safeEval(expr, { user: state.user });
注意:
- 避免表达式过于复杂,影响可读性。
- 表达式错误要有友好提示。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码数据绑定用 语法,表达式解析后沙箱执行,建立依赖关系实现响应式更新。作用域包括全局、页面、props、循环变量。复杂逻辑用逻辑编排。
FB-52-CO-B-007:低代码平台如何设计权限系统?
题型:概念题 难度:🟢 基础 岗位层级:初级 面试知识域:低代码 标签:低代码、权限、RBAC、页面权限 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明低代码平台中页面、组件、数据权限的设计思路。
参考答案: 低代码平台权限设计:
角色管理(RBAC)
- 定义角色,如管理员、编辑、访客。
- 角色关联用户或用户组。
页面权限
- 控制用户能否访问某个页面。
- 可在路由层面拦截。
组件权限
- 控制按钮、表单字段是否显示或可用。
- 通过条件渲染或 disabled 实现。
数据权限
- 控制用户能看到哪些数据。
- 在数据源或 API 层过滤。
操作权限
- 增删改查权限细分。
- 如只能查看不能编辑。
权限表达式
- 支持基于角色、部门、数据属主的复杂规则。
- 如
<span v-pre>{{user.role === 'admin'}}</span>。
设计时与运行时权限
- 设计时:谁能编辑应用。
- 运行时:谁能使用应用。
权限校验位置
- 前端做体验层控制(隐藏/禁用)。
- 服务端做最终校验(防绕过)。
动态权限
- 运行时从服务端获取权限配置。
- 支持热更新。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码权限用 RBAC,分页面、组件、数据、操作权限,支持表达式规则。前端做体验控制,服务端做最终校验,支持动态权限。
FB-52-CO-B-008:低代码平台如何导出代码或集成到现有项目?
题型:概念题 难度:🟢 基础 岗位层级:初级 面试知识域:低代码 标签:低代码、代码导出、集成、出码 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明低代码平台将可视化设计结果转换为可维护代码的方案。
参考答案: 低代码出码方案:
Schema 转代码
- 将可视化 Schema 转换为 React/Vue/Angular 代码。
- 每个组件映射为对应框架组件。
代码生成策略
- 生成完整项目:包含 package.json、入口文件、页面文件。
- 生成片段:只生成某个页面或组件代码。
保持可读性
- 生成代码应结构清晰、命名规范。
- 避免生成难以维护的巨型文件。
保留扩展点
- 生成代码后允许开发者手写扩展。
- 提供清晰的扩展位置和约定。
双向同步(可选)
- 低代码设计修改后同步更新代码。
- 代码修改后也能回写 Schema(难度大)。
集成方式
- 作为独立应用部署。
- 作为 npm 包集成到现有项目。
- 通过 iframe 嵌入。
构建产物
- 出码后可用标准前端构建工具(Webpack/Vite)打包。
示例
- Schema 中的 Button 组件 → 生成
<Button onClick={...}>{text}</Button>。
- Schema 中的 Button 组件 → 生成
注意:
- 出码质量直接影响开发者接受度。
- 频繁出码可能导致代码冲突。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码出码把 Schema 转 React/Vue 代码,生成完整项目或片段,保持可读性,保留扩展点,可独立部署或 npm 集成。出码质量很关键。
FB-52-CP-P-009:低代码平台如何支持逻辑编排?
题型:综合开放题 难度:🔴 深入 岗位层级:专家 面试知识域:低代码 标签:低代码、逻辑编排、流程图、事件 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明低代码平台中用可视化方式编排业务逻辑的方案。
参考答案: 逻辑编排方案:
节点类型
- 开始/结束节点。
- 动作节点:API 请求、赋值、弹窗、跳转。
- 条件节点:if/else 分支。
- 循环节点:foreach/while。
- 自定义代码节点。
流程图编辑器
- 拖拽节点,连接线条。
- 类似 BPMN 或流程图工具。
执行引擎
- 运行时解析流程图。
- 按拓扑顺序执行节点。
- 支持异步和同步执行。
上下文管理
- 维护变量上下文。
- 节点间传递数据。
错误处理
- 捕获节点执行异常。
- 支持重试、回滚、告警。
调试能力
- 单步执行、断点、日志输出。
示例节点
- 点击按钮 → 校验表单 → 调用 API → 判断结果 → 成功跳转/失败提示。
与代码结合
- 简单逻辑用编排。
- 复杂逻辑可写自定义函数。
挑战:
- 复杂逻辑的可视化表达可能不如代码清晰。
- 执行性能和调试体验需持续优化。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
逻辑编排用节点类型加流程图编辑器,执行引擎解析执行,管理上下文,处理错误,支持调试。简单逻辑用编排,复杂逻辑写自定义函数。
FB-52-CP-P-010:低代码平台如何保证生成应用的性能?
题型:综合开放题 难度:🔴 深入 岗位层级:专家 面试知识域:低代码 标签:低代码、性能、优化、运行时 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明低代码平台在设计和运行时如何保障应用性能。
参考答案: 低代码平台性能保障:
组件渲染优化
- 组件按需加载,避免一次性加载全部物料。
- 使用虚拟列表、懒加载。
Schema 优化
- 避免过深的组件嵌套。
- 减少不必要的表达式计算。
数据流优化
- 精确的状态更新,避免整树重渲染。
- 使用响应式框架或状态管理库。
运行时优化
- 表达式缓存结果。
- 事件防抖节流。
- 异步任务合理调度。
构建优化
- 代码分割、Tree Shaking。
- 压缩和 CDN 加速。
资源优化
- 图片、字体按需加载。
- 组件资源懒加载。
监控
- 运行时性能监控。
- 慢页面告警。
最佳实践引导
- 平台提示用户避免低效设计。
- 如避免循环中请求 API。
出码优化
- 生成的代码同样要遵循性能最佳实践。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码性能保障要组件按需加载、优化 Schema、精确状态更新、表达式缓存、事件防抖、构建分割、资源懒加载、性能监控、引导最佳实践。
FB-52-CP-P-011:低代码平台如何版本管理和回滚?
题型:综合开放题 难度:🔴 深入 岗位层级:专家 面试知识域:低代码 标签:低代码、版本管理、回滚、发布 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明低代码平台中应用版本管理和回滚的方案。
参考答案: 版本管理方案:
Schema 版本化
- 每次保存生成新版本记录。
- 记录修改人、时间、变更说明。
历史版本查看
- 可查看任意历史版本的页面效果。
- 支持版本对比(diff)。
回滚机制
- 一键回滚到指定版本。
- 回滚后立即生效或发布生效。
发布版本
- 区分编辑态和发布态。
- 发布时生成稳定的版本号。
灰度发布
- 新版本先小范围用户验证。
- 稳定后全量发布。
备份策略
- 定期自动备份。
- 重要变更手动标记。
多人协作
- 支持分支、合并、冲突解决。
- 或采用锁机制避免冲突。
元数据存储
- 版本数据存数据库或对象存储。
- 保留完整的 Schema 快照。
示例:
{
"version": "1.2.3",
"schema": { ... },
"createdBy": "user1",
"createdAt": "2024-01-01"
}评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码版本管理要 Schema 版本化、历史查看、diff、一键回滚、发布版本、灰度发布、自动备份、多人协作分支合并、元数据存储。
FB-52-CP-P-012:低代码平台如何与现有业务系统集成?
题型:综合开放题 难度:🔴 深入 岗位层级:专家 面试知识域:低代码 标签:低代码、集成、API、业务系统 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明低代码平台与企业现有系统集成的常见方式。
参考答案: 低代码平台集成方式:
API 集成
- 配置 REST/GraphQL API 数据源。
- 支持请求头、参数、认证。
数据库直连
- 配置数据库连接,可视化建表和查询。
- 注意安全和权限控制。
SSO 集成
- 与企业账号体系对接。
- OAuth、SAML、LDAP 等。
消息集成
- 对接消息队列、Webhook。
- 实现事件驱动。
文件存储集成
- 对接 OSS、S3、NAS 等存储。
自定义代码扩展
- 允许写 JS/Python 等脚本。
- 调用内部 SDK 或私有接口。
嵌入式集成
- 将低代码页面嵌入现有系统 iframe。
- 或通过微前端方式集成。
数据同步
- 定时同步或实时同步外部数据。
安全边界
- 内部系统接口需经过网关。
- 控制数据访问范围。
最佳实践:
- 提供标准化连接器。
- 支持认证和加密传输。
- 日志审计。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码集成方式有 API、数据库、SSO、消息、文件存储、自定义代码、嵌入式、数据同步。要提供标准连接器,注意安全边界和审计。
FB-52-SC-R-001:低代码平台与 ProCode 开发的边界在哪里?
题型:场景设计题 难度:🔵 架构 岗位层级:架构师 面试知识域:低代码 标签:低代码、ProCode、边界、选择 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明低代码开发和传统专业代码开发的适用边界。
参考答案: 低代码 vs ProCode 边界:
适合低代码:
- 表单驱动的管理系统。
- 审批流程、工作流应用。
- 数据看板、报表页面。
- 营销落地页、H5。
- 快速原型和 MVP。
- 重复性高、标准化强的场景。
适合 ProCode:
- 高性能、高并发应用。
- 复杂算法和计算。
- 强定制 UI/UX。
- 大规模前端架构。
- 需要深度优化和创新的产品。
- 长期演进的核心业务系统。
混合模式:
- 外围系统用低代码快速搭建。
- 核心系统用 ProCode 精细打磨。
- 低代码生成代码后由专业开发扩展。
判断标准:
- 变化频率:经常变用低代码。
- 复杂度:复杂用 ProCode。
- 生命周期:长期核心用 ProCode。
- 团队能力:专业团队可 ProCode,业务人员参与用低代码。
趋势:
- 两者边界会逐渐模糊,互相融合。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码适合表单、流程、看板、营销页、原型;ProCode 适合高性能、复杂算法、强定制、核心系统。实际常混合使用,根据变化频率、复杂度、生命周期和团队能力选择。
FB-52-SC-R-002:设计一个可扩展的低代码组件库体系。
题型:场景设计题 难度:🔵 架构 岗位层级:架构师 面试知识域:低代码 标签:低代码、组件库、可扩展、设计体系 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请设计一个低代码平台可用的组件库体系,支持业务方扩展。
参考答案: 可扩展低代码组件库体系:
基础组件
- Button、Input、Select、Table、Form、Layout 等。
- 保证通用性和稳定性。
业务组件
- 针对行业场景的组件,如商品卡片、用户头像、审批状态。
- 可由业务方贡献。
布局组件
- Row、Col、Container、Tabs、Modal 等。
- 支持响应式和嵌套。
复合组件
- 由多个基础组件组合而成,如搜索表单、列表页。
组件规范
- 统一的 props 命名、事件命名、样式规范。
- 提供 meta.json 描述配置项。
扩展机制
- 提供 CLI 工具初始化组件。
- 支持本地开发和热更新。
- 组件市场上传和下载。
版本管理
- 组件独立版本号。
- 应用可锁定组件版本。
质量保障
- 组件审核、测试、文档。
- 视觉回归测试。
主题和皮肤
- 支持设计 token 配置。
- 一键换肤。
示例与文档
- 每个组件有示例和 API 文档。
- 设计器实时预览。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码组件库分基础、业务、布局、复合组件,统一规范,提供 meta 和 CLI 扩展,独立版本,质量审核,支持主题换肤,配套文档和示例。
FB-52-SC-R-003:低代码平台的常见陷阱有哪些?如何避免?
题型:场景设计题 难度:🔵 架构 岗位层级:架构师 面试知识域:低代码 标签:低代码、陷阱、风险、避免 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明低代码平台在实际应用中常见的陷阱及规避方法。
参考答案: 常见陷阱及规避:
过度承诺
- 陷阱:认为低代码能解决一切。
- 规避:明确适用场景和边界。
平台锁定
- 陷阱:Schema 和组件与平台强绑定,迁移困难。
- 规避:使用开放标准,支持代码导出。
性能问题
- 陷阱:复杂页面渲染慢。
- 规避:运行时优化,引导用户合理设计。
安全漏洞
- 陷阱:表达式注入、权限绕过。
- 规避:沙箱执行、服务端校验、最小权限。
可维护性差
- 陷阱:可视化逻辑混乱,难以维护。
- 规避:良好的版本管理、注释、模块化。
扩展困难
- 陷阱:遇到平台不支持的需求卡死。
- 规避:保留自定义代码入口和插件机制。
团队协作问题
- 陷阱:多人编辑冲突。
- 规避:锁机制、分支合并、版本对比。
测试不足
- 陷阱:低代码应用缺乏测试。
- 规避:提供预览、自动化测试、发布审批。
学习成本被低估
- 陷阱:以为完全不需要技术。
- 规避:培训、文档、渐进式推广。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码常见陷阱有过度承诺、平台锁定、性能、安全、可维护性、扩展、协作、测试、学习成本。要明边界、开放标准、优化运行时、沙箱安全、版本管理、自定义扩展、测试审批。
FB-52-SD-A-001:低代码平台的组件库如何设计才能兼顾灵活性和一致性?
题型:系统设计题 难度:🟡 进阶 岗位层级:高级 面试知识域:低代码 标签:低代码、组件库、设计、一致性 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明低代码平台组件库的设计原则。
参考答案: 低代码组件库设计原则:
原子化设计
- 基础组件(按钮、输入框)+ 业务组件(表单、列表)。
- 原子组件保证一致性,业务组件提升效率。
属性标准化
- 统一样式、行为、事件属性命名。
- 提供 schema 描述,便于可视化配置。
可扩展机制
- 支持自定义组件注册。
- 提供插槽(slot)和渲染钩子。
主题与品牌
- 设计 token 驱动样式。
- 支持主题切换和品牌定制。
版本管理
- 组件库版本与平台版本解耦。
- 支持多版本并存和灰度升级。
文档与示例
- 每个组件有配置说明、示例、最佳实践。
- 配置项有默认值和校验规则。
性能
- 按需加载,避免全量引入。
- 组件渲染性能要有基准测试。
平衡灵活性一致性:
- 核心交互和视觉规范严格统一。
- 边缘场景通过自定义组件和配置扩展。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码组件库要原子化设计、属性标准化、可扩展、主题定制、版本管理、文档示例、性能优化。核心统一,边缘场景扩展。
FB-52-CP-A-001:低代码平台的 undo/redo 如何实现?
题型:综合开放题 难度:🟡 进阶 岗位层级:高级 面试知识域:低代码 标签:低代码、undo、redo、状态管理 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明低代码编辑器中撤销重做机制的实现。
参考答案: Undo/Redo 实现:
命令模式(Command Pattern)
- 每个用户操作封装为命令对象。
- 命令包含 execute 和 undo 方法。
状态快照
- 保存应用状态的历史快照。
- 撤销时恢复到上一个快照。
操作日志
- 记录操作类型、目标、旧值、新值。
- 逆操作实现撤销。
栈结构
- undo 栈和 redo 栈。
- 新操作时清空 redo 栈。
合并与分组
- 连续输入合并为一个操作。
- 复杂操作(如拖拽)分组处理。
边界处理
- 限制历史记录长度,防止内存无限增长。
- 保存前确认,避免误撤销。
示例:
class MoveCommand {
constructor(node, oldPos, newPos) {
this.node = node; this.oldPos = oldPos; this.newPos = newPos;
}
execute() { this.node.position = this.newPos; }
undo() { this.node.position = this.oldPos; }
}注意:
- 异步操作撤销更复杂。
- 协作编辑场景需与 OT/CRDT 结合。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码 undo/redo 可用命令模式或状态快照。用栈管理历史,新操作清空 redo 栈。连续输入合并,复杂操作分组。注意内存限制和异步操作。
FB-52-SC-P-006:如何保证低代码生成的代码质量和可维护性?
题型:场景设计题 难度:🔴 深入 岗位层级:专家 面试知识域:低代码 标签:低代码、代码质量、可维护性 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明低代码平台生成高质量、可维护代码的措施。
参考答案: 保证生成代码质量:
代码生成规范
- 遵循团队编码规范。
- 生成结构清晰、命名有意义的代码。
模块化和复用
- 将公共逻辑抽取为函数/组件。
- 避免大段重复代码。
类型安全
- 生成 TypeScript 类型定义。
- 对数据源和组件 props 做类型约束。
可读性
- 添加必要注释。
- 避免过度嵌套和魔法数字。
可导出可回写
- 支持导出为独立项目。
- 允许开发者在导出代码上二次开发。
版本和 Diff
- 生成代码版本化。
- 支持查看可视化配置与生成代码的 diff。
测试覆盖
- 为生成代码生成基础测试用例。
- 关键业务逻辑强制测试。
性能优化
- 生成代码时自动做 Tree Shaking、懒加载。
- 避免不必要的重新渲染。
可维护性:
- 生成代码要让人能看懂、能修改。
- 不要变成“黑盒”。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
保证生成代码质量要遵循规范、模块化、类型安全、可读性、可导出回写、版本化 diff、测试覆盖、性能优化。最终要让人能看懂能修改。
FB-52-SD-A-002:低代码平台如何做版本管理和回滚?
题型:系统设计题 难度:🟡 进阶 岗位层级:高级 面试知识域:低代码 标签:低代码、版本管理、回滚 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请设计低代码平台的应用版本管理和回滚方案。
参考答案: 版本管理和回滚方案:
元数据版本化
- 每次发布保存应用配置的完整快照。
- 使用版本号(语义化版本或自增 ID)。
发布流程
- 开发版 → 预览版 → 正式版。
- 每次发布记录发布人和变更说明。
灰度发布
- 支持按用户、地区、流量比例灰度。
- 实时监控新版本指标。
一键回滚
- 发布异常时快速切换到上一版本。
- 回滚时恢复运行时配置和静态资源。
版本对比
- 可视化对比两个版本的页面、逻辑、数据源。
- 支持合并和冲突解决。
数据迁移
- 版本升级涉及数据结构变化时,提供迁移脚本。
- 保证历史数据兼容。
分支管理
- 支持多分支并行开发。
- 主干合并前做冲突检测。
审计日志
- 记录所有发布、回滚、编辑操作。
- 便于问题追溯。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码版本管理要元数据快照、开发预览正式发布流程、灰度、一键回滚、版本对比、数据迁移、分支管理、审计日志。
FB-52-SC-P-007:低代码平台如何支持多端渲染?
题型:场景设计题 难度:🔴 深入 岗位层级:专家 面试知识域:低代码 标签:低代码、多端、渲染、响应式 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明低代码平台如何支持 PC、移动端、小程序等多端渲染。
参考答案: 多端渲染方案:
抽象渲染层
- 页面描述(JSON/DSL)与具体渲染器解耦。
- 不同端实现各自的渲染器。
响应式布局
- 提供断点配置和栅格系统。
- 组件支持隐藏/显示/换行等响应式行为。
组件映射
- 同一组件配置映射到不同端的原生实现。
- 例如:PC 用 antd,移动端用 antd-mobile,小程序用自定义组件。
条件编译/平台差异处理
- 某些逻辑只在特定端执行。
- 提供平台判断 API。
预览和调试
- 设计器支持多设备预览。
- 真机扫码预览。
性能优化
- 按端裁剪组件和依赖。
- 移动端优先减少包体积。
统一数据源
- 多端共享数据模型和接口。
- 前端状态管理跨端一致。
设计约束
- 设计器提示不兼容的配置。
- 避免用户在 PC 端设计无法在移动端渲染的组件。
注意:
- 完全“一次设计,多端运行”很难,需要合理抽象和约束。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码多端渲染要抽象渲染层、响应式布局、组件映射、平台差异处理、多设备预览、按端裁剪、统一数据源、设计约束。完全一次设计多端运行很难。
FB-52-CP-P-013:低代码平台中的表达式引擎如何设计?
题型:综合开放题 难度:🔴 深入 岗位层级:专家 面试知识域:低代码 标签:低代码、表达式引擎、安全、DSL 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请设计低代码平台中的表达式引擎,并考虑安全性。
参考答案: 表达式引擎设计:
语法设计
- 使用简化 DSL,类似 JS 子集。
- 支持变量、常量、运算符、常用函数。
- 示例:
<span v-pre>{{ user.name.toUpperCase() }}</span>、<span v-pre>{{ a + b > 10 }}</span>。
执行环境
- 在沙箱中运行,禁止访问全局对象。
- 使用 Proxy 或 iframe 隔离。
变量上下文
- 明确表达式可访问的变量范围。
- 组件状态、全局状态、数据源、页面参数。
内置函数库
- 提供安全的基础函数:字符串、日期、数学、数组。
- 禁止 eval、new Function、访问 DOM。
错误处理
- 表达式执行失败时给出明确错误信息。
- 不影响整个页面渲染。
性能
- 缓存编译后的 AST。
- 依赖追踪,只有依赖变化时重新计算。
安全
- 白名单机制,只允许访问指定对象和函数。
- 防止 XSS 和 SSRF。
- 表达式长度和复杂度限制。
调试
- 提供表达式测试工具。
- 运行时显示表达式计算结果。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
表达式引擎用简化 DSL,沙箱执行,限定变量上下文,内置安全函数库,错误隔离,AST 缓存和依赖追踪,白名单防 XSS/SSRF,提供调试工具。
FB-52-SC-A-006:低代码平台如何与现有代码仓库集成?
题型:场景设计题 难度:🟡 进阶 岗位层级:高级 面试知识域:低代码 标签:低代码、集成、代码仓库、Git 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明低代码平台与企业现有代码仓库的集成方案。
参考答案: 与代码仓库集成:
代码导出
- 将低代码应用导出为可运行的前端项目。
- 支持 React/Vue/纯 HTML 等框架。
Git 同步
- 低代码平台作为 Git 工作流的一环。
- 每次发布自动提交到指定仓库和分支。
CI/CD 集成
- 导出的代码进入企业现有流水线。
- 自动构建、测试、部署。
自定义代码扩展
- 允许在指定目录编写自定义代码。
- 低代码生成代码与手写代码分离,避免覆盖。
源码映射
- 保留低代码配置与生成代码的映射关系。
- 便于问题定位和回写。
版本对齐
- 低代码平台版本与 Git 版本对应。
- 支持从 Git 历史恢复低代码配置。
权限和审计
- 与企业的 SSO、权限系统集成。
- 记录谁在平台做了什么修改。
混合开发
- 复杂页面由专业开发者手写。
- 简单页面由业务人员用低代码搭建。
- 两者通过路由或微前端组合。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码与代码仓库集成可导出代码、Git 同步、CI/CD、自定义扩展、源码映射、版本对齐、权限审计、混合开发。让低代码成为企业现有流程的一部分。
FB-52-SD-P-003:低代码平台的数据权限模型如何设计?
题型:系统设计题 难度:🔴 深入 岗位层级:专家 面试知识域:低代码 标签:低代码、数据权限、RBAC、安全 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请设计低代码平台的数据权限控制模型。
参考答案: 数据权限模型设计:
身份认证
- 集成企业 SSO、OAuth、LDAP。
- 用户登录后获取角色和组织信息。
RBAC/ABAC
- RBAC:按角色配置菜单、页面、操作权限。
- ABAC:按属性动态判断,如“只能看自己部门的数据”。
数据行级权限
- 配置数据过滤规则。
- 示例:销售员只能看自己的客户,经理看团队客户。
字段级权限
- 控制用户能否查看或编辑某些字段。
- 敏感字段脱敏显示。
页面级权限
- 无权限用户看不到页面入口。
- 组件级权限控制按钮/链接显示。
后端校验
- 前端权限只影响展示,后端必须再次校验。
- 防止绕过前端直接调用接口。
权限继承
- 应用级、页面级、组件级权限可继承和覆盖。
- 便于批量配置。
审计日志
- 记录数据访问和操作。
- 异常行为告警。
注意:
- 权限模型要可配置,满足不同企业需求。
- 遵循最小权限原则。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码数据权限用 RBAC/ABAC,做行级、字段级、页面级、组件级控制,后端必须再次校验,记录审计日志。权限要可配置,遵循最小权限。
FB-52-SC-A-007:低代码平台如何应对复杂业务逻辑?
题型:场景设计题 难度:🟡 进阶 岗位层级:高级 面试知识域:低代码 标签:低代码、业务逻辑、复杂度 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明低代码平台处理复杂业务逻辑的方法。
参考答案: 应对复杂业务逻辑:
可视化逻辑编排
- 流程图/节点图方式编排业务逻辑。
- 支持条件分支、循环、异常处理。
自定义代码
- 允许在节点中编写 JS/TS 代码。
- 复杂算法由专业开发者手写。
函数和服务
- 将公共逻辑封装为可复用函数或服务。
- 低代码配置中调用。
事件驱动
- 页面事件、组件事件、数据变化事件触发逻辑。
- 支持事件总线。
状态管理
- 全局状态、页面状态、组件状态分层。
- 复杂流程使用状态机。
后端集成
- 复杂计算下沉到后端 BFF 或服务。
- 前端低代码只做展示和轻量交互。
模块拆分
- 将复杂应用拆分为多个页面/模块。
- 每个模块职责单一。
测试和调试
- 提供逻辑单步调试。
- 支持单元测试和集成测试。
注意:
- 不是所有逻辑都适合低代码,要识别边界。
- 复杂逻辑应以代码为主,低代码为辅。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码应对复杂逻辑用可视化编排、自定义代码、函数服务、事件驱动、状态管理、后端下沉、模块拆分、测试调试。复杂逻辑以代码为主。
FB-52-PE-A-007:低代码平台的性能瓶颈通常在哪里?如何优化?
题型:性能优化题 难度:🟡 进阶 岗位层级:高级 面试知识域:低代码 标签:低代码、性能、瓶颈、优化 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请分析低代码平台的常见性能瓶颈及优化方法。
参考答案: 常见性能瓶颈:
设计器性能
- 页面组件过多时渲染卡顿。
- 优化:虚拟滚动、组件懒加载、Canvas 渲染大纲。
JSON Schema 解析
- 复杂页面配置解析耗时。
- 优化:缓存解析结果、按需解析、JSON 扁平化。
表达式计算
- 大量表达式重复计算。
- 优化:依赖追踪、缓存计算结果、惰性求值。
运行时渲染
- 组件嵌套深、状态更新频繁。
- 优化:组件 memo、虚拟 DOM 优化、减少不必要重渲染。
数据源请求
- 接口过多或数据量大。
- 优化:接口合并、分页、缓存、GraphQL。
生成代码体积
- 引入大量通用组件和运行时。
- 优化:按需加载、Tree Shaking、分包。
内存泄漏
- 组件销毁时未清理事件和订阅。
- 优化:生命周期管理、取消订阅。
预览和发布
- 构建时间长。
- 优化:增量构建、缓存、并行处理。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
低代码性能瓶颈在设计器渲染、schema 解析、表达式计算、运行时渲染、数据请求、代码体积、内存泄漏、构建时间。优化方向包括虚拟滚动、缓存、依赖追踪、memo、按需加载等。