@doubao-dev/plugin-app-dev 0.0.0-stage → 0.0.40-canary-dea0ddc73-20261026073950

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.
Files changed (107) hide show
  1. package/README.md +10 -2
  2. package/dist/147.js +9 -0
  3. package/dist/assets.d.ts +5 -0
  4. package/dist/assets.js +4 -0
  5. package/dist/index.d.ts +43 -0
  6. package/dist/index.js +1378 -0
  7. package/dist/plugin.d.ts +102 -0
  8. package/dist/plugin.js +4995 -0
  9. package/dist/preview.js +16 -0
  10. package/dist/rslib-runtime.js +33 -0
  11. package/dist/skills/doubao-plugin-app/SKILL.md +21 -0
  12. package/dist/skills/doubao-plugin-app/references/app-development.md +85 -0
  13. package/dist/skills/doubao-plugin-app/references/frontend/components/container-overlay.md +131 -0
  14. package/dist/skills/doubao-plugin-app/references/frontend/components/form-controls.md +146 -0
  15. package/dist/skills/doubao-plugin-app/references/frontend/components/interactive-controls.md +120 -0
  16. package/dist/skills/doubao-plugin-app/references/frontend/components/map-canvas.md +107 -0
  17. package/dist/skills/doubao-plugin-app/references/frontend/components/overview.md +43 -0
  18. package/dist/skills/doubao-plugin-app/references/frontend/components/scroll-list.md +149 -0
  19. package/dist/skills/doubao-plugin-app/references/frontend/components/text-media.md +209 -0
  20. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/01-/345/237/272/347/241/200.md +1389 -0
  21. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/02-/347/263/273/347/273/237.md +1376 -0
  22. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/03-/350/207/252/345/256/232/344/271/211/351/200/232/344/277/241.md +127 -0
  23. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/04-/345/256/232/344/275/215.md +784 -0
  24. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/05-/345/255/230/345/202/250.md +1176 -0
  25. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/06-/350/267/257/347/224/261.md +839 -0
  26. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/07-/347/225/214/351/235/242.md +376 -0
  27. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/08-/344/272/244/344/272/222.md +1319 -0
  28. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/09-/350/276/223/345/205/245.md +192 -0
  29. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/10-/347/275/221/347/273/234.md +900 -0
  30. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/11-/345/252/222/344/275/223.md +1496 -0
  31. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/12-/344/270/232/345/212/241/350/203/275/345/212/233.md +1281 -0
  32. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/13-/347/231/273/345/275/225.md +511 -0
  33. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/14-/346/224/257/344/273/230.md +943 -0
  34. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/15-/346/225/260/346/215/256/345/210/206/346/236/220.md +124 -0
  35. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/16-/350/223/235/347/211/231.md +3364 -0
  36. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/17-wi-fi.md +1028 -0
  37. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/18-/345/212/240/351/200/237/345/272/246/350/256/241.md +354 -0
  38. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/19-ibeacon.md +508 -0
  39. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/20-/347/275/227/347/233/230.md +320 -0
  40. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/21-/350/256/276/345/244/207/346/226/271/345/220/221.md +351 -0
  41. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/22-/351/231/200/350/236/272/344/273/252.md +354 -0
  42. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/23-/345/252/222/344/275/223-/350/256/276/345/244/207-/347/275/221/347/273/234.md +264 -0
  43. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/24-/347/237/255/344/277/241.md +155 -0
  44. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/25-/346/227/240/351/232/234/347/242/215.md +144 -0
  45. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/26-/345/237/272/347/241/200/344/277/241/346/201/257.md +238 -0
  46. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/27-/347/224/265/346/261/240.md +235 -0
  47. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/28-/345/211/252/350/264/264/346/235/277.md +303 -0
  48. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/29-/345/212/240/345/257/206.md +126 -0
  49. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/30-/346/227/245/345/216/206.md +417 -0
  50. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/31-/347/224/265/350/257/235.md +144 -0
  51. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/32-/346/211/253/347/240/201.md +236 -0
  52. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/33-/345/261/217/345/271/225.md +747 -0
  53. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/34-/351/234/207/345/212/250.md +277 -0
  54. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/35-/346/226/207/344/273/266/347/263/273/347/273/237.md +431 -0
  55. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/common-errors.md +69 -0
  56. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/groups.md +43 -0
  57. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/quick-reference.md +436 -0
  58. package/dist/skills/doubao-plugin-app/references/frontend/examples/common-patterns.md +590 -0
  59. package/dist/skills/doubao-plugin-app/references/frontend/examples/doubao-agentic-service-api-recipes.md +209 -0
  60. package/dist/skills/doubao-plugin-app/references/frontend/examples/page-widget-basics.md +368 -0
  61. package/dist/skills/doubao-plugin-app/references/frontend/examples/page-widget-recipes.md +65 -0
  62. package/dist/skills/doubao-plugin-app/references/frontend/framework/core.md +283 -0
  63. package/dist/skills/doubao-plugin-app/references/frontend/guides/auth.md +277 -0
  64. package/dist/skills/doubao-plugin-app/references/frontend/guides/best-practices.md +574 -0
  65. package/dist/skills/doubao-plugin-app/references/frontend/guides/client-tools-and-events.md +209 -0
  66. package/dist/skills/doubao-plugin-app/references/frontend/guides/component-development.md +832 -0
  67. package/dist/skills/doubao-plugin-app/references/frontend/guides/debugger-mcp.md +537 -0
  68. package/dist/skills/doubao-plugin-app/references/frontend/guides/expired-widget.md +101 -0
  69. package/dist/skills/doubao-plugin-app/references/frontend/guides/performance-optimization.md +417 -0
  70. package/dist/skills/doubao-plugin-app/references/frontend/guides/troubleshooting.md +278 -0
  71. package/dist/skills/doubao-plugin-app/references/frontend/lynx/best-practices.md +720 -0
  72. package/dist/skills/doubao-plugin-app/references/frontend/lynx/css/pseudo-classes.md +149 -0
  73. package/dist/skills/doubao-plugin-app/references/frontend/lynx/css/selectors.md +224 -0
  74. package/dist/skills/doubao-plugin-app/references/frontend/lynx/css/supported-properties.md +269 -0
  75. package/dist/skills/doubao-plugin-app/references/frontend/lynx/css/values-and-units.md +314 -0
  76. package/dist/skills/doubao-plugin-app/references/frontend/lynx/layout/flex-layout.md +334 -0
  77. package/dist/skills/doubao-plugin-app/references/frontend/lynx/layout/grid-layout.md +408 -0
  78. package/dist/skills/doubao-plugin-app/references/frontend/lynx/layout/linear-layout.md +355 -0
  79. package/dist/skills/doubao-plugin-app/references/frontend/lynx/layout/relative-layout.md +189 -0
  80. package/dist/skills/doubao-plugin-app/references/frontend/lynx/lynx-vs-web/css-differences.md +737 -0
  81. package/dist/skills/doubao-plugin-app/references/frontend/lynx/lynx-vs-web/migration-guide.md +669 -0
  82. package/dist/skills/doubao-plugin-app/references/frontend/lynx/lynx-vs-web/unsupported-features.md +290 -0
  83. package/dist/skills/doubao-plugin-app/references/frontend/lynx/overview.md +60 -0
  84. package/dist/skills/doubao-plugin-app/references/frontend/lynx/patterns/animation.md +243 -0
  85. package/dist/skills/doubao-plugin-app/references/frontend/lynx/patterns/responsive.md +194 -0
  86. package/dist/skills/doubao-plugin-app/references/frontend/lynx/patterns/theming.md +143 -0
  87. package/dist/skills/doubao-plugin-app/references/frontend/lynx/quick-reference.md +229 -0
  88. package/dist/skills/doubao-plugin-app/references/frontend/rules/dos-and-donts.md +479 -0
  89. package/dist/skills/doubao-plugin-app/references/frontend/widget-templates/design-boundary.md +46 -0
  90. package/dist/skills/doubao-plugin-app/references/frontend/widget-templates/overview.md +118 -0
  91. package/dist/skills/doubao-plugin-app/references/frontend/widget-templates/props.md +301 -0
  92. package/dist/skills/doubao-plugin-app/references/mcp-and-cards.md +38 -0
  93. package/dist/templates/README.md.template +11 -0
  94. package/dist/templates/com.doubao/app/manifest.yaml +41 -0
  95. package/dist/templates/com.doubao/app/package.json.template +13 -0
  96. package/dist/templates/com.doubao/app/src/app.config.ts.template +5 -0
  97. package/dist/templates/com.doubao/app/src/app.ts.template +3 -0
  98. package/dist/templates/com.doubao/app/src/pages/home/index.css +14 -0
  99. package/dist/templates/com.doubao/app/src/pages/home/index.tsx.template +14 -0
  100. package/dist/templates/com.doubao/app/src/widgets/example/index.tsx.template +29 -0
  101. package/dist/templates/com.doubao/app/tsconfig.json +19 -0
  102. package/dist/templates/mcp.json +9 -0
  103. package/dist/templates/plugin.json.template +29 -0
  104. package/dist/templates/skills/example/SKILL.md.template +14 -0
  105. package/dist/upload.d.ts +44 -0
  106. package/dist/upload.js +38 -0
  107. package/package.json +60 -3
