本文介绍了如何在魔笔平台开发并使用自定义组件库。您可通过安装脚手架,实现灵活定制的组件库开发及调试体验。
概述
魔笔平台内置了两套系统组件库(详见系统组件库),为了进一步扩展魔笔平台的定制化能力,现提供了脚手架,支持您在本地 IDE 开发符合魔笔平台规范的自定义组件库,开发完成后可上传至魔笔平台使用。
开发自定义组件库
环境要求
在使用脚手架开发自定义组件库之前,请确保您的开发环境满足以下要求:
Node.js >= 20.0.0
npm >= 9.0.0
检查版本:
node -v # 应该显示 v20.0.0 或更高
npm -v # 应该显示 9.0.0 或更高
如果版本不符合要求,请先升级 Node.js 和 npm。
安装脚手架
全局安装脚手架工具:
npm install -g mobi-ccl-cli
安装完成后,您可以在任何目录使用 mccl 命令。
验证安装:
mccl -v
# 或
mccl --version
快速开始
1. 初始化项目
在您想要创建项目的目录下,运行:
mccl init
脚手架会依次询问以下信息:
组件库名称:请输入组件库名称
示例:
my-custom-components说明:这是组件库名称,默认会用于组件在物料面板中的分类目录。
组件库描述:请输入组件库描述
示例:
这是一个基于 antd 的自定义组件库说明:描述您的组件库用途。
组件库全局变量名:请输入组件库全局变量名
示例:
MyCustomComponents说明:请使用大驼峰命名法(PascalCase),首字母大写,后续字母可以是大小写字母、数字。这个名称将作为唯一标识,设置后请勿修改。
初始化完成后,会创建一个新的项目目录,目录名就是您输入的全局变量名。
生成的项目结构:
YourGlobalName/
├── mobi.config.js # 配置文件
├── package.json # 项目依赖配置
├── tsconfig.json # TypeScript 配置
├── tsconfig.node.json # Node.js 环境中的 TypeScript 配置文件
├── .gitignore # Git 忽略文件
├── .nvmrc # Node.js 版本指定
├── README.md # 项目说明文档
└── src/ # 组件源码目录
└── HelloMobi/ # 示例组件
├── index.tsx # 组件实现
└── config.ts # 组件配置
注意事项:
全局变量名设置后请勿修改,因为它是组件的唯一标识
初始化会在当前目录下创建新文件夹,不会覆盖现有文件
2. 进入项目目录并安装依赖
cd YourGlobalName # 替换为您的全局变量名
npm install # 或 pnpm install
3. 启动调试模式
mccl dev
# 或
npm run dev
使用场景:
开发组件时实时预览效果
调试组件配置
与 Mobi 平台集成测试
停止服务:
按 Ctrl+C 退出调试模式。
注意事项:
调试模式需配合魔笔平台使用,详见下文。
4. 构建生产版本
mccl build
# 或
npm run build
构建产物:
构建完成后,会在项目根目录生成 dist.zip 文件,将该构建产物上传至魔笔控制台进行使用,详见下文。
其他命令详解
1. mccl -v / --version - 查看版本
功能:查看当前安装的脚手架版本。
使用方式:
mccl -v
# 或
mccl --version
2. mccl -h / --help - 查看帮助
功能:查看脚手架帮助说明。
使用方式:
mccl -h
# 或
mccl --help
配置文件详解
mobi.config.js - 核心配置文件
mobi.config.js 是脚手架的核心配置文件,位于项目根目录。它定义了组件库的基本信息、组件扫描规则和构建配置。
配置文件结构
// Mobi 自定义组件库配置文件
export default {
// === 组件库基本信息 ===
library: {
name: "七点组件",
description: "这是一个自定义组件库",
},
// === 组件配置 ===
components: {
// 组件目录
dir: "src",
// 是否自动扫描组件目录
autoScan: true,
// 手动指定组件(当 autoScan 为 false 时使用)
include: [],
// 排除的组件
exclude: [],
},
// === 构建配置 ===
build: {
// UMD 全局变量名(大驼峰命名法)
globalName: "MyCompoLib",
// 输出目录
outDir: "dist",
// 外部依赖(不打包)
external: ["react", "react-dom", "antd", "dayjs", "@ant-design/icons"],
// 全局变量映射
globals: {
react: "React",
"react-dom": "ReactDOM",
antd: "antd",
dayjs: "dayjs",
"@ant-design/icons": "AntdIcons",
},
},
};
library - 组件库基本信息
作用:定义组件库的基本元信息。
配置项:
配置项 | 类型 | 必填 | 说明 | 示例 |
|
| ✅ | 组件库名称,会显示在组件列表中 |
|
|
| ✅ | 组件库描述 |
|
components - 组件扫描配置
作用:配置组件扫描规则,告诉脚手架如何找到和识别组件。
配置项:
配置项 | 类型 | 必填 | 说明 | 示例 |
|
| ✅ | 组件源码目录,相对于项目根目录 |
|
|
| ✅ | 是否自动扫描组件目录 |
|
|
| ❌ | 手动指定组件列表(当 |
|
|
| ❌ | 排除的组件目录(仅在 |
|
autoScan: true(自动扫描模式)
推荐使用:适合大多数场景,脚手架会自动扫描 dir 目录下的所有一级子目录作为组件。
扫描规则:
✅ 扫描
dir目录下的所有一级子目录❌ 忽略
exclude列表中指定的目录
示例:
components: {
dir: 'src',
autoScan: true,
exclude: ['_internal', 'utils', 'types'],
}
目录结构示例:
src/
├── Button/ ✅ 会被识别为 Button 组件
├── Input/ ✅ 会被识别为 Input 组件
├── Card/ ✅ 会被识别为 Card 组件
└── utils/ ❌ 被排除(在 exclude 列表中)
autoScan: false(手动指定模式)
使用场景:当您需要精确控制哪些组件被包含时使用。
配置方式:
components: {
dir: 'src',
autoScan: false,
include: ['Button', 'Input', 'Card'],
}
注意事项:
当
autoScan为false时,只有include列表中指定的组件会被扫描exclude配置在手动模式下无效如果
include中指定的目录不存在,构建时会跳过该组件
build - 构建配置
作用:配置构建相关的参数,包括输出目录、外部依赖、全局变量映射等。
配置项:
配置项 | 类型 | 必填 | 说明 | 示例 |
|
| ✅ | 构建输出目录 |
|
|
| ✅ | 外部依赖列表(不打包进 UMD) |
|
|
| ✅ | 全局变量映射,将外部依赖映射到全局变量 |
|
outDir - 输出目录
作用:指定构建产物的输出目录。
示例:
outDir: 'dist' // 构建产物会输出到 dist.zip 目录
external - 外部依赖
作用:指定哪些依赖不打包进 UMD 文件,而是作为外部依赖。
为什么需要配置:
减小 UMD 文件体积
避免重复打包(魔笔平台已集成了 React、ReactDOM、antd 等依赖)
提高加载性能
常见的外部依赖:
external: [
'react', // React 库
'react-dom', // ReactDOM 库
'antd', // Ant Design 组件库
'dayjs', // 日期处理库
'@ant-design/icons', // Ant Design 图标库
]
注意事项:
所有在
external中声明的依赖,都必须在globals中配置对应的全局变量映射如果某个依赖没有在
external中声明,它会被打包进 UMD 文件建议将
'react''react-dom''antd''dayjs''@ant-design/icons'写入external,以减小文件体积并提高构建效率
globals - 全局变量映射
作用:将外部依赖映射到浏览器全局变量。
配置规则:
key:npm 包名(与external中的名称对应)value:浏览器中的全局变量名
示例:
globals: {
'react': 'React', // npm 包 react 对应全局变量 React
'react-dom': 'ReactDOM', // npm 包 react-dom 对应全局变量 ReactDOM
'antd': 'antd', // npm 包 antd 对应全局变量 antd
'dayjs': 'dayjs', // npm 包 dayjs 对应全局变量 dayjs
}
如何确定全局变量名:
React / ReactDOM:通常是
React和ReactDOM第三方库:查看库的文档,或检查浏览器控制台中的全局变量
自定义库:根据库的 UMD 构建配置确定
注意事项:
globals中的每个 key 都应该在external中存在全局变量名必须与实际运行时环境中的全局变量名一致,否则会导致运行时错误
组件开发指南
组件目录结构
每个组件应该创建独立的文件夹,位于 src 目录下:
src/
└── ComponentName/ # 组件目录
├── index.tsx # 组件实现
└── config.ts # 组件配置
文件说明:
index.tsx:组件的 React 实现代码
config.ts:组件的低代码平台配置
组件实现(index.tsx)
基本结构:
import React from 'react';
import { Button as AntdButton } from 'antd';
export interface ButtonProps {
text?: string;
type?: 'primary' | 'default';
onClick?: () => void;
}
const Button: React.FC<ButtonProps> = ({
text = '点击',
type = 'primary',
onClick,
}) => {
return (
<AntdButton type={type} onClick={onClick}>
{text}
</AntdButton>
);
};
export default Button;
导出要求:
✅ 必须使用
export default导出组件✅ 组件名建议与目录名一致
❌ 不支持匿名导出
组件配置(config.ts)
作用:定义组件在低代码平台中的配置,包括属性面板、布局配置、元信息等。
基本结构:
const ButtonConfig = {
// ========== 基本信息 ==========
title: '自定义按钮',
description: '这是一个按钮组件',
icon: 'https://xxx.jpg',
category: '基础组件',
// ========== 容器相关 ==========
isContainer: false,
// ========== 属性面板配置 ==========
inspectorConfig: [
{
title: '内容',
items: [
{
type: 'control',
title: '按钮文字',
name: 'text',
defaultValue: '按钮',
valueType: 'string',
control: {
type: 'Code',
props: {},
},
},
],
},
],
// ========== 网格布局配置 ==========
gridConfig: {
dragRect: {
w: 4,
h: 32,
},
initHeight: () => ({ type: 'auto' }),
supportHeightType: ['fixed', 'auto'],
},
// ========== 暴露配置 ==========
exposeConfig: {
methods: [ ],
},
};
export default ButtonConfig;
详细的配置项说明请参考组件配置项开发规范。
使用自定义组件库
组件库管理
新建组件库
使用 mccl build命令,会在项目根目录下生成dist.zip(如果在 mobi.config.js文件中配置了outDir: 'dist'),将该dist.zip上传至魔笔平台进行管理。


更新组件库
点击待更新组件库右侧操作列的“更新”按钮,输入更新版本和更新说明信息,上传新版组件库后,可更新该组件库版本。
点击操作列“查看”按钮,可在发布历史中看到该组件库各个版本的发布信息。
注意事项:
更新组件库时,需保证该组件库的
globalName保持不变。
组件库使用
在魔笔平台上传的组件库,可在魔笔应用中加载并使用。
进入“设置 -> 组件库 -> 自定义组件库”,点击添加按钮。

在添加弹窗中选择希望在应用中使用的自定义组件库,添加进应用中。

选择使用的组件库版本。

添加成功后,拖拽入画布使用。

开启调试模式
调试模式支持在开发组件库时进行实时预览,本地代码改动后,画布中的调试组件会自动更新。但调试模式是临时状态,本地组件开发完成后,可关闭调试模式,将组件构建为正式组件库,上传至魔笔控制台进行管理和长期使用。
需先在本地使用mccl dev开启调试模式

再在魔笔应用“设置 -> 组件库”中开启调试模式,当页面下方出现正在调试中的组件库名称时,说明该组件库已处于调试中状态。此时拖入该调试中的组件库,画布中的组件带有“调试中”标识,修改本地组件代码后,画布中组件会自动更新。

常见问题
Q1: 如何添加新的组件?
答:在 src 目录下创建新的组件文件夹,包含 index.tsx 和 config.ts(可选)文件即可。如果 autoScan 为 true,脚手架会自动识别新组件。
示例:
mkdir src/MyNewComponent
touch src/MyNewComponent/index.tsx
touch src/MyNewComponent/config.ts
然后编写组件代码和配置即可。
Q2: 如何排除某个组件不被扫描?
答:使用 exclude 配置:
components: {
autoScan: true,
exclude: ['MyComponent'], // 排除 MyComponent
}
Q3: 如何排除外部依赖?
答:分两步:
配置 mobi.config.js:
build: {
external: ['react', 'react-dom', 'your-package'], // 添加到 external
globals: {
'react': 'React',
'react-dom': 'ReactDOM',
'your-package': 'YourPackageGlobal', // 添加全局变量映射
},
}
魔笔应用中引入该外部依赖:
例如构建时排除了 lodash,则在魔笔平台中引入lodash的 CDN 资源。

Q4: 组件不显示怎么办?
答:按以下步骤排查:
检查目录结构:确保组件目录下有
index.tsx文件检查导出方式:确保使用
export default导出组件检查配置:确保
mobi.config.js中的components.dir配置正确检查排除列表:确保组件不在
exclude列表中查看构建日志:运行
mccl build查看是否有错误信息
Q5: 支持哪些 React 版本?
答:推荐使用 React 18.x。
Q6: 构建失败怎么办?
答:按以下步骤排查:
检查 Node.js 版本:确保 >= 20.0.0
检查配置文件:确保
mobi.config.js格式正确检查组件代码:确保所有组件代码没有语法错误
查看错误信息:构建失败时会显示详细的错误信息,根据错误信息修复问题