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

7.9 KiB
Raw Blame History

踩坑速查与迁移经验

经 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-rowml-1180rpx 对齐头像右侧),开发时"合理推断"表格也应该加 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 不是 600gap-1 是 4px 不是 2pxspace-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 的 contextgetComputedStyle + 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-sizeline-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


新增经验请按以上格式录入,包含:场景、问题、解决方案、影响页面、发现日期(可选)。