Files
Neo-ZQYY/_DEL/pitfalls.md
2026-03-15 10:15:02 +08:00

149 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 踩坑速查与迁移经验
> 经 User 确认后录入的实践经验。AI 发现新踩坑点时先提出建议User 确认后再录入。
> 按类别组织,每条记录包含:场景、问题、解决方案、影响页面。
---
## WXML 模板
### 禁止在 `{{}}` 中调用 JS 方法
- 场景WXML 模板中使用 `.toFixed()``.map()`
- 问题:小程序模板不支持 JS 方法调用
- 方案:用 WXS 模块 `utils/format.wxs`
- 影响:所有页面
### TabBar 页面跳转必须用 `wx.switchTab`
- 场景:从非 tabBar 页面跳转到 task-list、board-finance、my-profile
- 问题:`navigateTo` 会静默失败
- 方案tabBar 页面一律用 `wx.switchTab`
- 影响:所有涉及 tabBar 跳转的页面
---
## 样式与布局
### 一屏页面用 `height: 100vh` 而非 `min-height`
- 场景login、reviewing、no-permission 等单屏页面
- 问题:`min-height: 100vh` 在某些情况下不生效
- 方案:`height: 100vh` + `box-sizing: border-box`
- 影响login, reviewing, no-permission
### 状态栏适配禁止用 `env(safe-area-inset-top)`
- 场景:自定义 navBar 页面的顶部 padding
- 问题:小程序不支持 `env()` CSS 函数
- 方案JS `wx.getSystemInfoSync().statusBarHeight` 动态设置
- 影响:所有自定义 navBar 页面
### `padding-top + 100vh` 必须配合 `box-sizing: border-box`
- 场景:有顶部 padding 的全屏页面
- 问题:不加 box-sizing 会导致底部内容溢出
- 方案:始终添加 `box-sizing: border-box`
- 影响:所有全屏页面
---
## TDesign 组件
### `t-button icon` 只支持内置图标
- 场景:按钮中使用品牌图标(微信 logo 等)
- 问题:`icon` 属性只接受 TDesign 内置图标名
- 方案:用 `<view>` + `<image>` 组合替代
- 影响login 页面微信登录按钮
### TDesign 默认样式优先级高
- 场景:需要大幅覆盖 TDesign 组件样式
- 问题CSS 变量和外部样式类不够用时,`!important` 也可能不生效
- 方案:直接用原生 `<view>` 实现,绕开样式干扰
- 影响:视具体组件
---
## 资源引用
### 所有 H5 内联 SVG 必须导出为独立文件
- 场景H5 中直接写在 HTML 内的 `<svg>` 元素
- 问题:小程序不支持内联 SVG
- 方案:导出为 `.svg` 文件存放 `assets/icons/`,用 `<image>` 引用
- 影响:所有含内联 SVG 的页面
### 引用不存在的图片会 500 错误
- 场景WXML 中 `<image src>` 指向不存在的文件
- 问题:不是 404 而是 500 错误,难以排查
- 方案:用 CSS 渐变、emoji、`<t-icon>` 替代;或确保文件存在
- 影响:所有页面
---
## 截图与对比
### rpx 取整导致累积高度偏移
- 场景:多屏长页面的中间屏截图对比
- 问题MP 页面总高度比 H5 短 ~10%,中间屏内容窗口错位
- 方案:使用锚点对齐法(按元素位置对齐而非 scrollTop 数值)
- 影响board-finance, performance 等长页面
- 发现日期2026-03-10
### AI 浮动按钮动画造成随机差异
- 场景:截图时 ai-float-button 的 gradientShift 动画处于不同帧
- 问题:每次截图差异 ~1%
- 方案双端截图前隐藏H5 用 JSMP 用 `wx:if="{{false}}"`)
- 影响:所有含 ai-float-button 的页面
- 发现日期2026-03-10
### 禁止跨维度套用布局假设H5 原型是唯一视觉真相
- 场景board-customer "最专一"卡片的 `.loyal-table` 布局
- 问题:其他维度(最应召回等)的 `card-mid-row` / `card-assistant-row``ml-11`80rpx 对齐头像右侧),开发时"合理推断"表格也应该加 `margin-left: 80rpx`。但 H5 原型中表格容器没有 `ml-11`,是从卡片 padding 开始的left=16px。Playwright 实测才发现偏差
- 方案:每个维度的每个组件都必须回到 H5 HTML 逐一确认 Tailwind 类,禁止从其他维度"类推"。不确定时用 Playwright `getBoundingClientRect()` 实测 H5 元素位置
- 影响所有多维度页面board-customer 8 维度、board-coach 4 维度)
- 发现日期2026-03-12
### H5 与 MP mock 数据不同,像素级 diff 需结合结构比对
- 场景:用 PIL/numpy 或 image-compare 对比 H5 和 MP 截图
- 问题H5 原型使用硬编码 mock 数据(如孙先生/王先生/李女士MP 使用后端返回的测试数据(王先生/李女士/张先生),文字内容不同导致像素 diff 高达 11%18 个分段覆盖全页面,无法区分"数据差异"和"样式差异"
- 方案:像素级 diff 仅用于发现大面积结构偏移(窗口错位、整块缺失)。样式还原度验证的主要方法是 Tailwind 类→rpx 值逐项比对表,逐一确认每个 CSS 属性的换算结果
- 影响:所有页面的截图对比流程
- 发现日期2026-03-12
### Tailwind→WXSS 映射必须逐项建表验证
- 场景:将 H5 Tailwind 类翻译为小程序 WXSS
- 问题:凭记忆或经验直接写 WXSS 值容易出错——`font-medium` 是 500 不是 600`gap-1` 是 4px 不是 2px`space-y-2` 是 8px 不是 4px。错误在视觉上不明显但会累积
- 方案对每个组件建立完整的对照表H5 Tailwind 类 → 计算值 px → rpx 换算 → MP WXSS 值),逐行核对。参考速查表:`2→4, 4→8, 6→10, 8→14, 10→18, 12→22, 14→24, 16→28, 20→36, 24→42`
- 影响:所有页面的 WXSS 编写
- 发现日期2026-03-12
### 相邻元素间距叠加导致高度翻倍
- 场景:经营一览的 `.overview-grid-2` 底部 padding 32rpx + `.ai-insight-section` margin-top 32rpx间距翻倍为 64rpx
- 问题H5 中 grid 无 margin-bottom间距完全由下方元素的 `mt-4`(16px) 提供。MP 中两端都加了间距,导致块间距翻倍、整体高度偏高
- 方案:校对间距时必须确认「这段间距是谁提供的」——上方元素的 padding-bottom 还是下方元素的 margin-top。用 Playwright `getComputedStyle` 实测 H5 两个相邻元素的 margin/padding确认间距归属后只在一端设置
- 影响:所有包含多个子区块的板块(经营一览、预收资产等)
- 发现日期2026-03-12
### 用 Playwright 实测 H5 比手动解析 Tailwind 更可靠
- 场景H5 原型文件是单行 minified HTML手动读取 Tailwind 类名容易遗漏或误判
- 问题Tailwind 类名组合后的实际渲染值不直观(如 `p-4` 在嵌套容器中可能被覆盖,`space-y-2` 的实际 gap 取决于子元素数量),手动推算容易出错
- 方案:通过 `browser_run_code` 创建 375×812 viewport + DPR 1.5 的 context`getComputedStyle` + `getBoundingClientRect` 直接拿到渲染后的实际 px 值,再按换算规则转 rpx。这个方法应作为所有页面校对的标准流程
- 影响:所有页面的 WXSS 校对流程
- 发现日期2026-03-12
### Tailwind 字号类自带 line-heightWXSS 必须同步补齐
- 场景:校对经营一览的现金流水概览 4 个块H5 明显比 MP 高
- 问题Tailwind 的 `text-xs`/`text-sm`/`text-lg`/`text-xl` 等字号类捆绑了特定的 `line-height`(如 `text-lg` = `font-size: 18px; line-height: 28px`),但 WXSS 只写了 `font-size` 没写 `line-height`,小程序默认行高约 1.2,远小于 Tailwind 的行高,导致每行文字占据的垂直空间不足,块整体矮了一截
- 方案:每个 Tailwind 字号类转 WXSS 时,必须同时写 `font-size``line-height`。完整对照表87.5% 缩放):
| Tailwind | font-size (px) | line-height (px) | WXSS font-size | WXSS line-height |
|----------|---------------|------------------|----------------|-----------------|
| `text-xs` | 12 | 16 | 22rpx | 28rpx |
| `text-sm` | 14 | 20 | 24rpx | 34rpx |
| `text-base` | 16 | 24 | 28rpx | 42rpx |
| `text-lg` | 18 | 28 | 32rpx | 48rpx |
| `text-xl` | 20 | 28 | 36rpx | 48rpx |
| `text-2xl` | 24 | 32 | 42rpx | 56rpx |
- 影响:所有页面的所有文字元素
- 发现日期2026-03-12
---
> 新增经验请按以上格式录入,包含:场景、问题、解决方案、影响页面、发现日期(可选)。