微信小程序页面迁移校验之前 P5任务处理之前

This commit is contained in:
Neo
2026-03-09 01:19:21 +08:00
parent 263bf96035
commit 6e20987d2f
1112 changed files with 153824 additions and 219694 deletions

View File

@@ -0,0 +1,152 @@
---
inclusion: fileMatch
fileMatchPattern: "**/miniprogram/miniprogram/pages/**,**/miniprogram/miniprogram/components/**,**/h5_ui/**"
name: miniprogram-h5-conversion
description: H5 原型转微信小程序的强制规范。读到小程序页面/组件或 H5 原型文件时自动加载。
---
# H5 → 微信小程序转换规范(强制)
本规范适用于所有将 `docs/h5_ui/pages/*.html` 转换为小程序页面的任务。
## 一、转换前强制加载
每次转换页面前,必须加载以下资源(按顺序):
1. `wechat-miniprogram` Power 的 steering 文件:`view-layer.md``tdesign.md``builtin-components.md`
2. 目标页面的交互说明:`docs/h5_ui/interactions/<page>.md`
3. 设计 Token`docs/h5_ui/design-tokens.json`
4. 图标映射表:`docs/h5_ui/icon-mapping.md`
5. 目标页面的 H5 源码:`docs/h5_ui/pages/<page>.html`
6. 计算样式(如有):`docs/h5_ui/computed-styles.json` 中对应页面的 key
7. 截图(如用户提供):`docs/h5_ui/screenshots/<page>--*.png`
## 二、原型忠实度(最高优先级)
- `docs/h5_ui/pages/*.html` 中的结构、层次、元素、配色、间距、交互行为是唯一视觉真相
- 任何偏离原型的实现都需要用户明确确认
- 截图是校验还原度的唯一视觉参考
## 三、标签映射(硬性规则)
| HTML | WXML | 说明 |
|------|------|------|
| `<div>` | `<view>` | 容器 |
| `<span>` / `<p>` | `<text>` | 文本必须用 `<text>` 包裹 |
| `<a>` | `<navigator>` | 或 `wx.navigateTo()` |
| `<img>` | `<image mode="">` | 必须指定 `mode` 和宽高 |
| `<svg>` 内联 | `<image src="xx.svg">` | 不支持内联 SVG |
| `<ul>/<li>` | `<view wx:for>` | 无列表语义标签 |
| `<select>` | `<t-picker>` | 完全不同的交互 |
| `<button>` | `<t-button>` | TDesign 优先 |
| `<input>` | `<t-input>` | TDesign 优先 |
严禁在 WXML 中使用 HTML 标签div/span/p/a/img 等)。
## 四、样式规则
### rpx 换算
- 基准:屏幕宽度 = 750rpx设计稿以 375px 宽为基准
- 换算公式H5 的 px 值 × 2 = rpx 值
- 严禁同一类间距混用 rpx 和 px
### 设计 Token 引用
颜色、间距、圆角、字号、阴影必须参照 `docs/h5_ui/design-tokens.json`,不得凭记忆硬编码。
### 不支持的 CSS
| CSS 特性 | 替代方案 |
|----------|---------|
| `backdrop-filter: blur()` | 半透明背景色 `rgba()` |
| `*` 通配符选择器 | 逐个元素设置 |
| 远程 `@font-face` | `wx.loadFontFace()` |
### 样式隔离
- `app.wxss` = 全局样式
- 页面 `.wxss` = 自动隔离
- 组件 `.wxss` = 默认隔离,穿透用外部样式类或 CSS 变量
## 五、TDesign 优先原则
- 凡 TDesign 组件库能覆盖的 UI 元素,必须使用 TDesign 组件
- 自定义实现仅限 TDesign 无法覆盖的场景
- TDesign 样式覆盖优先用 CSS 变量,其次外部样式类,最后 `!important`
- 组件必须在页面 `.json``usingComponents` 中注册
## 六、事件系统
- 不能在 `bindtap` 中传参:用 `data-*` 属性
- 取值路径:`e.detail.value`(非 `event.target.value`
- 阻止冒泡:用 `catchtap`(非 `preventDefault`
- `data-` 属性名自动转换:连字符转驼峰,大写转小写
## 七、数据与状态
-`this.setData()` 驱动视图更新,无 DOM API
- `wx:if` 中不支持复杂 JS 表达式,需在 JS 中预处理
- 布尔属性必须用 `{{}}` 包裹:`checked="{{true}}"`
- 列表渲染必须加 `wx:key`
## 八、导航与路由
- 页面栈最多 10 层,`navigateTo` 超过会静默失败
- 跳转 tabBar 页面必须用 `switchTab`
- 路径以 `/` 开头,不带 `.wxml` 后缀
- 登录/登出场景用 `reLaunch`
## 九、Mock 数据策略(纯 UI 阶段)
后端 API 未就绪时,使用 mock 数据:
- 在页面 JS 的 `onLoad` 中用 `this.setData()` 设置 mock 数据
- mock 数据结构必须贴近真实 API 返回格式(参考对应 Spec 的接口定义)
- mock 数据用 `// TODO: 替换为真实 API 调用` 注释标记
- 联调时只需替换数据获取逻辑,不改动 WXML/WXSS
## 十、新页面开发 Checklist
- [ ] HTML 标签全部替换为 WXML 组件
- [ ] 内联 SVG 提取为文件,改用 `<image>``<t-icon>`
- [ ] Tailwind 类全部手写为 WXSSpx × 2 = rpx
- [ ] 不支持的 CSS 改为替代方案
- [ ] 事件绑定改为 `bindtap` / `bind:change`,传参用 `data-*`
- [ ] `alert/confirm` 改为 `wx.showToast` / `wx.showModal`
- [ ] `localStorage` 改为 `wx.setStorageSync`
- [ ] 路由跳转改为 `wx.navigateTo` / `wx.reLaunch`
- [ ] 图片设置 `mode` 属性
- [ ] 列表渲染加 `wx:key`
- [ ] 布尔属性用 `{{}}` 包裹
- [ ] TDesign 组件在页面 `.json` 中注册
- [ ] 安全区适配JS `wx.getSystemInfoSync().statusBarHeight` 动态 padding-top禁止用 `env(safe-area-inset-top)`
- [ ] 页面配置:`navigationBarTitleText`
## 十一、验收标准
- 视觉还原度:与 H5 截图对比,布局/间距/颜色/字号一致
- 交互完整性:交互说明中的所有状态和操作均已实现
- 空状态/加载态/错误态:均有处理
- TDesign 组件正确使用,无原生 HTML 标签残留
## 十二、实战踩坑速查
> 完整记录见 `docs/prd/MIGRATION-PLAYBOOK.md` 第六章。
### WXML 模板
- **禁止在 `{{}}` 中调用 JS 方法**`.toFixed()``.map()` 等)→ 用 WXS 模块 `utils/format.wxs`
- **TabBar 页面跳转必须用 `wx.switchTab`**task-list、board-finance、my-profile`navigateTo` 会静默失败
### 样式与布局
- **一屏页面**login、reviewing、no-permission 等):`height: 100vh` + `box-sizing: border-box`,不用 `min-height: 100vh`
- **状态栏适配**:用 JS `wx.getSystemInfoSync().statusBarHeight` 动态设置 `padding-top`,禁止用 `env(safe-area-inset-top)`
- **padding-top + 100vh**:必须配合 `box-sizing: border-box`,否则底部内容溢出
### TDesign 组件
- **`t-button icon="xxx"` 只支持内置图标**:品牌图标(微信 logo 等)必须导出 SVG`<view>` + `<image>` 组合
- **TDesign 默认样式优先级高**:与原型差异大时,直接用原生 `<view>` 实现,绕开样式干扰
### 资源引用
- **所有 H5 内联 SVG 必须导出为独立 `.svg` 文件**,存放 `assets/icons/`,用 `<image>` 引用
- **引用不存在的图片会 500 错误**:用 CSS 渐变、emoji、`<t-icon>` 替代
---
> 以上内容已整合至 `docs/prd/MIGRATION-PLAYBOOK.md`(唯一权威迁移文档)。
> 避坑清单见第六章迁移流程见第二章输入素材见第十二章AI 工作流见第十一章。