@doubao-apps/ai 0.0.19 → 0.0.20
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/dist/skills/doubao-apps-dev/.ai/reference/open-api.md +94 -2
- package/dist/skills/douyin-to-doubao/SKILL.md +333 -0
- package/dist/skills/douyin-to-doubao/assets/migration-checklist-template.md +144 -0
- package/dist/skills/douyin-to-doubao/references/mapping/component-mapping.md +200 -0
- package/dist/skills/douyin-to-doubao/references/mapping/core-api-mapping.md +231 -0
- package/dist/skills/douyin-to-doubao/references/mapping/event-mapping.md +196 -0
- package/dist/skills/douyin-to-doubao/references/mapping/lifecycle-mapping.md +216 -0
- package/dist/skills/douyin-to-doubao/references/mapping/style-mapping.md +195 -0
- package/dist/skills/douyin-to-doubao/references/source-framework/api-reference.md +223 -0
- package/dist/skills/douyin-to-doubao/references/source-framework/components.md +252 -0
- package/dist/skills/h5-to-doubao/SKILL.md +9 -7
- package/dist/skills/weixin-to-doubao/SKILL.md +18 -38
- package/dist/skills/weixin-to-doubao/assets/migration-checklist-template.md +11 -7
- package/dist/skills/weixin-to-doubao/references/mapping/component-mapping.md +35 -20
- package/dist/skills/weixin-to-doubao/references/source-framework/components.md +22 -12
- package/package.json +1 -1
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
# 抖音小程序组件参考
|
|
2
|
+
|
|
3
|
+
> 本文档为迁移参考,聚焦抖音小程序常用基础组件及其迁移判断。
|
|
4
|
+
> 官方事实优先来源已于 `2026-04-01` 校验。
|
|
5
|
+
|
|
6
|
+
## 官方文档入口
|
|
7
|
+
|
|
8
|
+
- 组件概述: `https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/component/overview/`
|
|
9
|
+
- TTML 数据绑定: `https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/tutorial/miniapp-framework/view/ttml-data-bind`
|
|
10
|
+
- TTML 列表渲染: `https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/tutorial/miniapp-framework/view/ttml-list-draw`
|
|
11
|
+
- TTML 事件: `https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/tutorial/miniapp-framework/view/ttml-event`
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 组件通用规则
|
|
16
|
+
|
|
17
|
+
官方组件概述说明:
|
|
18
|
+
|
|
19
|
+
- 组件在 `.ttml` 中使用
|
|
20
|
+
- 所有组件与属性名称都是小写,以连字符连接
|
|
21
|
+
- 通用属性包括 `id`、`class`、`style`、`hidden`、`data-*`、`bind* / catch*`
|
|
22
|
+
|
|
23
|
+
**迁移判断**:
|
|
24
|
+
|
|
25
|
+
- `class` / `style` 需要重写到 Doubao `className` / `index.scss`
|
|
26
|
+
- `data-*` 可以迁移为 `data-*` 或直接改成闭包传值
|
|
27
|
+
- 事件名从字符串方法名切到 TSX 函数引用
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 视图容器
|
|
32
|
+
|
|
33
|
+
### `view`
|
|
34
|
+
|
|
35
|
+
官方组件概述将 `view` 描述为“相当于 html 中的 div”。
|
|
36
|
+
|
|
37
|
+
```ttml
|
|
38
|
+
<view class="container">内容</view>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**迁移**:→ `<view className="container">...</view>`
|
|
42
|
+
|
|
43
|
+
### `scroll-view`
|
|
44
|
+
|
|
45
|
+
官方组件概述说明:
|
|
46
|
+
|
|
47
|
+
- 可实现横向滚动和竖向滚动
|
|
48
|
+
- 竖向滚动时需要给定固定高度
|
|
49
|
+
- 长度单位支持 `px` 和 `rpx`
|
|
50
|
+
|
|
51
|
+
```ttml
|
|
52
|
+
<scroll-view scroll-y style="height: 400rpx;" bindscrolltolower="loadMore">
|
|
53
|
+
...
|
|
54
|
+
</scroll-view>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**迁移**:
|
|
58
|
+
|
|
59
|
+
- 保留为 `<scroll-view>`
|
|
60
|
+
- 高度放到 `index.scss`
|
|
61
|
+
- 事件改为 `onScrollToLower`
|
|
62
|
+
|
|
63
|
+
### `swiper` / `swiper-item`
|
|
64
|
+
|
|
65
|
+
官方组件概述说明:
|
|
66
|
+
|
|
67
|
+
- `swiper` 为滑块视图容器
|
|
68
|
+
- 内部只允许使用 `swiper-item`
|
|
69
|
+
- `swiper-item` 仅可放在 `swiper` 内,宽高自动为 `100%`
|
|
70
|
+
|
|
71
|
+
```ttml
|
|
72
|
+
<swiper indicator-dots autoplay>
|
|
73
|
+
<swiper-item tt:for="{{banners}}" tt:key="id">
|
|
74
|
+
<image src="{{item.url}}" mode="aspectFill" />
|
|
75
|
+
</swiper-item>
|
|
76
|
+
</swiper>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**迁移**:
|
|
80
|
+
|
|
81
|
+
- 当前项目优先保留小写 `<swiper>` / `<swiper-item>` 标签,loader 会自动补齐组件 import
|
|
82
|
+
- 不要把源端 `swiper` 误降级成普通 `scroll-view`
|
|
83
|
+
- 若当前项目确实缺少对应标签能力,再考虑补封装或显式组件方案
|
|
84
|
+
- 若业务依赖抖音端特有行为,单独补兼容说明
|
|
85
|
+
|
|
86
|
+
### `movable-area` / `movable-view`
|
|
87
|
+
|
|
88
|
+
官方组件概述说明其为拖拽滑动容器。
|
|
89
|
+
|
|
90
|
+
**迁移**:当前项目已有 `<movable-area>` / `<movable-view>`,优先直接映射;复杂缩放、越界和动画参数需要逐项校对。
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 基础内容
|
|
95
|
+
|
|
96
|
+
### `text`
|
|
97
|
+
|
|
98
|
+
```ttml
|
|
99
|
+
<text>标题</text>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**迁移**:→ `<text>标题</text>`
|
|
103
|
+
|
|
104
|
+
### `rich-text`
|
|
105
|
+
|
|
106
|
+
源端为富文本组件。
|
|
107
|
+
|
|
108
|
+
**迁移**:按目标业务决定是保留富文本、转安全渲染,还是降级为普通文本;不要机械展开 HTML 字符串。
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 媒体
|
|
113
|
+
|
|
114
|
+
### `image`
|
|
115
|
+
|
|
116
|
+
官方组件概述说明支持 `JPG`、`PNG`、`SVG`、`WEBP`、`GIF` 等格式。
|
|
117
|
+
|
|
118
|
+
```ttml
|
|
119
|
+
<image src="{{imgUrl}}" mode="aspectFill" />
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**迁移**:→ `<image src={imgUrl} mode="aspectFill" />`
|
|
123
|
+
|
|
124
|
+
### `video`
|
|
125
|
+
|
|
126
|
+
源端为视频组件,并可结合抖音视频能力。
|
|
127
|
+
|
|
128
|
+
**迁移**:
|
|
129
|
+
|
|
130
|
+
- 纯播放能力可映射到 Doubao 视频能力
|
|
131
|
+
- 与“发布到抖音视频”“挂载到视频”强绑定的逻辑必须单列处理
|
|
132
|
+
|
|
133
|
+
### `camera`
|
|
134
|
+
|
|
135
|
+
官方组件概述标注其为原生组件。
|
|
136
|
+
|
|
137
|
+
**迁移**:优先查 Doubao 目标侧是否有对应宿主能力;默认视为需专项适配。
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## 表单
|
|
142
|
+
|
|
143
|
+
### `button`
|
|
144
|
+
|
|
145
|
+
```ttml
|
|
146
|
+
<button type="primary" bind:tap="handleSubmit">提交</button>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**迁移**:
|
|
150
|
+
|
|
151
|
+
- 常规点击按钮 → Doubao 按钮组件或内置按钮
|
|
152
|
+
- `open-type="share"`、授权、手机号、视频挂载等平台能力按钮必须单列
|
|
153
|
+
|
|
154
|
+
### `input`
|
|
155
|
+
|
|
156
|
+
官方组件概述将其定义为“用于键盘交互”的输入框组件。
|
|
157
|
+
|
|
158
|
+
```ttml
|
|
159
|
+
<input value="{{keyword}}" bind:input="handleInput" />
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**迁移**:→ `<input value={keyword} onInput={handleInput} />`
|
|
163
|
+
|
|
164
|
+
### `textarea`
|
|
165
|
+
|
|
166
|
+
**迁移**:保留为 `<textarea>`,事件改为 TSX 函数引用。
|
|
167
|
+
|
|
168
|
+
### `switch`
|
|
169
|
+
|
|
170
|
+
**迁移**:优先使用目标侧小写 `<switch>` 标签;回调语义改成 `onChange(checked)`。
|
|
171
|
+
|
|
172
|
+
### `slider`
|
|
173
|
+
|
|
174
|
+
**迁移**:保留滑块语义;回调语义改成 `onChange(value)`。
|
|
175
|
+
|
|
176
|
+
### `picker` / `picker-view`
|
|
177
|
+
|
|
178
|
+
源端提供选择器与嵌入式滚动选择器。
|
|
179
|
+
|
|
180
|
+
**迁移**:
|
|
181
|
+
|
|
182
|
+
- 优先使用当前项目现成的 `<picker-view>` / `<picker-column>`
|
|
183
|
+
- 弹出式选择器通常配合 `<popup>`、`Dialog` 或业务弹层容器实现
|
|
184
|
+
|
|
185
|
+
### `checkbox` / `checkbox-group` / `radio` / `radio-group`
|
|
186
|
+
|
|
187
|
+
源端原生支持。
|
|
188
|
+
|
|
189
|
+
**迁移**:`radio` / `radio-group` 优先直接使用目标侧小写标签;`checkbox` / `checkbox-group` 当前仍建议替换为受控表单组件或业务封装。
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## 导航
|
|
194
|
+
|
|
195
|
+
### `navigator`
|
|
196
|
+
|
|
197
|
+
官方组件概述将其定义为“页面链接,控制小程序的跳转”。
|
|
198
|
+
|
|
199
|
+
```ttml
|
|
200
|
+
<navigator url="/pages/detail/index?id={{item.id}}">
|
|
201
|
+
<view>查看详情</view>
|
|
202
|
+
</navigator>
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**迁移**:→ 用 `navigateTo` / `redirectTo` 显式控制跳转,而不是保留标签式导航。
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## TTML 指令与组件组合
|
|
210
|
+
|
|
211
|
+
### 数据绑定
|
|
212
|
+
|
|
213
|
+
官方 TTML 数据绑定示例:
|
|
214
|
+
|
|
215
|
+
```ttml
|
|
216
|
+
<view>{{ message }}</view>
|
|
217
|
+
<view id="item-{{id}}"></view>
|
|
218
|
+
<view tt:if="{{condition}}"></view>
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### 列表渲染
|
|
222
|
+
|
|
223
|
+
官方 TTML 列表渲染示例:
|
|
224
|
+
|
|
225
|
+
```ttml
|
|
226
|
+
<view tt:for="{{array}}" tt:key="id">{{item.name}}</view>
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
**迁移**:
|
|
230
|
+
|
|
231
|
+
- `{{expr}}` → `{expr}`
|
|
232
|
+
- `tt:if` → 条件表达式
|
|
233
|
+
- `tt:for` / `tt:key` → `.map()` / `key`
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## 事件与 dataset
|
|
238
|
+
|
|
239
|
+
官方 TTML 事件文档说明:
|
|
240
|
+
|
|
241
|
+
- `bind:tap` / `catch:tap` 可绑定事件
|
|
242
|
+
- 事件对象可携带 `id`、`dataset`、`touches`
|
|
243
|
+
- `data-element-type` 会在 `dataset` 中变为 `elementType`
|
|
244
|
+
|
|
245
|
+
```ttml
|
|
246
|
+
<view data-id="{{item.id}}" bind:tap="handleTap"></view>
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
**迁移**:
|
|
250
|
+
|
|
251
|
+
- 简单场景优先闭包传值:`onClick={() => handleTap(item.id)}`
|
|
252
|
+
- 只有在需要完全保留通用事件模型时才继续使用 `data-*`
|
|
@@ -39,7 +39,7 @@ description: Migrate H5 projects to Doubao Apps SDK (React Lynx). Supports stand
|
|
|
39
39
|
| Claude Code | `.claude/skills/doubao-apps-dev` |
|
|
40
40
|
| 其他(Cursor 等) | `.agent/skills/doubao-apps-dev` |
|
|
41
41
|
|
|
42
|
-
通过 `npx @
|
|
42
|
+
通过 `npx @doubao-apps/ai skills add doubao-apps-dev --agent claude` 安装。
|
|
43
43
|
|
|
44
44
|
| 文档 | 路径 | 用途 |
|
|
45
45
|
|------|------|------|
|
|
@@ -67,7 +67,9 @@ description: Migrate H5 projects to Doubao Apps SDK (React Lynx). Supports stand
|
|
|
67
67
|
|------|------|------|
|
|
68
68
|
| `@doubao-apps/framework` | 框架 API 和 React Hooks | `import { definePage, useState } from '@doubao-apps/framework'` |
|
|
69
69
|
| `@doubao-apps/framework/api` | 端能力 API(替代 fetch/localStorage 等) | `import { request, showToast } from '@doubao-apps/framework/api'` |
|
|
70
|
-
|
|
|
70
|
+
| `@doubao-apps/framework/components` | 目标组件库导出;对已支持的小写标签会由 loader 自动注入 import | `import { PickerView, PickerColumn, RadioGroup, Radio } from '@doubao-apps/framework/components'` |
|
|
71
|
+
|
|
72
|
+
> 当前项目已支持直接写小写标签:`<view>`、`<text>`、`<image>`、`<input>`、`<textarea>`、`<scroll-view>`、`<list>`、`<list-item>`、`<button>`、`<switch>`、`<slider>`、`<swiper>`、`<swiper-item>`、`<map>`、`<map-marker>`、`<movable-area>`、`<movable-view>`、`<popup>`、`<radio>`、`<radio-group>`、`<picker-view>`、`<picker-column>`、`<web-view>`、`<svg>`。
|
|
71
73
|
|
|
72
74
|
### 源框架知识
|
|
73
75
|
|
|
@@ -87,11 +89,11 @@ description: Migrate H5 projects to Doubao Apps SDK (React Lynx). Supports stand
|
|
|
87
89
|
| `<img>` | `<image>` | 图片 |
|
|
88
90
|
| `<a>` | `<view onClick={...}>` | 链接(无 a 标签) |
|
|
89
91
|
| `<ul>/<ol>/<li>` | `<view>` + map | 列表 |
|
|
90
|
-
| `<button>` | `<button
|
|
92
|
+
| `<button>` | `<button>`(可直接保留小写标签) | 按钮 |
|
|
91
93
|
| `<input>` | `<input>` | 输入框 |
|
|
92
94
|
| `<textarea>` | `<textarea>` | 多行输入 |
|
|
93
|
-
| `<select>` | `<
|
|
94
|
-
| `<svg>` | `<svg
|
|
95
|
+
| `<select>` | `<picker-view>` / `<picker-column>`(常配合 `<popup>`) | 单选枚举控件 |
|
|
96
|
+
| `<svg>` | `<svg>`(可直接保留小写标签) | SVG 图形,直接支持 |
|
|
95
97
|
|
|
96
98
|
### 事件映射
|
|
97
99
|
|
|
@@ -147,7 +149,7 @@ ls .agent/skills/doubao-apps-dev/AGENTS.md 2>/dev/null && echo "SKILLS_BASE=.age
|
|
|
147
149
|
**2. 如未安装,执行安装**:
|
|
148
150
|
|
|
149
151
|
```bash
|
|
150
|
-
npx @
|
|
152
|
+
npx @doubao-apps/ai skills add doubao-apps-dev --agent claude
|
|
151
153
|
```
|
|
152
154
|
|
|
153
155
|
**3. 初始化 Doubao Apps 目标项目**
|
|
@@ -308,7 +310,7 @@ HTML 元素:
|
|
|
308
310
|
|
|
309
311
|
**A. 公共步骤**
|
|
310
312
|
|
|
311
|
-
1. **依赖更新**(package.json):移除 Web 框架相关包,添加 `@
|
|
313
|
+
1. **依赖更新**(package.json):移除 Web 框架相关包,添加 `@doubao-apps/*`
|
|
312
314
|
2. **入口收敛**:源文件无论来自 React、Vue 还是原生 H5,统一落到 `index.tsx` / `index.scss`
|
|
313
315
|
3. **框架导入转换**:组件/hook 从 `@doubao-apps/framework` 导入,浏览器 API 从 `@doubao-apps/framework/api` 导入
|
|
314
316
|
4. **组件定义转换**:顶层页面组件用 `definePage({})` 包装,子组件输出为 FC
|
|
@@ -1,28 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: weixin-to-doubao
|
|
3
3
|
description: Migrate WeChat Mini Program (微信小程序) projects to Doubao Apps SDK (React Lynx). Use when converting WeChat Mini Program WXML/WXSS/JS code, or when users request migration from 微信小程序 / WeChat / wx.* APIs.
|
|
4
|
-
|
|
5
|
-
# 版本化知识管理
|
|
6
|
-
knowledge:
|
|
7
|
-
source:
|
|
8
|
-
framework: "weixin"
|
|
9
|
-
version: "3.x"
|
|
10
|
-
docs_path: "./references/source-framework/"
|
|
11
|
-
target:
|
|
12
|
-
framework: "doubao-apps"
|
|
13
|
-
package: "@byted-doubao-apps/ai"
|
|
14
|
-
runtime_package: "@doubao-apps/framework"
|
|
15
|
-
version: "0.0.1"
|
|
16
|
-
mapping:
|
|
17
|
-
version: "1.0.0"
|
|
18
|
-
last_verified: "2026-03-11"
|
|
19
|
-
docs_path: "./references/mapping/"
|
|
20
|
-
fetch:
|
|
21
|
-
method: "npx"
|
|
22
|
-
command: "npx @byted-doubao-apps/ai --skills --agent claude"
|
|
23
|
-
local_path:
|
|
24
|
-
claude_code: ".claude/skills/doubao-apps-dev"
|
|
25
|
-
other: ".agent/skills/doubao-apps-dev"
|
|
26
4
|
---
|
|
27
5
|
|
|
28
6
|
# 微信小程序 to Doubao Apps Migration Skill
|
|
@@ -59,7 +37,7 @@ knowledge:
|
|
|
59
37
|
| Claude Code | `.claude/skills/doubao-apps-dev` |
|
|
60
38
|
| 其他(Cursor 等) | `.agent/skills/doubao-apps-dev` |
|
|
61
39
|
|
|
62
|
-
通过 `npx @
|
|
40
|
+
通过 `npx @doubao-apps/ai skills add doubao-apps-dev --agent claude` 安装。
|
|
63
41
|
|
|
64
42
|
| 文档 | 路径 | 用途 |
|
|
65
43
|
|------|------|------|
|
|
@@ -84,7 +62,9 @@ knowledge:
|
|
|
84
62
|
|------|------|------|
|
|
85
63
|
| `@doubao-apps/framework` | 框架 API 和 React Hooks | `import { definePage, useState } from '@doubao-apps/framework'` |
|
|
86
64
|
| `@doubao-apps/framework/api` | 端能力 API(替代 wx.*) | `import { request, showToast } from '@doubao-apps/framework/api'` |
|
|
87
|
-
|
|
|
65
|
+
| `@doubao-apps/framework/components` | 目标组件库导出;对已支持的小写标签会由 loader 自动注入 import | `import { PickerView, PickerColumn, RadioGroup, Radio } from '@doubao-apps/framework/components'` |
|
|
66
|
+
|
|
67
|
+
> 当前项目已支持直接写小写标签:`<view>`、`<text>`、`<image>`、`<input>`、`<textarea>`、`<scroll-view>`、`<list>`、`<list-item>`、`<button>`、`<switch>`、`<slider>`、`<swiper>`、`<swiper-item>`、`<map>`、`<map-marker>`、`<movable-area>`、`<movable-view>`、`<popup>`、`<radio>`、`<radio-group>`、`<picker-view>`、`<picker-column>`、`<web-view>`、`<svg>`。
|
|
88
68
|
|
|
89
69
|
---
|
|
90
70
|
|
|
@@ -107,7 +87,7 @@ ls .agent/skills/doubao-apps-dev/AGENTS.md 2>/dev/null && echo "SKILLS_BASE=.age
|
|
|
107
87
|
**2. 如未安装,执行安装**:
|
|
108
88
|
|
|
109
89
|
```bash
|
|
110
|
-
npx @
|
|
90
|
+
npx @doubao-apps/ai skills add doubao-apps-dev --agent claude
|
|
111
91
|
```
|
|
112
92
|
|
|
113
93
|
**3. 初始化 Doubao Apps 目标项目**
|
|
@@ -159,9 +139,9 @@ $SKILLS_BASE:.claude/skills/doubao-apps-dev
|
|
|
159
139
|
⚠️ 需确认:wx.login, wx.getUserProfile (2 个,无直接映射)
|
|
160
140
|
|
|
161
141
|
组件:
|
|
162
|
-
✅ 有映射:view, text, image, button, input, scroll-view (
|
|
163
|
-
|
|
164
|
-
⚠️
|
|
142
|
+
✅ 有映射:view, text, image, button, input, scroll-view, swiper, web-view (8 个)
|
|
143
|
+
⚠️ 需适配:picker, checkbox-group (2 个)
|
|
144
|
+
⚠️ 宿主校验:web-view 白名单、地图/相机等原生能力
|
|
165
145
|
|
|
166
146
|
复杂度评估:中等
|
|
167
147
|
```
|
|
@@ -197,7 +177,7 @@ $SKILLS_BASE:.claude/skills/doubao-apps-dev
|
|
|
197
177
|
|
|
198
178
|
风险点:
|
|
199
179
|
⚠️ wx.login 无直接映射,需人工决策
|
|
200
|
-
|
|
180
|
+
⚠️ web-view 需确认宿主支持与白名单配置
|
|
201
181
|
|
|
202
182
|
是否开始迁移?(y/n)
|
|
203
183
|
```
|
|
@@ -221,7 +201,7 @@ $SKILLS_BASE:.claude/skills/doubao-apps-dev
|
|
|
221
201
|
|
|
222
202
|
#### 4.2 单文件转换步骤(每个页面/组件)
|
|
223
203
|
|
|
224
|
-
1. **依赖更新**(package.json):移除微信相关包,添加 `@
|
|
204
|
+
1. **依赖更新**(package.json):移除微信相关包,添加 `@doubao-apps/*`
|
|
225
205
|
2. **import 语句转换**:`wx.*` → `@doubao-apps/framework/api`
|
|
226
206
|
3. **组件定义方式**:`Page({})` → `definePage({})`, `Component({})` → 子组件 FC
|
|
227
207
|
4. **状态管理**:`this.data` + `this.setData()` → `useState()`
|
|
@@ -245,11 +225,11 @@ $SKILLS_BASE:.claude/skills/doubao-apps-dev
|
|
|
245
225
|
```
|
|
246
226
|
📋 迁移摘要
|
|
247
227
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
248
|
-
已迁移:
|
|
249
|
-
└─ 页面:10 个 └─ 组件:
|
|
228
|
+
已迁移:15/15 文件
|
|
229
|
+
└─ 页面:10 个 └─ 组件:5 个
|
|
250
230
|
|
|
251
|
-
|
|
252
|
-
- pages/webview/webview
|
|
231
|
+
需宿主校验:
|
|
232
|
+
- pages/webview/webview:已保留 `<web-view>`,待确认运行时支持与域名白名单
|
|
253
233
|
|
|
254
234
|
需人工处理:
|
|
255
235
|
- wx.login × 1 处:无直接映射,请查阅平台登录 API
|
|
@@ -333,7 +313,7 @@ const IndexPage: FC = () => {
|
|
|
333
313
|
return (
|
|
334
314
|
<view style={{ padding: 16 }}>
|
|
335
315
|
<text style={{ fontSize: 18, fontWeight: 'bold' }}>Hello</text>
|
|
336
|
-
{/* button
|
|
316
|
+
{/* button 可直接保留小写标签,由 components-loader 自动引入 */}
|
|
337
317
|
<button onClick={() => setCount(count + 1)}>
|
|
338
318
|
<text>点击 {count} 次</text>
|
|
339
319
|
</button>
|
|
@@ -482,10 +462,10 @@ export const Card: FC<CardProps> = ({ title, desc, onCardTap }) => {
|
|
|
482
462
|
**原因**:Doubao Apps 使用独立的 bridge API 包
|
|
483
463
|
**解决**:参考 core-api-mapping.md 中的 wx.* → bridge API 映射表
|
|
484
464
|
|
|
485
|
-
### `<web-view>`
|
|
465
|
+
### `<web-view>` 运行异常 / 无法打开
|
|
486
466
|
|
|
487
|
-
|
|
488
|
-
|
|
467
|
+
**原因**:当前 SDK 已提供 `<web-view>` 组件,但是否可用仍取决于宿主能力、白名单和运行时配置
|
|
468
|
+
**解决**:优先保留 `<web-view src="..." />`,若运行侧受限,再退回原生打开页或外链方案
|
|
489
469
|
|
|
490
470
|
### 内联样式不生效 / 运行时报错 `CSS length need units`
|
|
491
471
|
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
## 前置准备
|
|
8
8
|
|
|
9
9
|
- [ ] 备份原始微信小程序项目
|
|
10
|
-
- [ ] 安装 Doubao Apps 知识库:`npx @
|
|
10
|
+
- [ ] 安装 Doubao Apps 知识库:`npx @doubao-apps/ai --skills --agent claude`
|
|
11
11
|
- [ ] 梳理项目页面列表(来自 `app.json` 的 `pages` 字段)
|
|
12
12
|
- [ ] 梳理自定义组件列表
|
|
13
13
|
- [ ] 识别所有 `wx.*` API 调用,标记无直接映射的 API
|
|
@@ -96,13 +96,17 @@
|
|
|
96
96
|
|
|
97
97
|
### 9. 表单组件替换
|
|
98
98
|
|
|
99
|
-
- [ ] `<button>` → `<button
|
|
100
|
-
- [ ] `<switch>` → `<switch
|
|
101
|
-
- [ ] `<slider>` → `<slider
|
|
102
|
-
- [ ] `<swiper>` → `<swiper
|
|
99
|
+
- [ ] `<button>` → `<button>`(可保留小写标签,loader 自动注入,`bindtap` → `onClick`)
|
|
100
|
+
- [ ] `<switch>` → `<switch>`(可保留小写标签,`bindchange` → `onChange={(checked)=>...}`)
|
|
101
|
+
- [ ] `<slider>` → `<slider>`(可保留小写标签,`bindchange` → `onChange={(value)=>...}`)
|
|
102
|
+
- [ ] `<swiper>` → `<swiper>`(可保留小写标签,API 有差异,参考 component-mapping.md)
|
|
103
103
|
- [ ] `<scroll-view scroll-y>` → `<scroll-view scrollOrientation="vertical">`
|
|
104
|
-
- [ ] `<picker>` →
|
|
105
|
-
- [ ] `<
|
|
104
|
+
- [ ] `<picker>` → `<popup>` + `<picker-view>` / `<picker-column>`,或标记为待处理
|
|
105
|
+
- [ ] `<picker-view>` → `<picker-view>` / `<picker-column>`
|
|
106
|
+
- [ ] `<radio>/<radio-group>` → `<radio>` / `<radio-group>`
|
|
107
|
+
- [ ] `<movable-area>/<movable-view>` → `<movable-area>` / `<movable-view>`
|
|
108
|
+
- [ ] `<web-view>` → `<web-view>`,并补充宿主白名单/运行时校验
|
|
109
|
+
- [ ] `<checkbox>` / `<checkbox-group>` → 自定义实现或标记待处理
|
|
106
110
|
|
|
107
111
|
---
|
|
108
112
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# Component Mapping
|
|
2
2
|
|
|
3
|
-
> **Mapping Version**: 1.
|
|
3
|
+
> **Mapping Version**: 1.2.0
|
|
4
4
|
> **Source Framework**: 微信小程序 (WeChat Mini Program) v3.x
|
|
5
5
|
> **Target Framework**: Doubao Apps (React Lynx)
|
|
6
|
-
> **Last Updated**: 2026-
|
|
6
|
+
> **Last Updated**: 2026-04-02
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
@@ -20,6 +20,17 @@
|
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
23
|
+
## 当前项目组件现状
|
|
24
|
+
|
|
25
|
+
基于 `packages/components/src` 与 `packages/kit/src/builder/loader/components-loader/index.ts`,当前工程已经支持以下小写标签直接写入 TSX,并由 loader 自动从 `@doubao-apps/framework/components` 注入组件 import:
|
|
26
|
+
|
|
27
|
+
- 基础标签:`<view>`、`<text>`、`<image>`、`<input>`、`<textarea>`、`<scroll-view>`、`<list>`、`<list-item>`、`<svg>`
|
|
28
|
+
- 扩展标签:`<button>`、`<switch>`、`<slider>`、`<swiper>`、`<swiper-item>`、`<map>`、`<map-marker>`、`<movable-area>`、`<movable-view>`、`<popup>`、`<radio>`、`<radio-group>`、`<picker-view>`、`<picker-column>`、`<web-view>`
|
|
29
|
+
|
|
30
|
+
迁移时优先保留这些小写标签,只有在需要显式类型、ref 或高级封装(如 `Dialog`、`ActionSheet`)时,再按需显式导入组件。
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
23
34
|
## 布局容器
|
|
24
35
|
|
|
25
36
|
| 微信小程序 | Doubao Apps | 说明 |
|
|
@@ -28,7 +39,7 @@
|
|
|
28
39
|
| `<block>` | `<>` (Fragment) 或 `<view>` | `<block>` 只是容器不渲染,用 Fragment 替代 |
|
|
29
40
|
| `<scroll-view scroll-y>` | `<scroll-view scrollOrientation="vertical">` | 垂直滚动容器 |
|
|
30
41
|
| `<scroll-view scroll-x>` | `<scroll-view scrollOrientation="horizontal">` | 水平滚动容器 |
|
|
31
|
-
| `<movable-area>` / `<movable-view>` |
|
|
42
|
+
| `<movable-area>` / `<movable-view>` | `<movable-area>` / `<movable-view>` | 当前项目已有对应组件,优先保留拖拽语义;复杂缩放/越界细节仍需校对 |
|
|
32
43
|
|
|
33
44
|
### 容器示例
|
|
34
45
|
|
|
@@ -88,6 +99,8 @@
|
|
|
88
99
|
|-----------|-------------|------|
|
|
89
100
|
| `<image src mode>` | `<image src mode>` | 图片组件,属性相同 |
|
|
90
101
|
| `<video src>` | `<video src>` | 视频组件 |
|
|
102
|
+
| `<map>` | `<map>` / `<map-marker>` | 当前项目已有地图与标注组件,中心点/覆盖物等 API 需按目标 props 适配 |
|
|
103
|
+
| `<web-view src>` | `<web-view src>` | 当前项目已有 WebView 组件,运行时仍需确认宿主支持与白名单配置 |
|
|
91
104
|
| `<camera>` | 无直接映射 | 需使用相机 API |
|
|
92
105
|
| `<live-player>` | 无直接映射 | 直播播放 |
|
|
93
106
|
| `<live-pusher>` | 无直接映射 | 直播推流 |
|
|
@@ -110,19 +123,19 @@
|
|
|
110
123
|
|
|
111
124
|
## 表单组件
|
|
112
125
|
|
|
113
|
-
>
|
|
126
|
+
> **重要**:当前工程支持将 `button`、`switch`、`slider`、`swiper`、`radio-group`、`picker-view` 等组件写成小写标签;构建时会由 `components-loader` 自动注入 import,因此迁移代码通常**无需手写 import**。
|
|
114
127
|
|
|
115
128
|
| 微信小程序 | Doubao Apps | 说明 |
|
|
116
129
|
|-----------|-------------|------|
|
|
117
|
-
| `<button>` | `<button>` |
|
|
130
|
+
| `<button>` | `<button>` | 可直接保留小写标签 |
|
|
118
131
|
| `<input>` | `<input>` | 原生输入框,属性基本相同 |
|
|
119
132
|
| `<textarea>` | `<textarea>` | 多行输入框 |
|
|
120
|
-
| `<switch>` | `<switch>` |
|
|
121
|
-
| `<slider>` | `<slider>` |
|
|
122
|
-
| `<picker>` |
|
|
123
|
-
| `<picker-view>` |
|
|
133
|
+
| `<switch>` | `<switch>` | 可直接保留小写标签 |
|
|
134
|
+
| `<slider>` | `<slider>` | 可直接保留小写标签 |
|
|
135
|
+
| `<picker>` | `<popup>` + `<picker-view>` / `<picker-column>` | 单列/多列选择都可复用现有选择器组件 |
|
|
136
|
+
| `<picker-view>` | `<picker-view>` + `<picker-column>` | 当前项目已有对应组件,支持多列滚动选择 |
|
|
124
137
|
| `<checkbox` / `<checkbox-group>` | 无直接映射 | 需自定义 |
|
|
125
|
-
| `<radio` / `<radio-group>` |
|
|
138
|
+
| `<radio` / `<radio-group>` | `<radio>` / `<radio-group>` | 当前项目已有单选组件,组内回调为 `onValueChange(value)` |
|
|
126
139
|
| `<form>` | 无需 `<form>` 包裹 | 直接管理各字段状态 |
|
|
127
140
|
|
|
128
141
|
### 表单示例
|
|
@@ -139,7 +152,7 @@
|
|
|
139
152
|
<button bindtap="handleSubmit" type="primary">提交</button>
|
|
140
153
|
</view>
|
|
141
154
|
|
|
142
|
-
// After (Doubao Apps) -
|
|
155
|
+
// After (Doubao Apps) - 直接保留小写标签,loader 会自动补齐组件 import
|
|
143
156
|
const [inputVal, setInputVal] = useState('');
|
|
144
157
|
const [isOn, setIsOn] = useState(false);
|
|
145
158
|
|
|
@@ -255,7 +268,7 @@ import { navigateTo } from '@doubao-apps/framework/api';
|
|
|
255
268
|
|
|
256
269
|
## Swiper 轮播组件
|
|
257
270
|
|
|
258
|
-
`<swiper>` 和 `<swiper-item
|
|
271
|
+
当前工程支持直接写 `<swiper>` 和 `<swiper-item>`,构建时会自动注入组件 import;但 API 与微信小程序不同:
|
|
259
272
|
|
|
260
273
|
```tsx
|
|
261
274
|
// Before (微信小程序)
|
|
@@ -265,7 +278,7 @@ import { navigateTo } from '@doubao-apps/framework/api';
|
|
|
265
278
|
</swiper-item>
|
|
266
279
|
</swiper>
|
|
267
280
|
|
|
268
|
-
// After (Doubao Apps) -
|
|
281
|
+
// After (Doubao Apps) - 保留小写 swiper 标签
|
|
269
282
|
<swiper
|
|
270
283
|
data={banners}
|
|
271
284
|
itemWidth={375}
|
|
@@ -285,14 +298,18 @@ import { navigateTo } from '@doubao-apps/framework/api';
|
|
|
285
298
|
|
|
286
299
|
---
|
|
287
300
|
|
|
288
|
-
##
|
|
301
|
+
## 当前工程已支持的小写标签
|
|
289
302
|
|
|
290
|
-
|
|
303
|
+
以下标签在当前项目中可以直接写入 JSX,由 loader 自动映射到组件库导出:
|
|
291
304
|
|
|
292
|
-
|
|
|
305
|
+
| 标签 | 说明 |
|
|
293
306
|
|------|------|
|
|
294
|
-
| `<map>`
|
|
295
|
-
| `<
|
|
307
|
+
| `<map>` / `<map-marker>` | 地图与标注点 |
|
|
308
|
+
| `<movable-area>` / `<movable-view>` | 拖拽与缩放容器 |
|
|
309
|
+
| `<picker-view>` / `<picker-column>` | 多列滚动选择器 |
|
|
310
|
+
| `<radio>` / `<radio-group>` | 单选组件 |
|
|
311
|
+
| `<swiper>` / `<swiper-item>` | 轮播组件 |
|
|
312
|
+
| `<web-view>` | WebView 容器 |
|
|
296
313
|
| `<svg>` | SVG 图形,支持标准 SVG 子元素(`<path>`, `<rect>`, `<circle>` 等) |
|
|
297
314
|
|
|
298
315
|
---
|
|
@@ -301,9 +318,7 @@ import { navigateTo } from '@doubao-apps/framework/api';
|
|
|
301
318
|
|
|
302
319
|
| 微信小程序组件 | 处理方案 |
|
|
303
320
|
|--------------|---------|
|
|
304
|
-
| `<web-view>` | 不支持,移除或使用原生 WebView API |
|
|
305
321
|
| `<canvas>` | 有限支持,检查文档 |
|
|
306
322
|
| `<open-data>` | 不支持,使用平台用户信息 API |
|
|
307
323
|
| `<official-account>` | 不支持 |
|
|
308
324
|
| `<ad>` | 不支持 |
|
|
309
|
-
|