# H5 → 微信小程序迁移实施指南 > 本文档是"规则化迁移 + AI 辅助 + 视觉验收"的完整实施方案。 > 适用于将 `docs/h5_ui/pages/*.html`(Tailwind CSS + 原生 JS)迁移为原生微信小程序页面。 > 试点页面:`notes`(备注记录)— 中低复杂度,验证流程可行性。 --- ## 一、核心原则 **这是迁移工程,不是生成工程。** - 规则先行:标签映射、样式换算、事件转换有明确规则表,AI 按规则执行 - 原型忠实:H5 源码 + computed-styles + 截图是唯一视觉真相,不凭想象 - 组件化承接:TDesign 组件优先,自定义组件按 design.md 接口定义 - 视觉回归兜底:每个页面转换后必须与 H5 截图逐项对比 - 增量验证:一个页面走完全流程再推进下一个 --- ## 二、迁移流水线(6 步) ``` ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ Step 1 │ │ Step 2 │ │ Step 3 │ │ 输入物冻结 │───▶│ 迁移审计 │───▶│ 规则化转换 │ │ (HTML/CSS/ │ │ (风险点+ │ │ (标签/样式/ │ │ 截图/交互) │ │ 替代方案) │ │ 事件/路由) │ └─────────────┘ └─────────────┘ └─────────────┘ │ ┌─────────────┐ ┌─────────────┐ ▼ │ Step 6 │ │ Step 5 │ ┌─────────────┐ │ 验收签收 │◀───│ 差异修复 │◀───│ Step 4 │ │ (通过/打回) │ │ (截图diff+ │ │ 编译验证 │ │ │ │ 定点修复) │ │ (开发者工具) │ └─────────────┘ └─────────────┘ └─────────────┘ ``` --- ## 三、Step 1:输入物冻结 每个页面转换前,AI 必须加载以下材料(缺一不可): | 序号 | 材料 | 路径 | 作用 | |------|------|------|------| | 1 | H5 源码 | `docs/h5_ui/pages/.html` | 结构与样式的唯一真相 | | 2 | 自定义 CSS | `docs/h5_ui/css/.css`(如有) | 非 Tailwind 的自定义样式 | | 3 | 交互说明 | `docs/h5_ui/interactions/.md` | 状态变量、操作响应、页面状态枚举 | | 4 | 设计 Token | `docs/h5_ui/design-tokens.json` | 颜色、间距、圆角、字号、阴影 | | 5 | 图标映射表 | `docs/h5_ui/icon-mapping.md` | 图标处理方案(TDesign/自定义/Emoji) | | 6 | 计算样式 | `docs/h5_ui/computed-styles.json` 中对应 key | 精确的 px 数值(如有) | | 7 | 截图 | `docs/h5_ui/screenshots/--*.png` | 视觉校验基线 | | 8 | 转换规范 | `.kiro/steering/miniprogram-h5-conversion.md` | 强制规则 | | 9 | 避坑指南 | `apps/miniprogram/doc/h5-to-miniprogram-pitfalls.md` | 22 个高频坑点 | ### 加载顺序 ``` 1. 转换规范 + 避坑指南(规则层) 2. 设计 Token + 图标映射(全局资源层) 3. H5 源码 + 自定义 CSS + 计算样式(页面源码层) 4. 交互说明(行为层) 5. 截图(视觉校验层) ``` --- ## 四、Step 2:迁移审计 读取 H5 源码后,先输出《迁移审计报告》,不写代码。 ### 审计清单 | 审计项 | 输出内容 | |--------|---------| | A. 页面结构 | 主要区域划分(header/list/card/footer),组件化边界建议 | | B. CSS 风险点 | 不支持的 CSS 特性清单 + 替代方案(伪元素、backdrop-filter、clip-path 等) | | C. Tailwind 展开 | 关键元素的 Tailwind 类 → WXSS 属性映射(取 computed-styles 精确值) | | D. SVG/图标 | 内联 SVG 清单 + 处理方式(TDesign/导出图片/Emoji) | | E. JS 交互 | DOM 操作 → setData 映射表 | | F. 外部依赖 | CDN 资源(Tailwind/Google Fonts)的本地化方案 | | G. 缺失信息 | 需要用户补充的材料清单 | ### 审计报告格式 ```markdown ## 迁移审计报告 ### A. 页面结构 - 顶部导航栏(sticky,含返回按钮 + 标题) - Tab 切换区(客户备注 / 助教备注) - 备注列表(wx:for 渲染,每条含文本 + 标签 + 时间) ### B. CSS 风险点 | 风险点 | 原因 | 影响 | 替代方案 | 验收方式 | |--------|------|------|---------|---------| | ... | ... | ... | ... | ... | ### C. 关键样式映射 | 元素 | Tailwind 类 | computed 值 | WXSS | |------|------------|-------------|------| | 备注卡片 | bg-white rounded-2xl p-4 shadow-sm | ... | ... | ### D. 图标处理 | 图标 | H5 实现 | 小程序方案 | |------|---------|-----------| | 返回箭头 | 内联 SVG | | ### E. 交互映射 | H5 操作 | DOM 实现 | 小程序实现 | |---------|---------|-----------| | Tab 切换 | classList.toggle | setData({ activeTab }) + wx:if | ### F. 外部依赖 - Tailwind CDN → 手写 WXSS - Google Fonts → 系统字体(-apple-system) ### G. 缺失信息 - (列出需要用户补充的内容) ``` 用户确认审计报告后,才进入 Step 3。 --- ## 五、Step 3:规则化转换 ### 5.0 SVG 导出规则(强制,在转换前执行) H5 原型中所有内联 `` 必须单独导出为 `.svg` 文件,小程序中通过 `` + `` 引用。 #### 规则 1. 扫描目标页面 H5 源码中的所有 `` 标签 2. 每个 SVG 导出为独立文件,存放路径:`apps/miniprogram/miniprogram/assets/icons/.svg` 3. 命名规则:`icon-<用途>.svg`(如 `icon-wechat.svg`、`icon-clipboard.svg`);Logo 类用 `logo-<名称>.svg` 4. 导出时保留原始 `viewBox`、`fill`、`path` 等属性,确保渲染一致 5. 小程序中引用方式:``,必须指定宽高 6. 如果 TDesign 图标库有语义等价的图标(如返回箭头 → `chevron-left`),优先用 ``,不导出 SVG 7. 审计报告的「D. 图标处理」栏必须列出每个 SVG 的处理决策(TDesign / 导出 SVG / Emoji) #### 为什么不用 TDesign icon 属性 TDesign `` 的 `icon` 属性只支持 TDesign 内置图标名。微信 logo 等第三方品牌图标不在 TDesign 图标库中,传入无效名称会导致图标不显示。因此品牌图标、复杂自定义图标一律导出 SVG 文件,用 `` 引用。 #### 已导出清单 | 文件名 | 来源页面 | 说明 | |--------|---------|------| | `logo-billiard.svg` | login | 台球 Logo(已有) | | `icon-wechat.svg` | login | 微信品牌图标 | | `icon-clock-circle.svg` | reviewing | 时钟主图标(stroke 风格,TDesign 无等价) | | `icon-forbidden.svg` | no-permission | 禁止符号主图标(stroke 风格,TDesign 无等价) | > 每次迁移新页面时,将新导出的 SVG 追加到此清单。 ### 5.1 标签映射(硬性规则) | HTML | WXML | 说明 | |------|------|------| | `
` | `` | 容器 | | `` / `

` | `` | 文本必须用 `` 包裹 | | `` | `` 或 `bindtap` + `wx.navigateTo` | | | `` | `` | 必须指定 mode 和宽高 | | `` 内联 | `` 或 `` | 不支持内联 SVG | | `