cdp-material-sdk 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +67 -0
- package/dist/DataScope-B7ffH5qN.js +106 -0
- package/dist/components/core/types.d.ts +16 -0
- package/dist/components/data-scope/DataScope.d.ts +45 -0
- package/dist/constants/event.d.ts +22 -0
- package/dist/context/DataContainerRuntimeContext.d.ts +16 -0
- package/dist/context/DataScopeContext.d.ts +51 -0
- package/dist/context/PageContext.d.ts +26 -0
- package/dist/hooks/useConcurrentLoading.d.ts +16 -0
- package/dist/hooks/useDataContainer.d.ts +61 -0
- package/dist/hooks/useDualLoading.d.ts +22 -0
- package/dist/host-react.d.ts +15 -0
- package/dist/host-react.js +11 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +42 -0
- package/dist/plugin.d.ts +45 -0
- package/dist/portable.d.ts +20 -0
- package/dist/portable.js +33 -0
- package/dist/protocol/adapter.d.ts +50 -0
- package/dist/protocol/common-schemas.d.ts +64 -0
- package/dist/protocol/events.d.ts +48 -0
- package/dist/protocol/manifest-types.d.ts +10 -0
- package/dist/protocol/manifest.d.ts +144 -0
- package/dist/protocol/traits.d.ts +7 -0
- package/dist/types/category.d.ts +15 -0
- package/dist/utils/mergeInitialValue.d.ts +10 -0
- package/dist/validateManifest-CYqjvQe_.js +355 -0
- package/dist/validation/validateManifest.d.ts +59 -0
- package/docs/component-development/FAQ.md +203 -0
- package/docs/component-development/README.md +176 -0
- package/docs/component-development/getting-started/01-/345/210/233/345/273/272/346/210/226/346/216/245/345/205/245/347/273/204/344/273/266/345/272/223/345/267/245/347/250/213.md +172 -0
- package/docs/component-development/getting-started/02-/345/210/233/345/273/272/347/273/204/344/273/266/345/214/205/345/271/266/346/263/250/345/206/214.md +185 -0
- package/docs/component-development/getting-started/03-/345/274/200/345/217/221/346/234/200/345/260/217/345/217/257/350/277/220/350/241/214/347/273/204/344/273/266.md +196 -0
- package/docs/component-development/getting-started/04-/346/236/204/345/273/272/345/217/221/345/270/203/344/270/216/345/256/277/344/270/273/346/216/245/345/205/245.md +147 -0
- package/docs/component-development/getting-started/05-/350/207/252/346/243/200/344/270/216/346/216/222/351/224/231.md +186 -0
- package/docs/component-development/recipes//344/275/277/347/224/250Adapter/351/200/202/351/205/215/347/273/204/344/273/266API.md +131 -0
- package/docs/component-development/recipes//345/243/260/346/230/216/344/272/213/344/273/266.md +229 -0
- package/docs/component-development/recipes//345/243/260/346/230/216/345/212/250/344/275/234/344/270/216/347/212/266/346/200/201.md +188 -0
- package/docs/component-development/recipes//345/243/260/346/230/216/345/270/203/345/261/200/345/256/271/345/231/250/347/273/204/344/273/266.md +221 -0
- package/docs/component-development/recipes//345/243/260/346/230/216/346/217/222/346/247/275.md +141 -0
- package/docs/component-development/recipes//345/243/260/346/230/216/346/225/260/346/215/256/345/255/227/346/256/265/347/273/204/344/273/266.md +147 -0
- package/docs/component-development/recipes//345/243/260/346/230/216/346/225/260/346/215/256/345/256/271/345/231/250/347/273/204/344/273/266.md +258 -0
- package/docs/component-development/recipes//346/216/245/345/205/245/347/254/254/344/270/211/346/226/271React/347/273/204/344/273/266/345/272/223.md +209 -0
- package/docs/component-development/recipes//351/205/215/347/275/256DOM/346/240/271/350/212/202/347/202/271/346/263/250/345/205/245.md +222 -0
- package/docs/component-development/recipes//351/205/215/347/275/256Loading/347/255/226/347/225/245.md +198 -0
- package/docs/component-development/recipes//351/205/215/347/275/256/350/256/276/350/256/241/345/231/250/345/205/203/344/277/241/346/201/257.md +153 -0
- package/docs/component-development/reference/ActionsState/346/250/241/345/236/213.md +124 -0
- package/docs/component-development/reference/DOM/346/240/271/350/212/202/347/202/271/346/263/250/345/205/245/346/250/241/345/236/213.md +125 -0
- package/docs/component-development/reference/Events/346/250/241/345/236/213.md +170 -0
- package/docs/component-development/reference/Loading/347/255/226/347/225/245/346/250/241/345/236/213.md +140 -0
- package/docs/component-development/reference/Manifest/345/255/227/346/256/265/345/217/202/350/200/203.md +251 -0
- package/docs/component-development/reference/SDK/345/257/274/345/205/245/350/276/271/347/225/214.md +119 -0
- package/docs/component-development/reference/Slots/346/250/241/345/236/213.md +110 -0
- package/docs/component-development/reference/Traits/350/203/275/345/212/233/346/250/241/345/236/213.md +165 -0
- package/docs/component-development/reference/validateManifest/346/240/241/351/252/214/350/247/204/345/210/231.md +171 -0
- package/docs/component-development/reference//345/274/225/346/223/216/345/237/272/347/241/200/350/203/275/345/212/233/346/250/241/345/236/213.md +70 -0
- package/docs/component-development/reference//347/244/272/344/276/213/344/273/243/347/240/201/347/264/242/345/274/225.md +163 -0
- package/package.json +67 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# CDP 组件开发入口
|
|
2
|
+
|
|
3
|
+
本文档面向 **CDP 组件作者**,包括内部组件开发者、第三方组件包作者,以及基于已有 UI 组件库做二次封装的团队。
|
|
4
|
+
|
|
5
|
+
如果你要开发、接入、扩展或排查一个组件包,请从这里开始。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 先确认你的场景
|
|
10
|
+
|
|
11
|
+
### 我是第一次接入 CDP,要从零创建组件库工程
|
|
12
|
+
|
|
13
|
+
按顺序阅读:
|
|
14
|
+
|
|
15
|
+
1. [创建或接入组件库工程](./getting-started/01-创建或接入组件库工程.md)
|
|
16
|
+
2. [创建组件包并注册](./getting-started/02-创建组件包并注册.md)
|
|
17
|
+
3. [开发最小可运行组件](./getting-started/03-开发最小可运行组件.md)
|
|
18
|
+
4. [构建发布与宿主接入](./getting-started/04-构建发布与宿主接入.md)
|
|
19
|
+
5. [自检与排错](./getting-started/05-自检与排错.md)
|
|
20
|
+
|
|
21
|
+
### 我已经有一个组件包,要往里面加新组件
|
|
22
|
+
|
|
23
|
+
适合团队协作场景:组件包工程已经存在,当前任务只是新增一个组件。
|
|
24
|
+
|
|
25
|
+
建议阅读:
|
|
26
|
+
|
|
27
|
+
1. [开发最小可运行组件](./getting-started/03-开发最小可运行组件.md)
|
|
28
|
+
2. [创建组件包并注册](./getting-started/02-创建组件包并注册.md) 的「往已有组件包新增组件」小节
|
|
29
|
+
3. 按需选择 `recipes/` 下的能力文档
|
|
30
|
+
4. [自检与排错](./getting-started/05-自检与排错.md)
|
|
31
|
+
|
|
32
|
+
### 我要把第三方 React 组件库接入 CDP
|
|
33
|
+
|
|
34
|
+
适合包装 Ant Design、Arco、Material UI、ECharts、自研 UI Kit 等场景。
|
|
35
|
+
|
|
36
|
+
建议阅读:
|
|
37
|
+
|
|
38
|
+
1. [接入第三方 React 组件库](./recipes/接入第三方React组件库.md)
|
|
39
|
+
2. [使用 Adapter 适配组件 API](./recipes/使用Adapter适配组件API.md)
|
|
40
|
+
3. [配置 DOM 根节点注入](./recipes/配置DOM根节点注入.md)
|
|
41
|
+
4. [配置 Loading 策略](./recipes/配置Loading策略.md)
|
|
42
|
+
5. [自检与排错](./getting-started/05-自检与排错.md)
|
|
43
|
+
|
|
44
|
+
### 我要让组件参与表单或数据流
|
|
45
|
+
|
|
46
|
+
阅读:
|
|
47
|
+
|
|
48
|
+
- [声明数据字段组件](./recipes/声明数据字段组件.md)
|
|
49
|
+
- [声明数据容器组件](./recipes/声明数据容器组件.md)
|
|
50
|
+
- [Traits 能力模型](./reference/Traits能力模型.md)
|
|
51
|
+
|
|
52
|
+
### 我要让组件承载子组件(布局容器)
|
|
53
|
+
|
|
54
|
+
阅读:
|
|
55
|
+
|
|
56
|
+
- [声明布局容器组件](./recipes/声明布局容器组件.md)
|
|
57
|
+
- [声明插槽](./recipes/声明插槽.md)
|
|
58
|
+
- [Traits 能力模型](./reference/Traits能力模型.md)
|
|
59
|
+
|
|
60
|
+
### 我要调整组件在设计器中的展示
|
|
61
|
+
|
|
62
|
+
阅读:
|
|
63
|
+
|
|
64
|
+
- [配置设计器元信息](./recipes/配置设计器元信息.md)
|
|
65
|
+
- [Manifest 字段参考](./reference/Manifest字段参考.md)
|
|
66
|
+
|
|
67
|
+
### 我要让组件对外触发事件
|
|
68
|
+
|
|
69
|
+
事件是可选能力。只有组件需要通知宿主或编排系统时才需要声明。
|
|
70
|
+
|
|
71
|
+
阅读:
|
|
72
|
+
|
|
73
|
+
- [声明事件](./recipes/声明事件.md)
|
|
74
|
+
- [Events 模型](./reference/Events模型.md)
|
|
75
|
+
|
|
76
|
+
### 我要让流程或 AI 调用组件方法
|
|
77
|
+
|
|
78
|
+
阅读:
|
|
79
|
+
|
|
80
|
+
- [声明动作与状态](./recipes/声明动作与状态.md)
|
|
81
|
+
- [Actions / State 模型](./reference/ActionsState模型.md)
|
|
82
|
+
|
|
83
|
+
### 我要给组件提供可拖入区域或模板区域
|
|
84
|
+
|
|
85
|
+
阅读:
|
|
86
|
+
|
|
87
|
+
- [声明插槽](./recipes/声明插槽.md)
|
|
88
|
+
- [Slots 模型](./reference/Slots模型.md)
|
|
89
|
+
|
|
90
|
+
### 我要处理根节点注入、Loading 或渲染策略
|
|
91
|
+
|
|
92
|
+
阅读:
|
|
93
|
+
|
|
94
|
+
- [配置 DOM 根节点注入](./recipes/配置DOM根节点注入.md)
|
|
95
|
+
- [配置 Loading 策略](./recipes/配置Loading策略.md)
|
|
96
|
+
- [DOM 根节点注入模型](./reference/DOM根节点注入模型.md)
|
|
97
|
+
- [Loading 策略模型](./reference/Loading策略模型.md)
|
|
98
|
+
|
|
99
|
+
### 我遇到了 warning、error 或接入后不生效
|
|
100
|
+
|
|
101
|
+
阅读:
|
|
102
|
+
|
|
103
|
+
- [自检与排错](./getting-started/05-自检与排错.md)
|
|
104
|
+
- [validateManifest 校验规则](./reference/validateManifest校验规则.md)
|
|
105
|
+
- [FAQ](./FAQ.md)
|
|
106
|
+
|
|
107
|
+
### 我要找可复制的模板或示例代码
|
|
108
|
+
|
|
109
|
+
阅读:
|
|
110
|
+
|
|
111
|
+
- [示例代码索引](./reference/示例代码索引.md)
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 2. 文档分层
|
|
116
|
+
|
|
117
|
+
| 层级 | 作用 | 读者 |
|
|
118
|
+
|------|------|------|
|
|
119
|
+
| `getting-started/` | 完成一个可交付组件包的最小闭环 | 新接入作者、团队负责人 |
|
|
120
|
+
| `recipes/` | 按需启用某项组件能力 | 正在实现具体组件能力的作者 |
|
|
121
|
+
| `reference/` | 查字段、查模型、查校验规则 | 所有作者、AI Skill |
|
|
122
|
+
| `FAQ.md` | 高频问题与排错入口 | 所有作者 |
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## 3. 最小必需路径和可选能力
|
|
127
|
+
|
|
128
|
+
组件接入 CDP 的最小必需路径只有 5 件事:
|
|
129
|
+
|
|
130
|
+
1. 使用 React 或 React wrapper 暴露组件。
|
|
131
|
+
2. 为组件编写 `ComponentManifest`。
|
|
132
|
+
3. 将组件和 manifest 放入 `EngineComponentPackage.components`。
|
|
133
|
+
4. 在 `EngineComponentPlugin.install()` 中调用 `api.registerPackage(pkg)`。
|
|
134
|
+
5. 使用 `validateManifest()` 自检,确保没有 error。
|
|
135
|
+
|
|
136
|
+
以下能力都不是强制的:
|
|
137
|
+
|
|
138
|
+
| 能力 | 什么时候需要 | 不需要时 |
|
|
139
|
+
|------|--------------|----------|
|
|
140
|
+
| `events` | 组件需要通知宿主,例如点击、值变化、行选择 | 不声明 |
|
|
141
|
+
| `actions` | 外部流程需要命令式调用组件 | 不声明 |
|
|
142
|
+
| `state` | 外部表达式需要读取组件内部运行时状态 | 不声明 |
|
|
143
|
+
| `DATA_FIELD` | 组件参与数据值管理 | 不声明该 trait |
|
|
144
|
+
| `DATA_CONTAINER` | 组件要管理子字段的数据作用域 | 不声明该 trait |
|
|
145
|
+
| `LAYOUT_CONTAINER` | 组件作为布局容器承载子组件 | 不声明该 trait |
|
|
146
|
+
| `slots` | 组件需要可拖入或模板化区域 | 不声明 |
|
|
147
|
+
| `nesting` | 需要限制子组件类型、最少/最多数量、或者只能作为某些父组件的子节点 | 不声明 |
|
|
148
|
+
| `meta.icon` / `subGroup` / `hiddenInComponentList` | 需要调整设计器中的展示 | 不声明 |
|
|
149
|
+
| `usage` | 给 AI 与设计器提供使用提示 | 不声明 |
|
|
150
|
+
| `adapter` | 组件 API 与 CDP 默认约定不一致 | 不声明 |
|
|
151
|
+
| `engine.render.loading` | 组件需要被流程控制 Loading | 不声明或使用 `none` |
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 4. 面向未来 Skill 的约定
|
|
156
|
+
|
|
157
|
+
本文档按「任务路径 + 可选能力 Recipe + 模型参考 + 自检排错 + FAQ」组织。每个 Recipe 都尽量包含:
|
|
158
|
+
|
|
159
|
+
- **适用场景:** 什么时候需要。
|
|
160
|
+
- **可以跳过的情况:** 避免把可选能力误认为必做流程。
|
|
161
|
+
- **输入:** 作者已有的组件、manifest 或组件包。
|
|
162
|
+
- **输出:** 完成后应该得到什么。
|
|
163
|
+
- **步骤:** 可人工执行,也可由 AI Skill 执行。
|
|
164
|
+
- **自检:** 使用 `validateManifest()` 或运行时诊断确认结果。
|
|
165
|
+
|
|
166
|
+
`reference/` 只维护稳定事实源:字段语义、模型边界、约束摘要和校验入口,不维护完整任务流程。
|
|
167
|
+
|
|
168
|
+
`reference/validateManifest校验规则.md` 是校验级别事实源:哪些规则是 error、哪些规则是 warning,应优先在这里维护。
|
|
169
|
+
|
|
170
|
+
`recipes/`、`reference/`、`getting-started/` 和 `FAQ.md` 文档顶部使用 frontmatter 声明:
|
|
171
|
+
|
|
172
|
+
- `type`:文档层级,例如 `recipe`、`reference`、`getting-started` 或 `faq`。
|
|
173
|
+
- `capability`:能力标识,例如 `events`、`actions-state`、`rootpath`。
|
|
174
|
+
- `related`:相关文档路径,供作者和 AI Skill 建立任务、模型和校验之间的导航关系。
|
|
175
|
+
|
|
176
|
+
每篇能力文档末尾应保留「关联文档」或「任务路径」区块。AI Skill 应先读取目标任务的 Recipe,再读取对应 Reference 和 validateManifest 校验规则。
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: getting-started
|
|
3
|
+
capability: project-setup
|
|
4
|
+
related:
|
|
5
|
+
- getting-started/02-创建组件包并注册.md
|
|
6
|
+
- getting-started/03-开发最小可运行组件.md
|
|
7
|
+
- reference/SDK导入边界.md
|
|
8
|
+
---
|
|
9
|
+
# 01 - 创建或接入组件库工程
|
|
10
|
+
|
|
11
|
+
本文说明如何准备一个可交付给 CDP 宿主加载的组件库工程。
|
|
12
|
+
|
|
13
|
+
这一步是**建议流程**,不是强制流程。CDP 真正关心的是最终产物:一个可被动态导入的 ESM 插件,以及其中注册的 `EngineComponentPackage`。
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 适用场景
|
|
18
|
+
|
|
19
|
+
- 你要从零创建一个第三方组件包工程。
|
|
20
|
+
- 你已有 UI 组件库,希望新增一个 CDP 适配层。
|
|
21
|
+
- 你在团队内维护一个长期演进的组件包。
|
|
22
|
+
|
|
23
|
+
如果你已经有组件包工程,并且只是新增组件,可以直接阅读 [开发最小可运行组件](./03-开发最小可运行组件.md)。
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 推荐目录结构
|
|
28
|
+
|
|
29
|
+
```text
|
|
30
|
+
my-cdp-components/
|
|
31
|
+
├── src/
|
|
32
|
+
│ ├── components/
|
|
33
|
+
│ │ └── MyButton/
|
|
34
|
+
│ │ ├── index.tsx
|
|
35
|
+
│ │ └── manifest.ts
|
|
36
|
+
│ ├── manifests.ts
|
|
37
|
+
│ └── plugin.ts
|
|
38
|
+
├── package.json
|
|
39
|
+
├── tsconfig.json
|
|
40
|
+
├── vite.config.ts
|
|
41
|
+
└── README.md
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
目录说明:
|
|
45
|
+
|
|
46
|
+
| 路径 | 职责 |
|
|
47
|
+
|------|------|
|
|
48
|
+
| `src/components/*/index.tsx` | React 组件或第三方组件 wrapper |
|
|
49
|
+
| `src/components/*/manifest.ts` | 单组件的 `ComponentManifest` |
|
|
50
|
+
| `src/manifests.ts` | 汇总组件注册项,便于团队协作审查 |
|
|
51
|
+
| `src/plugin.ts` | 导出 `EngineComponentPlugin`,宿主加载入口 |
|
|
52
|
+
| `vite.config.ts` | 将插件构建为 ESM library |
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 安装 SDK
|
|
57
|
+
|
|
58
|
+
推荐从 npm 安装最新版:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
npm install cdp-material-sdk@latest react react-dom
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
如需锁定到精确版本:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
npm install cdp-material-sdk@<version> react react-dom
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
无 npm 访问时,可回退到 GitHub Release `.tgz`:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
npm install https://github.com/GroovyKetchup/cdp-material-sdk/releases/download/v<version>/cdp-material-sdk-<version>.tgz
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
`react` 与 `react-dom` 是 peer dependency,需要由组件作者侧显式安装(建议 19.x)。
|
|
77
|
+
|
|
78
|
+
默认导入入口:
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
import type { ComponentManifest, EngineComponentPlugin } from 'cdp-material-sdk/portable';
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
导入边界:
|
|
85
|
+
|
|
86
|
+
| 入口 | 用途 |
|
|
87
|
+
|------|------|
|
|
88
|
+
| `cdp-material-sdk/portable` | 默认入口。用于声明 manifest、组件包、插件、traits、校验工具 |
|
|
89
|
+
| `cdp-material-sdk/host-react` | 仅在确认与宿主共享 React runtime 和 Context 身份时使用 |
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## package.json 关键约束
|
|
94
|
+
|
|
95
|
+
```jsonc
|
|
96
|
+
{
|
|
97
|
+
"name": "@myorg/cdp-components",
|
|
98
|
+
"version": "1.0.0",
|
|
99
|
+
"type": "module",
|
|
100
|
+
"main": "dist/index.js",
|
|
101
|
+
"types": "dist/index.d.ts",
|
|
102
|
+
"peerDependencies": {
|
|
103
|
+
"react": "^19.1.1",
|
|
104
|
+
"react-dom": "^19.1.1"
|
|
105
|
+
},
|
|
106
|
+
"dependencies": {
|
|
107
|
+
"cdp-material-sdk": "<tgz-url-or-version>"
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
关键点:
|
|
113
|
+
|
|
114
|
+
- **不要把 React 打进 bundle。** `react`、`react-dom`、`react/jsx-runtime` 应由宿主提供。
|
|
115
|
+
- `cdp-material-sdk/portable` 可以作为依赖使用。
|
|
116
|
+
- UI 组件库是否 externalize 需要与宿主协商;默认可以打入 bundle。
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Vite library mode 参考
|
|
121
|
+
|
|
122
|
+
```ts
|
|
123
|
+
import { defineConfig } from 'vite';
|
|
124
|
+
import react from '@vitejs/plugin-react';
|
|
125
|
+
import dts from 'vite-plugin-dts';
|
|
126
|
+
|
|
127
|
+
export default defineConfig({
|
|
128
|
+
plugins: [react(), dts()],
|
|
129
|
+
build: {
|
|
130
|
+
lib: {
|
|
131
|
+
entry: 'src/plugin.ts',
|
|
132
|
+
formats: ['es'],
|
|
133
|
+
fileName: 'index',
|
|
134
|
+
},
|
|
135
|
+
rollupOptions: {
|
|
136
|
+
external: ['react', 'react/jsx-runtime', 'react-dom'],
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## 团队协作建议
|
|
145
|
+
|
|
146
|
+
如果组件包由多人维护,建议约定:
|
|
147
|
+
|
|
148
|
+
- 每个组件独立目录,组件实现和 manifest 放在一起。
|
|
149
|
+
- 组件 `type` 使用命名空间,例如 `acme.Button`、`acme.UserCard`。
|
|
150
|
+
- 新增组件只修改自己的目录和组件注册清单。
|
|
151
|
+
- 每次新增组件都运行 [自检与排错](./05-自检与排错.md)。
|
|
152
|
+
- 不直接依赖宿主源码路径或未从 `cdp-material-sdk` 公开入口导出的模块。
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## 完成标准
|
|
157
|
+
|
|
158
|
+
- [ ] 工程可以执行 `npm run build`。
|
|
159
|
+
- [ ] 构建产物是 ESM。
|
|
160
|
+
- [ ] React 相关依赖没有被打入 bundle。
|
|
161
|
+
- [ ] 工程中只从 `cdp-material-sdk/portable` 或必要的 `host-react` 入口导入 SDK API。
|
|
162
|
+
- [ ] 已准备 `src/plugin.ts` 作为宿主加载入口。
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## 关联文档
|
|
167
|
+
|
|
168
|
+
本文档只保留本层级职责内容:Recipe 提供任务步骤,Reference 提供稳定模型和规则,validateManifest 文档提供校验级别事实源。
|
|
169
|
+
|
|
170
|
+
- 关联文档:[02-创建组件包并注册](./02-创建组件包并注册.md)
|
|
171
|
+
- 关联文档:[03-开发最小可运行组件](./03-开发最小可运行组件.md)
|
|
172
|
+
- SDK 导入边界:[SDK导入边界](../reference/SDK导入边界.md)
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: getting-started
|
|
3
|
+
capability: package-registration
|
|
4
|
+
related:
|
|
5
|
+
- getting-started/03-开发最小可运行组件.md
|
|
6
|
+
- reference/示例代码索引.md
|
|
7
|
+
- reference/SDK导入边界.md
|
|
8
|
+
---
|
|
9
|
+
# 02 - 创建组件包并注册
|
|
10
|
+
|
|
11
|
+
组件包是 CDP 识别和加载组件的发布单元。一个组件包可以包含 1 个或多个组件。
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 适用场景
|
|
16
|
+
|
|
17
|
+
- 你要创建新的组件包。
|
|
18
|
+
- 你已经有组件包,要往里面新增组件。
|
|
19
|
+
- 你需要理解 `EngineComponentPackage` 和 `EngineComponentPlugin` 的关系。
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 核心模型
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
React Component + ComponentManifest
|
|
27
|
+
↓
|
|
28
|
+
EngineComponentRegistration
|
|
29
|
+
↓
|
|
30
|
+
EngineComponentPackage
|
|
31
|
+
↓
|
|
32
|
+
EngineComponentPlugin.install(api)
|
|
33
|
+
↓
|
|
34
|
+
api.registerPackage(pkg)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
关键类型:
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
import type {
|
|
41
|
+
EngineComponentPackage,
|
|
42
|
+
EngineComponentPlugin,
|
|
43
|
+
EngineComponentRegistration,
|
|
44
|
+
} from 'cdp-material-sdk/portable';
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 创建组件包
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
import type { EngineComponentPackage } from 'cdp-material-sdk/portable';
|
|
53
|
+
import { MyButton } from './components/MyButton';
|
|
54
|
+
import { myButtonManifest } from './components/MyButton/manifest';
|
|
55
|
+
|
|
56
|
+
export const myPackage: EngineComponentPackage = {
|
|
57
|
+
id: '@acme/cdp-components',
|
|
58
|
+
version: '1.0.0',
|
|
59
|
+
components: [
|
|
60
|
+
{
|
|
61
|
+
manifest: myButtonManifest,
|
|
62
|
+
component: MyButton,
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
};
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
字段说明:
|
|
69
|
+
|
|
70
|
+
| 字段 | 说明 |
|
|
71
|
+
|------|------|
|
|
72
|
+
| `id` | 组件包唯一标识,建议与 npm 包名一致 |
|
|
73
|
+
| `version` | 组件包版本 |
|
|
74
|
+
| `components` | 组件注册列表,每项包含 `manifest` 和 React 组件 |
|
|
75
|
+
| `compatibility` | 可选,用于声明 SDK 或引擎版本兼容范围 |
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 创建插件入口
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
import type { EngineComponentPlugin } from 'cdp-material-sdk/portable';
|
|
83
|
+
import { myPackage } from './package';
|
|
84
|
+
|
|
85
|
+
const plugin: EngineComponentPlugin = {
|
|
86
|
+
id: myPackage.id,
|
|
87
|
+
version: myPackage.version,
|
|
88
|
+
compatibility: myPackage.compatibility,
|
|
89
|
+
install: (api) => {
|
|
90
|
+
api.registerPackage(myPackage);
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
export default plugin;
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
建议优先使用 `api.registerPackage(pkg)`,而不是逐个调用 `api.registerComponent()`。这样更利于版本管理和卸载回滚。
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 往已有组件包新增组件
|
|
102
|
+
|
|
103
|
+
这是团队协作中最常见的场景。
|
|
104
|
+
|
|
105
|
+
### 1. 新建组件目录
|
|
106
|
+
|
|
107
|
+
```text
|
|
108
|
+
src/components/UserCard/
|
|
109
|
+
├── index.tsx
|
|
110
|
+
└── manifest.ts
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### 2. 导出组件注册项
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
import type { EngineComponentRegistration } from 'cdp-material-sdk/portable';
|
|
117
|
+
import { UserCard } from './index';
|
|
118
|
+
import { userCardManifest } from './manifest';
|
|
119
|
+
|
|
120
|
+
export const userCardRegistration: EngineComponentRegistration = {
|
|
121
|
+
manifest: userCardManifest,
|
|
122
|
+
component: UserCard,
|
|
123
|
+
};
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### 3. 加入组件包清单
|
|
127
|
+
|
|
128
|
+
```ts
|
|
129
|
+
import type { EngineComponentPackage } from 'cdp-material-sdk/portable';
|
|
130
|
+
import { myButtonRegistration } from './components/MyButton/registration';
|
|
131
|
+
import { userCardRegistration } from './components/UserCard/registration';
|
|
132
|
+
|
|
133
|
+
export const myPackage: EngineComponentPackage = {
|
|
134
|
+
id: '@acme/cdp-components',
|
|
135
|
+
version: '1.1.0',
|
|
136
|
+
components: [
|
|
137
|
+
myButtonRegistration,
|
|
138
|
+
userCardRegistration,
|
|
139
|
+
],
|
|
140
|
+
};
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 4. 更新版本
|
|
144
|
+
|
|
145
|
+
新增对外组件时,建议更新组件包版本。团队可以按语义化版本约定:
|
|
146
|
+
|
|
147
|
+
| 变更 | 建议 |
|
|
148
|
+
|------|------|
|
|
149
|
+
| 新增组件 | minor |
|
|
150
|
+
| 修复组件内部 bug | patch |
|
|
151
|
+
| 删除组件或修改已有组件 `type` | major |
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 命名建议
|
|
156
|
+
|
|
157
|
+
| 对象 | 建议 | 示例 |
|
|
158
|
+
|------|------|------|
|
|
159
|
+
| 包 id | 与包名一致 | `@acme/cdp-components` |
|
|
160
|
+
| 组件 type | 带组织前缀 | `acme.UserCard` |
|
|
161
|
+
| 组件目录 | PascalCase | `UserCard` |
|
|
162
|
+
| manifest 变量 | camelCase | `userCardManifest` |
|
|
163
|
+
| registration 变量 | camelCase | `userCardRegistration` |
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## 自检
|
|
168
|
+
|
|
169
|
+
每次新增或修改组件包后,至少检查:
|
|
170
|
+
|
|
171
|
+
- [ ] `components` 中每个组件都有唯一 `manifest.type`。
|
|
172
|
+
- [ ] `plugin.id` 与 `package.id` 一致。
|
|
173
|
+
- [ ] `plugin.version` 与 `package.version` 一致。
|
|
174
|
+
- [ ] 每个 manifest 通过 `validateManifest()`。
|
|
175
|
+
- [ ] 新增组件已加入 `EngineComponentPackage.components`。
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## 关联文档
|
|
180
|
+
|
|
181
|
+
本文档只保留本层级职责内容:Recipe 提供任务步骤,Reference 提供稳定模型和规则,validateManifest 文档提供校验级别事实源。
|
|
182
|
+
|
|
183
|
+
- 关联文档:[03-开发最小可运行组件](./03-开发最小可运行组件.md)
|
|
184
|
+
- 示例索引:[示例代码索引](../reference/示例代码索引.md)
|
|
185
|
+
- SDK 导入边界:[SDK导入边界](../reference/SDK导入边界.md)
|