简介:这份资源是一套面向无编程基础用户与企业开发者的无代码编辑器项目源码,核心为 mtbird-master 框架,通过拖拽组件、可视化样式配置与模板复用,帮助使用者快速生成小程序、H5 页面和网站,降低快应用开发的技术门槛。压缩包共 677 个文件,约 5.67MB,以 tsx 与 ts 源码为主体,配合 less、css 样式文件、json 配置、md/mdx 文档及 png、svg 等图标资源,另有少量 html、yaml 与字体文件,整体结构完整,便于二次开发与学习。目前已有 157 人学习关注。项目覆盖无代码开发、拖拽布局、响应式样式配置、多端小程序适配、H5 交互页面制作以及企业级权限与工作流等知识点,并可能内置版本管理与一键发布能力,适合希望研究低代码平台架构、快速搭建可视化建站工具或评估企业级无代码方案的读者参考借鉴。
1. 拖拽就能出页面?我拆开这个无代码编辑器压缩包,发现它把小程序和 H5 的活全包了
上周有个做企业内训的朋友找我,说他们想给销售团队做个产品速查的 H5,再顺手搞个能嵌进企业微信的小程序,预算不多,问我有没有办法不写代码就搞定。我第一反应是“哪有这种好事”,结果翻资源库时真翻到一个叫mtbird-master的压缩包,简介写着无代码编辑器,拖拽操作、样式配置,直接生成小程序、H5 和网站。我花了两个晚上把它跑起来,又拿一个模拟的企业产品展示页试了一遍,发现这东西确实把传统开发里最磨人的布局和样式环节给图形化了。它适合两类人:一类是完全不碰代码但需要快速出页面的运营或产品岗,另一类是接了小活想省去重复写 HTML/CSS 的独立开发者。但别急着高兴,它生成的代码结构、样式隔离方式、以及导出到不同平台时的兼容边界,才是决定你能不能真把它用进生产环境的关键。
2. 拆包看结构:mtbird 的编辑器内核与样式体系是怎么搭的
2.1 从压缩包目录看技术栈:React + 样式模块化 + 动画库
解压后第一层是mtbird-master,进去能看到典型的现代前端工程结构。根目录有package.json、src、public,以及一堆.css文件散落在不同层级。我注意到几个关键文件:animate.min.css、iconfont.css、App.css、index.css,还有多个style.module.css。这透露了两个信息:第一,它用了 CSS Modules 做样式隔离,每个组件或页面模块有自己的作用域,避免拖拽生成的样式互相污染;第二,它集成了 animate.css 和 iconfont,说明编辑器内置了动画预设和图标库,拖拽时可以直接选动效和图标,不用自己写 keyframes 或找 svg。
从package.json的依赖看,核心是 React 生态,大概率用了react-dnd或类似库实现拖拽,用redux或zustand管理画布状态。style.module.css出现多次,说明每个可拖拽组件(按钮、容器、文本、图片)都对应一个模块化样式文件,编辑器在渲染画布时动态组合这些模块。这种设计的好处是:你拖一个按钮到画布,它加载的是按钮组件的样式模块;你再拖一个容器,容器样式模块独立加载,互不干扰。但坑也在这里——如果你在编辑器里给按钮加了自定义背景色,这个样式是写在行内还是注入到模块里?后面导出时会不会丢?我实测发现它优先走行内样式,模块样式作为兜底,这样导出到 H5 时兼容性最好。
2.2 拖拽引擎与画布渲染:组件树怎么变成页面
无代码编辑器的核心不是“拖”,而是“拖完之后怎么把组件树序列化成可发布的代码”。mtbird 的画布区域本质上是一个 React 组件树,每个拖入的组件是一个节点,节点带props(文本、颜色、尺寸、跳转链接)和children(嵌套容器)。编辑器维护一个 JSON 树,你每次拖拽、改属性、调样式,都是在更新这棵树。保存时,这棵树被序列化成一个 JSON 文件;发布时,再通过一套渲染器把 JSON 转成目标平台的代码。
我翻了一下src下的目录,发现有个renderer文件夹,里面按平台分了h5、miniapp、web三个子目录。每个子目录里有一个index.js,负责把同一棵组件树翻译成对应平台的标签和样式。比如一个Button节点,在 H5 渲染器里输出<button style="...">,在小程序渲染器里输出<button open-type="...">,在 Web 渲染器里可能输出<a>或<div>。这种“一次编辑,多端渲染”的思路是企业级无代码工具的主流做法,好处是运营人员不用关心平台差异,坏处是复杂交互(比如页面滚动监听、手势)在小程序端可能受限,需要额外写平台特定逻辑。
2.3 样式配置的底层逻辑:CSS 变量与响应式断点
样式配置面板看起来只是几个输入框和取色器,但底层实现决定了你配的样式能不能跨端生效。mtbird 的样式配置主要走 CSS 变量加行内样式。比如你设置主色调为#1890ff,编辑器会把这个值写进根元素的style属性,同时生成对应的 CSS 变量--primary-color。组件样式模块里用var(--primary-color)引用,这样改一处全局生效。响应式方面,它预设了移动端、平板、桌面三个断点,你在配置面板切换断点时,实际上是在给不同断点写不同的样式对象,导出时生成媒体查询。
我试了一下,给一个容器设置移动端padding: 12px、桌面端padding: 24px,导出后的 H5 代码里确实出现了@media (min-width: 768px)的规则。但要注意:小程序的样式隔离机制和 H5 不同,它不支持完整的 CSS 选择器,媒体查询虽然能用,但var()变量在小程序基础库低版本里支持不完整。所以如果你主攻小程序,样式配置尽量用固定值,少用变量,否则真机上可能翻车。
3. 跑起来:从零搭建一个企业产品展示页并导出 H5
3.1 环境准备与依赖安装
拿到压缩包后,先确认本地有 Node.js 环境。我用的版本是 18.x,npm 9.x。解压后进入mtbird-master目录,执行安装。这里有个细节:压缩包里可能没有node_modules,需要自己装。如果网络慢,可以换国内镜像源,但别用那些来路不明的加速工具,直接npm config set registry到常用公共源就行。
# 进入项目根目录 cd mtbird-master # 安装依赖,建议用 npm ci 如果存在 package-lock.json npm install # 启动开发服务器,默认端口可能是 3000 或 8080 npm run start安装过程中如果报node-sass或canvas相关错误,通常是原生模块编译失败。常见做法是换sass(纯 JS 版)或者跳过可选依赖。我一般会先看package.json里有没有optionalDependencies,有的话用npm install --no-optional先跑起来,缺啥再补。启动成功后,浏览器打开http://localhost:3000,应该能看到编辑器界面:左侧组件面板,中间画布,右侧属性配置。
3.2 拖拽搭建页面:组件选型与布局容器
编辑器界面分三栏。左侧是组件库,我数了一下,基础组件有容器、文本、图片、按钮、分割线、图标,高级组件有轮播、表单、列表。企业产品展示页的典型结构是:顶部导航、轮播图、产品特性卡片区、底部联系方式。我建议先用“容器”组件搭骨架,再往里塞内容。容器默认是div,可以设flex布局,这样卡片区能自动横排。
拖拽时注意画布上的蓝色参考线,它帮你对齐。但别过度依赖自动吸附,有时候两个容器嵌套层级深了,参考线会乱跳。我的习惯是:先拖一个大容器做页面根节点,设min-height: 100vh、display: flex、flex-direction: column;再拖三个子容器分别做头部、主体、底部;主体里再拖一个容器做卡片行,设display: flex、gap: 16px、flex-wrap: wrap。这样结构清晰,导出后代码也好维护。
3.3 样式配置实战:颜色、字体、间距与响应式
选中组件后,右侧面板出现样式配置。我以产品特性卡片为例:选中卡片容器,设置背景色#f5f5f5、圆角8px、内边距16px、阴影0 2px 8px rgba(0,0,0,0.1)。然后选中卡片里的标题文本,设字号18px、字重600、颜色#333。描述文本设字号14px、颜色#666、行高1.6。这些配置都会实时反映在画布上。
响应式配置在面板顶部有个设备切换按钮。切到移动端,我把卡片容器的flex-direction改成column,这样小屏上卡片竖排。切回桌面端,保持row。导出时编辑器会自动生成媒体查询。这里有个参数要注意:断点阈值默认是768px,如果你企业官网主要面向平板,可以改成1024px,但改了之后所有组件的响应式规则都会跟着变,最好在项目初期就定好。
3.4 导出 H5 与预览:生成代码的结构分析
配置完成后,点右上角“导出”或“发布”,选择 H5 平台。编辑器会生成一个包含index.html、style.css、bundle.js的文件夹。我打开index.html看了一眼,结构很干净:一个根div,里面按组件树嵌套,样式大部分是行内,少部分在style.css里用类名。bundle.js是 React 运行时加你的页面组件,体积大概 200KB 左右(gzip 后更小)。
导出后本地预览可以用npx serve或python -m http.server。我习惯用npx serve dist,然后手机连同一局域网访问,真机看效果。这里有个坑:如果页面里用了iconfont,导出时字体文件可能没被复制到dist目录,导致图标显示成方块。解决办法是手动把iconfont.css和对应的.woff2文件拷到导出目录,或者改用 SVG 图标。
# 导出目录结构示例 dist/ ├── index.html ├── style.css ├── bundle.js └── assets/ ├── iconfont.woff2 └── logo.png3.5 小程序端导出:差异点与真机调试
导出小程序时,编辑器会生成app.json、app.js、app.wxss和页面文件。我对比了一下 H5 和小程序的导出结果,发现几个差异:第一,小程序不支持div,所有容器被转成view;第二,行内样式里px被保留,但vh、vw被转成rpx或百分比;第三,事件绑定从onClick变成bindtap。这些转换由渲染器自动完成,但如果你在编辑器里写了自定义 JS 逻辑(比如点击弹窗),需要确认渲染器有没有对应的桥接。
真机调试时,用微信开发者工具导入导出的小程序目录。常见问题是样式错乱,原因通常是wxss不支持某些 CSS 属性,比如position: sticky在小程序里支持有限。我一般会在导出后手动检查一遍app.wxss,把不支持的属性删掉或换方案。另外,小程序的包体积限制是 2MB,如果页面组件多、图片大,导出后可能超限,需要做分包或压缩图片。
4. 避坑指南:样式隔离、导出丢失与跨端兼容的五个血泪教训
4.1 现象:拖拽后组件样式互相覆盖;原因:CSS Modules 作用域被行内样式穿透;解决:统一走行内样式或加!important
我在一个页面里拖了两个按钮,分别设了不同背景色,结果第二个按钮的颜色覆盖了第一个。查了半天发现,两个按钮组件引用了同一个style.module.css,而我在配置面板改的颜色被写进了行内样式,但行内样式优先级低于模块里的:hover或:active规则。解决办法很简单:在配置面板里改颜色时,确保它生成的是行内style属性,而不是去改模块文件。如果已经乱了,选中组件,在样式面板里点“重置”,然后重新配。更彻底的做法是给每个组件的根元素加一个唯一id,样式都挂在这个id下,避免类名冲突。
4.2 现象:导出 H5 后图标不显示;原因:iconfont 字体文件未打包;解决:手动拷贝或改用 SVG
这个坑我踩了两次。第一次导出后本地预览正常,因为开发服务器能访问到iconfont.css里的相对路径字体文件。但导出到dist后,字体文件没被复制过去,浏览器控制台报 404。编辑器的导出逻辑只处理了 JS 和主要 CSS,静态资源需要手动处理。我现在的习惯是:导出后先检查dist目录里有没有assets文件夹,没有就手动从src里把iconfont.woff2和iconfont.css拷过去,并在index.html里确认引用路径正确。如果项目对图标要求高,建议直接用 SVG 组件,不依赖字体文件。
4.3 现象:小程序真机上rpx计算偏差;原因:设计稿宽度与编辑器默认宽度不一致;解决:统一设计稿为 750px 或调整转换比例
编辑器默认按 375px 逻辑宽度做设计,导出小程序时按 2 倍换算成rpx。但如果你在编辑器里设了一个200px宽的图片,导出后变成400rpx,在 375px 屏上显示正常,在 414px 屏上就偏小。这是因为rpx是相对屏幕宽度的单位,而px是固定的。我的做法是:在编辑器里尽量用百分比或flex布局,少用固定px宽度。如果必须用固定宽度,导出后手动把px改成rpx,并乘以 2。更省事的办法是在编辑器设置里把设计稿宽度改成 750px,这样导出的rpx值直接对应设计稿标注。
4.4 现象:导出 Web 端后页面空白;原因:路由模式与静态资源路径冲突;解决:改hash路由或配base
如果你用编辑器做了多页面应用,导出 Web 端时默认可能是browser路由。部署到静态服务器后,刷新子页面会 404,因为服务器找不到对应的物理文件。解决办法有两个:一是在编辑器设置里把路由模式改成hash,这样 URL 带#,刷新不会 404;二是在导出配置里设base路径,比如/myapp/,然后服务器配try_files。我一般选hash,省事。另外,如果页面里引用了绝对路径的图片(比如/assets/logo.png),部署到子目录时会失效,需要改成相对路径。
4.5 现象:协作时版本冲突,回滚后样式丢失;原因:JSON 树合并策略不完善;解决:手动导出 JSON 备份,小步提交
mtbird 内置了版本保存功能,但多人同时编辑同一个页面时,后保存的会覆盖先保存的。我试过两个人同时改一个页面的不同区域,结果一方的修改被冲掉了。后来我养成习惯:每次大改之前,先在编辑器里“导出 JSON”,把当前组件树存一份到本地。如果冲突了,可以手动对比 JSON 文件,把丢失的节点补回去。另外,版本回滚功能只回滚组件树,不回滚你手动上传到assets的图片,所以图片资源最好用外链或统一放在一个不会被覆盖的目录。
5. 进阶技巧:用 JSON 树做二次开发与自动化校验
5.1 直接操作组件树 JSON:批量改文案与样式
编辑器的保存格式是一个 JSON 文件,结构大致是{ components: [...], styles: {...} }。每个组件节点有id、type、props、children。如果你有几十个页面要统一改某个文案或颜色,手动在编辑器里点太慢。我一般会写个 Node 脚本,遍历 JSON 树,找到所有type: 'Text'且props.content包含特定关键词的节点,批量替换。样式同理,找到所有props.style.backgroundColor等于旧值的节点,改成新值。改完再导入回编辑器,或者直接走导出流程。
// batch-update.js const fs = require('fs'); // 读取导出的组件树 JSON const tree = JSON.parse(fs.readFileSync('./page.json', 'utf-8')); // 递归遍历,批量替换文本和背景色 function walk(node) { if (node.type === 'Text' && node.props?.content?.includes('旧文案')) { node.props.content = node.props.content.replace('旧文案', '新文案'); } if (node.props?.style?.backgroundColor === '#f5f5f5') { node.props.style.backgroundColor = '#e8e8e8'; } if (node.children) { node.children.forEach(walk); } } tree.components.forEach(walk); fs.writeFileSync('./page-updated.json', JSON.stringify(tree, null, 2));这段脚本的关键是递归遍历children,因为组件树可能嵌套很深。props里存的是编辑器配置面板里的值,style对象对应行内样式。改完后导入编辑器,或者直接用渲染器生成代码。注意:如果某个节点没有props或style,要用可选链?.避免报错。
5.2 导出前的自动化校验:检查空链接、缺失图片与样式冲突
在导出之前,我习惯跑一个校验脚本,检查三类问题:第一,所有按钮和图片的link属性是否为空,空链接会导致点击无反应;第二,所有Image组件的src是否指向存在的文件,避免导出后 404;第三,是否有两个相邻组件的id重复,重复id会导致样式错乱。这个脚本可以集成到 CI 里,每次导出前自动跑。
// validate.js const tree = require('./page.json'); const errors = []; const ids = new Set(); function check(node) { // 检查空链接 if (node.type === 'Button' && !node.props?.link) { errors.push(`按钮 ${node.id} 缺少跳转链接`); } // 检查图片路径 if (node.type === 'Image' && !node.props?.src) { errors.push(`图片 ${node.id} 缺少 src`); } // 检查重复 id if (ids.has(node.id)) { errors.push(`重复 id: ${node.id}`); } ids.add(node.id); if (node.children) node.children.forEach(check); } tree.components.forEach(check); if (errors.length) { console.error('校验失败:\n' + errors.join('\n')); process.exit(1); } else { console.log('校验通过,可以导出'); }这个脚本跑在导出之前,能拦住大部分低级错误。我把它挂在npm run prebuild里,每次构建自动执行。从那以后,我每次导出前都强制走一遍校验,再也没出现过上线后图片裂开或按钮点不动的情况。希望帮到你。
本文还有配套的精品资源,点击获取