@@ -0,0 +1,720 @@
1
+ # Lynx 前端开发最佳实践
2
+
3
+ ## 性能优化
4
+
5
+ ### 布局性能
6
+
7
+ #### 1. 选择合适的布局类型
8
+
9
+ ```css
10
+ /* ✅ 简单列表使用 Linear(性能最好) */
11
+ .simple-list {
12
+ /* 默认就是 linear,无需设置 display */
13
+ padding: 16px;
14
+ }
15
+
16
+ /* ✅ 复杂弹性布局使用 Flex */
17
+ .complex-layout {
18
+ display: flex;
19
+ flex-direction: row;
20
+ justify-content: space-between;
21
+ }
22
+
23
+ /* ❌ 避免在简单场景使用 Flex */
24
+ .simple-column {
25
+ display: flex;
26
+ flex-direction: column; /* 不如直接用 Linear */
27
+ }
28
+ ```
29
+
30
+ #### 2. 减少布局层级
31
+
32
+ ```jsx
33
+ // ❌ 层级过多
34
+ <view className="wrapper">
35
+ <view className="container">
36
+ <view className="inner">
37
+ <view className="content">
38
+ <text>内容</text>
39
+ </view>
40
+ </view>
41
+ </view>
42
+ </view>
43
+
44
+ // ✅ 扁平化结构
45
+ <view className="content">
46
+ <text>内容</text>
47
+ </view>
48
+ ```
49
+
50
+ #### 3. 避免动态改变布局类型
51
+
52
+ ```jsx
53
+ // ❌ 避免在运行时切换 display 类型
54
+ const [isGrid, setIsGrid] = useState(false);
55
+
56
+ <view style={{ display: isGrid ? 'grid' : 'flex' }}>
57
+ {/* 内容 */}
58
+ </view>
59
+
60
+ // ✅ 使用 opacity 或 transform 替代
61
+ <view className="flex-container">
62
+ <view className="flex-view" style={{ opacity: isGrid ? 0 : 1 }} />
63
+ <view className="grid-view" style={{ opacity: isGrid ? 1 : 0 }} />
64
+ </view>
65
+ ```
66
+
67
+ ### 样式计算优化
68
+
69
+ #### 4. 使用 CSS 类而非内联样式
70
+
71
+ ```jsx
72
+ // ❌ 内联样式每次渲染都重新计算
73
+ <view style={{
74
+ width: 100,
75
+ height: 200,
76
+ backgroundColor: '#fff'
77
+ }} />
78
+
79
+ // ✅ CSS 类只解析一次
80
+ <view className="card" />
81
+ ```
82
+
83
+ ```css
84
+ .card {
85
+ width: 100px;
86
+ height: 200px;
87
+ background-color: #fff;
88
+ }
89
+ ```
90
+
91
+ #### 5. 避免复杂的 CSS 选择器
92
+
93
+ ```css
94
+ /* ❌ 复杂选择器增加匹配开销 */
95
+ .container > .wrapper .item:nth-child(2n + 1) .content {
96
+ color: red;
97
+ }
98
+
99
+ /* ✅ 使用简单类选择器 */
100
+ .item-odd {
101
+ color: red;
102
+ }
103
+ ```
104
+
105
+ #### 6. GPU 加速优化
106
+
107
+ ```css
108
+ /* ✅ 使用 transform 和 opacity 实现自动 GPU 加速 */
109
+ .animated-element {
110
+ transition: transform 0.3s ease, opacity 0.3s ease;
111
+ }
112
+
113
+ /* ✅ 动画结束后无需手动清理,Lynx 自动管理 */
114
+ ```
115
+
116
+ > **注意**:Lynx 会自动对 `transform` 和 `opacity` 属性启用 GPU 加速,无需手动声明。
117
+
118
+ ### 渲染优化
119
+
120
+ #### 7. 图片优化
121
+
122
+ ```css
123
+ /* ✅ 指定图片尺寸,避免布局抖动 */
124
+ .product-image {
125
+ width: 200px;
126
+ height: 200px;
127
+ /* 或者只设置一边,保持比例 */
128
+ width: 100%;
129
+ aspect-ratio: 16 / 9;
130
+ }
131
+ ```
132
+
133
+ ```jsx
134
+ // ✅ 使用懒加载
135
+ <list>
136
+ {items.map((item) => (
137
+ <list-item key={item.id}>
138
+ <image src={item.image} lazy-load={true} placeholder="placeholder.png" />
139
+ </list-item>
140
+ ))}
141
+ </list>
142
+ ```
143
+
144
+ #### 8. 列表优化
145
+
146
+ ```jsx
147
+ // ✅ 使用 list 组件替代 scroll-view + 多个 view
148
+ <list className="item-list" scroll-y>
149
+ {items.map((item) => (
150
+ <list-item key={item.id} item-key={item.id}>
151
+ <view className="item">
152
+ <text>{item.title}</text>
153
+ </view>
154
+ </list-item>
155
+ ))}
156
+ </list>
157
+ ```
158
+
159
+ ```css
160
+ /* ✅ 为 list-item 设置固定高度(如果可以) */
161
+ list-item {
162
+ height: 80px;
163
+ }
164
+ ```
165
+
166
+ #### 9. 控制同时渲染的元素数量
167
+
168
+ ```jsx
169
+ // ❌ 一次渲染太多元素
170
+ {
171
+ items.map((item) => <HeavyComponent key={item.id} data={item} />);
172
+ }
173
+
174
+ // ✅ 分页或虚拟列表
175
+ <list>
176
+ {visibleItems.map((item) => (
177
+ <list-item key={item.id}>
178
+ <HeavyComponent data={item} />
179
+ </list-item>
180
+ ))}
181
+ </list>;
182
+ ```
183
+
184
+ ## 布局最佳实践
185
+
186
+ ### Flex 布局模式
187
+
188
+ #### 10. 响应式布局
189
+
190
+ ```css
191
+ /* 移动端/默认 */
192
+ .container {
193
+ display: flex;
194
+ flex-direction: column;
195
+ }
196
+
197
+ /* 注意:Lynx 不支持 @media,请使用 JavaScript 动态调整或视口单位 */
198
+ /* JavaScript: if (viewportWidth >= 768) { setLayout('row') } */
199
+ ```
200
+
201
+ #### 11. 弹性项比例
202
+
203
+ ```css
204
+ /* ✅ 使用 flex 简写 */
205
+ .item {
206
+ flex: 1; /* flex-grow: 1, flex-shrink: 1, flex-basis: 0% */
207
+ }
208
+
209
+ .item-large {
210
+ flex: 2; /* 占据两倍空间 */
211
+ }
212
+
213
+ /* ❌ 不推荐单独设置 */
214
+ .item {
215
+ flex-grow: 1;
216
+ flex-shrink: 1;
217
+ /* 缺少 flex-basis 可能导致意外行为 */
218
+ }
219
+ ```
220
+
221
+ #### 12. 间距处理
222
+
223
+ ```css
224
+ /* ✅ 使用 gap 属性 */
225
+ .grid {
226
+ display: flex;
227
+ flex-wrap: wrap;
228
+ gap: 16px;
229
+ }
230
+
231
+ /* 传统方式(需要处理边距) */
232
+ .grid-item {
233
+ width: calc(33.33% - 11px);
234
+ margin-right: 16px;
235
+ margin-bottom: 16px;
236
+ }
237
+
238
+ .grid-item:nth-child(3n) {
239
+ margin-right: 0;
240
+ }
241
+ ```
242
+
243
+ ### Grid 布局模式
244
+
245
+ **注意**:Lynx **不支持** `@media` 媒体查询。
246
+
247
+ ## 样式组织
248
+
249
+ ### CSS 架构
250
+
251
+ #### 15. BEM 命名约定
252
+
253
+ ```css
254
+ /* Block */
255
+ .card {
256
+ }
257
+
258
+ /* Element */
259
+ .card__title {
260
+ }
261
+ .card__content {
262
+ }
263
+ .card__button {
264
+ }
265
+
266
+ /* Modifier */
267
+ .card--featured {
268
+ }
269
+ .card__button--primary {
270
+ }
271
+ .card__button--disabled {
272
+ }
273
+ ```
274
+
275
+ #### 16. CSS 变量(主题系统)
276
+
277
+ 完整的主题变量(颜色、间距、字体、圆角、阴影)及暗色主题切换示例见 `patterns/theming.md`。使用 CSS 变量管理主题有以下建议:
278
+
279
+ - **命名规范**: `--category-property` 格式(如 `--color-primary`)
280
+ - **分层定义**: 颜色、间距、字体分开定义
281
+ - **语义化**: 使用 `--color-primary` 而非 `--color-red`
282
+ - **默认值**: 提供 fallback: `var(--prop, default)`
283
+
284
+ #### 17. 组件样式隔离
285
+
286
+ ```css
287
+ /* 每个组件独立文件 */
288
+ /* Button.css */
289
+ .button {
290
+ display: flex;
291
+ align-items: center;
292
+ justify-content: center;
293
+ padding: 12px 24px;
294
+ }
295
+
296
+ /* Card.css */
297
+ .card {
298
+ display: flex;
299
+ flex-direction: column;
300
+ padding: 16px;
301
+ }
302
+
303
+ /* 避免全局污染 */
304
+ /* ❌ 不推荐 */
305
+ view {
306
+ box-sizing: border-box;
307
+ }
308
+
309
+ /* ✅ 使用类选择器 */
310
+ .reset-box {
311
+ box-sizing: border-box;
312
+ }
313
+ ```
314
+
315
+ ## 响应式设计
316
+
317
+ ### 适配策略
318
+
319
+ #### 18. 使用 rem + vw 适配(推荐)
320
+
321
+ > **推荐方案**:使用 `rem` 配合 `vw` 设置根字体大小,实现响应式适配。
322
+
323
+ ```css
324
+ /* 在根元素设置基准字体大小 */
325
+ page {
326
+ font-size: calc(100vw / 23.4375); /* 1rem = 16px @ 375px 宽度 */
327
+ }
328
+
329
+ /* 使用 rem 进行屏幕适配 */
330
+ .container {
331
+ width: 100%; /* 全宽 */
332
+ padding: 2rem; /* 左右各 2rem ≈ 32px @ 375px */
333
+ }
334
+
335
+ .card {
336
+ width: 21.4rem; /* 约一半宽度,减去间距 */
337
+ margin-bottom: 1.5rem;
338
+ }
339
+ ```
340
+
341
+ **rpx 说明**:`rpx` 是 Lynx 特有单位,功能完整且自动适配屏幕宽度,但缺乏 Web 兼容性。使用 `rem` + `vw` 是更标准的跨平台响应式方案。
342
+
343
+ #### 19. 安全区域适配
344
+
345
+ ```css
346
+ /* iPhone 刘海屏适配 */
347
+ .safe-area {
348
+ padding-top: env(safe-area-inset-top);
349
+ padding-bottom: env(safe-area-inset-bottom);
350
+ }
351
+
352
+ /* 底部固定按钮 */
353
+ .fixed-bottom {
354
+ position: fixed;
355
+ bottom: 0;
356
+ left: 0;
357
+ right: 0;
358
+ padding-bottom: env(safe-area-inset-bottom);
359
+ background-color: #fff;
360
+ }
361
+ ```
362
+
363
+ #### 20. 字体适配
364
+
365
+ ⚠️ **注意**:Lynx **不支持** `@media`,请使用以下替代方案:
366
+
367
+ **方案 1:使用 rem(推荐)**
368
+
369
+ ```css
370
+ /* 在根元素设置基准字体大小 */
371
+ page {
372
+ font-size: calc(100vw / 23.4375); /* 1rem = 16px @ 375px 宽度 */
373
+ }
374
+
375
+ /* 使用 rem 自动适配 */
376
+ .title {
377
+ font-size: 1.125rem; /* 约 18px @ 375px 屏幕 */
378
+ }
379
+
380
+ .body {
381
+ font-size: 0.875rem; /* 约 14px @ 375px 屏幕 */
382
+ }
383
+ ```
384
+
385
+ **方案 2:使用 vw 直接设置**
386
+
387
+ ```css
388
+ /* 直接使用 vw */
389
+ .title {
390
+ font-size: 4.8vw; /* 约 18px @ 375px 屏幕 */
391
+ }
392
+
393
+ .body {
394
+ font-size: 3.73vw; /* 约 14px @ 375px 屏幕 */
395
+ }
396
+ ```
397
+
398
+ **方案 3:使用 JavaScript 动态调整**
399
+
400
+ ```javascript
401
+ // 根据屏幕宽度动态计算字体大小
402
+ const baseFontSize = viewportWidth >= 768 ? 18 : 16;
403
+ // 设置根元素字体大小
404
+ ```
405
+
406
+ ## 动画与过渡
407
+
408
+ ### 性能优先的动画
409
+
410
+ #### 21. 使用 transform 和 opacity
411
+
412
+ ```css
413
+ /* ✅ 性能友好的属性 */
414
+ .animated {
415
+ transition: transform 0.3s ease, opacity 0.3s ease;
416
+ }
417
+
418
+ .animated:hover {
419
+ transform: scale(1.1);
420
+ opacity: 0.8;
421
+ }
422
+
423
+ /* ❌ 避免动画这些属性 */
424
+ .animated-bad {
425
+ transition: width 0.3s, height 0.3s, margin 0.3s;
426
+ }
427
+ ```
428
+
429
+ #### 22. 硬件加速
430
+
431
+ ```css
432
+ /* 启用 GPU 加速 */
433
+ .gpu-accelerated {
434
+ transform: translateZ(0);
435
+ /* 或 */
436
+ transform: translate3d(0, 0, 0);
437
+ }
438
+ ```
439
+
440
+ #### 23. 关键帧动画
441
+
442
+ ```css
443
+ @keyframes slideIn {
444
+ from {
445
+ transform: translateX(100%);
446
+ opacity: 0;
447
+ }
448
+ to {
449
+ transform: translateX(0);
450
+ opacity: 1;
451
+ }
452
+ }
453
+
454
+ .slide-in {
455
+ animation: slideIn 0.3s ease-out;
456
+ }
457
+ ```
458
+
459
+ ## 可访问性
460
+
461
+ #### 24. 足够的触摸目标
462
+
463
+ ```css
464
+ /* ✅ 最小 44x44 触摸区域 */
465
+ .button {
466
+ min-width: 44px;
467
+ min-height: 44px;
468
+ padding: 12px 24px;
469
+ }
470
+ ```
471
+
472
+ #### 25. 颜色对比度
473
+
474
+ ```css
475
+ /* ✅ 确保足够的对比度 */
476
+ .text-primary {
477
+ color: #333333; /* 在白色背景上对比度 12.6:1 */
478
+ }
479
+
480
+ .text-secondary {
481
+ color: #666666; /* 对比度 5.7:1 */
482
+ }
483
+
484
+ /* ❌ 对比度不足 */
485
+ .text-weak {
486
+ color: #cccccc; /* 对比度 1.9:1,难以阅读 */
487
+ }
488
+ ```
489
+
490
+ ## 调试技巧
491
+
492
+ 调试用的 CSS 代码片段请参考 `quick-reference.md`。
493
+
494
+ #### 27. 性能监控
495
+
496
+ ```jsx
497
+ // 测量渲染性能
498
+ import { useEffect, useRef } from '@lynx-js/react';
499
+
500
+ function PerformanceMonitor({ children }) {
501
+ const startTime = useRef(performance.now());
502
+
503
+ useEffect(() => {
504
+ const endTime = performance.now();
505
+ console.log(`Render time: ${endTime - startTime.current}ms`);
506
+ });
507
+
508
+ return children;
509
+ }
510
+ ```
511
+
512
+ ## 常见陷阱与解决方案
513
+
514
+ ### 陷阱 1:Text 不换行
515
+
516
+ ```css
517
+ /* 问题:Text 默认不换行 */
518
+ text {
519
+ /* 默认 white-space: nowrap */
520
+ }
521
+
522
+ /* 解决 */
523
+ text {
524
+ white-space: normal;
525
+ /* 或 */
526
+ max-width: 200px;
527
+ white-space: nowrap;
528
+ text-overflow: ellipsis;
529
+ overflow: hidden;
530
+ }
531
+ ```
532
+
533
+ ### 陷阱 2:图片不显示
534
+
535
+ ```css
536
+ /* 问题:Image 必须设置尺寸 */
537
+ image {
538
+ /* 没有尺寸不会显示 */
539
+ }
540
+
541
+ /* 解决 */
542
+ image {
543
+ width: 100%;
544
+ height: auto;
545
+ aspect-ratio: 16 / 9;
546
+ /* 或固定尺寸 */
547
+ width: 200px;
548
+ height: 200px;
549
+ }
550
+ ```
551
+
552
+ ### 陷阱 3:Flex 子元素被压缩
553
+
554
+ ```css
555
+ /* 问题:子元素被压缩到 0 */
556
+ .flex-container {
557
+ display: flex;
558
+ }
559
+
560
+ .flex-item {
561
+ /* 可能被压缩 */
562
+ }
563
+
564
+ /* 解决 */
565
+ .flex-item {
566
+ flex-shrink: 0; /* 不压缩 */
567
+ /* 或 */
568
+ min-width: 0; /* 允许压缩 */
569
+ overflow: hidden; /* 配合 ellipsis */
570
+ }
571
+ ```
572
+
573
+ ### 陷阱 3 补充:内容项在 Lynx 和 Web 的主轴收缩下限不同
574
+
575
+ ```css
576
+ /* row 方向宽度不足,或 column 方向高度不足时,Lynx 可能继续压缩内容项 */
577
+ .row {
578
+ display: flex;
579
+ width: 80px;
580
+ }
581
+
582
+ .row .content-item {
583
+ width: 120px;
584
+ flex-shrink: 1;
585
+ }
586
+
587
+ .column {
588
+ display: flex;
589
+ flex-direction: column;
590
+ height: 80px;
591
+ }
592
+
593
+ .column .content-item {
594
+ height: 120px;
595
+ flex-shrink: 1;
596
+ }
597
+ ```
598
+
599
+ ```css
600
+ /* Web 预览页:取消主轴方向自动最小尺寸,贴近 Lynx 表现 */
601
+ .row .content-item {
602
+ min-width: 0;
603
+ }
604
+
605
+ .column .content-item {
606
+ min-height: 0;
607
+ }
608
+
609
+ /* Lynx:如果希望内容项不要被压缩,显式保护它 */
610
+ .content-item {
611
+ flex-shrink: 0;
612
+ /* 或设置主轴方向明确的 min-width / min-height */
613
+ }
614
+ ```
615
+
616
+ ### 陷阱 4:Sticky 不生效
617
+
618
+ ```css
619
+ /* 问题:Sticky 需要正确的父容器 */
620
+ .container {
621
+ /* 没有设置高度 */
622
+ }
623
+
624
+ .sticky-element {
625
+ position: sticky;
626
+ top: 0;
627
+ }
628
+
629
+ /* 解决 */
630
+ .container {
631
+ height: 100vh; /* 或固定高度 */
632
+ overflow: scroll; /* 需要滚动 */
633
+ }
634
+
635
+ .sticky-element {
636
+ position: sticky;
637
+ top: 0;
638
+ z-index: 10; /* 确保在最上层 */
639
+ }
640
+ ```
641
+
642
+ ### Trap 5: z-index Causes Scroll Not to Follow
643
+
644
+ ```css
645
+ /* Problem: In fold-view/scroll-view, child elements with z-index don't follow scroll */
646
+ fold-view-header .overlay {
647
+ position: absolute;
648
+ z-index: 100; /* Promoted to compositing layer, stays fixed in viewport during scroll */
649
+ }
650
+
651
+ /* Solution: Add z-index to parent container to establish the same stacking context */
652
+ fold-view-header {
653
+ position: relative;
654
+ z-index: 0; /* Key: Make header a stacking context */
655
+ }
656
+
657
+ fold-view-header .overlay {
658
+ position: absolute;
659
+ z-index: 100; /* Now correctly follows fold-view-header scroll */
660
+ }
661
+ ```
662
+
663
+ **Other Solutions**:
664
+
665
+ ```css
666
+ /* Option 1: Remove unnecessary z-index */
667
+ .header-item {
668
+ /* No longer set z-index, control hierarchy via DOM order */
669
+ }
670
+
671
+ /* Option 2: Move z-index up to the container */
672
+ fold-view-header {
673
+ position: relative;
674
+ z-index: 10; /* Control hierarchy at container level */
675
+ }
676
+
677
+ /* Option 3: For Android platform use android-header-over-slot */
678
+ /* <fold-view android-header-over-slot={true}> */
679
+ ```
680
+
681
+ ### 陷阱 6:百分比高度不生效
682
+
683
+ ```css
684
+ /* 问题:百分比高度需要父元素有高度 */
685
+ .parent {
686
+ /* 没有高度 */
687
+ }
688
+
689
+ .child {
690
+ height: 50%; /* 不生效 */
691
+ }
692
+
693
+ /* 解决 */
694
+ .parent {
695
+ height: 400px; /* 或 */
696
+ display: flex;
697
+ flex-direction: column;
698
+ }
699
+
700
+ .child {
701
+ height: 50%;
702
+ /* 或 Flex 方式 */
703
+ flex: 1;
704
+ }
705
+ ```
706
+
707
+ ## 代码检查清单
708
+
709
+ 在提交代码前,检查以下项目:
710
+
711
+ - [ ] 使用了合适的布局类型(Linear/Flex/Grid/Relative)
712
+ - [ ] 避免过深的嵌套层级(建议不超过 5 层)
713
+ - [ ] 图片设置了明确的尺寸
714
+ - [ ] 文本内容放在 Text 组件中
715
+ - [ ] 使用了 CSS 类而非大量内联样式
716
+ - [ ] 动画使用了 transform 和 opacity
717
+ - [ ] 列表使用了 list 组件
718
+ - [ ] 触摸目标足够大(最小 44x44)
719
+ - [ ] 颜色对比度足够
720
+ - [ ] 在真机上测试过性能