Skip to content

refactor(postcss): 统一样式转换归属并复用解析与规则索引 - #1217

Draft
sonofmagic wants to merge 12 commits into
codex/docs-spacing-rpx-limitationsfrom
codex/postcss-style-transforms
Draft

sonofmagic wants to merge 12 commits into
codex/docs-spacing-rpx-limitationsfrom
codex/postcss-style-transforms

Conversation

@sonofmagic

@sonofmagic sonofmagic commented Sep 18, 2026

Copy link
Copy Markdown
Owner

CSS 转换实现原先分散在 generator、Vite、Webpack、uni-app x 与 Native 包中。本 PR 将纯转换归入 @weapp-tailwindcss/postcss,消费包保留构建图、文件身份、平台/会话和输出交付职责,并复用单次调用的解析与规则索引。

本 PR 保持草稿:包级与定向真实项目验证已通过。HBuilderX 5.26、浏览器预检及 demo 编译器/基座版本已对齐;App 增量更新重启回退仍未解决,并已在迁移前基线复现,尚未全端通过。

实现

  • 迁移用户样式、scoped/preflight、产物清理、源码追踪、候选和入口分析、import 改写及 Harmony apply,保留主包原导入路径 facade。
  • 入口扫描缓存 miss 的 CSS parse 从两次减至一次;缓存命中不会额外展开候选,配置变化仍使缓存失效。不新增后置读取源码、fs 写入产物或跨 HMR 可变 AST 缓存。
  • Native 编译放入独立 /native 子入口;manifest、Babel/Metro 与 runtime 保留原归属。LightningCSS visitor 放入实验子入口,稳定根入口不加载实验引擎;injector 仅迁移纯指令插入。
  • 保持 328 个根入口运行时导出。中文 patch intent 覆盖五个直接受影响公开包。
  • 完整验收发现基线已有 uni-app x Web 类名错误:模板变体被转义而 Web CSS 保留原始类名。单独提交修正 Web 身份,覆盖静态 class、绑定、脚本、模块引用及小程序兼容。
  • 修正视觉验收脚本与共享用例漂移:单个 HMR 探针、完整 sourceMutation 与恢复、主题指定颜色、375px rpx 基准、完整属性/scope 读取、刷新复核、滚动容器内可见截图。保留运行时精确断言与像素差异要求。

本地验证

  • PostCSS:92 文件,868 通过,3 个既有跳过。主包前期 generator/rpx/v4/架构:338 通过;Vite bundle:210 通过;Webpack/架构:173 通过。
  • React Native:36 通过;injector:29 通过;LightningCSS 对照:20 通过。五包 JS/声明构建通过。
  • 本轮 uni-app x、Web cleanup、架构:17 文件,231 通过;视觉脚本/矩阵:4 文件,63 通过。主包构建、ESLint、agents:check、release status、git diff --check 通过。
  • 五项目微信 static:Mpx、Taro Webpack React/Vue3、uni-app Vite、weapp-vite,5 文件 23 通过,快照未变。
  • uni-app x static 已按规则限定项目重新生成并以 --update=none 复核。仅 HBuilderX 5.26 reset 选择器顺序/空白变化,声明未变。
  • 真实 H5:HBuilderX Vue3 三步 HMR 通过;uni-app x 默认/v2 隔离各五步 HMR、主题、刷新和截图差异通过。

所有常规 Vitest 使用 CI=1 --update=none。命令与持久回归见 工程记录。未新增或放宽 AGENTS 规则。

性能证据与边界

基线 821f4dd4b 与迁移后 ad8ec641b 使用同一锁文件、Node 24.18.0、pnpm 12.4.1、独立 workspace 产物;五项目各 3 次构建、5 次 watch 更新,正反顺序两轮共 20 条记录均无 error。首轮早期有短暂并发 H5 诊断,保留原样本,第二轮全程串行确认。

第二轮构建 steady 中位数(基线→当前,ms):Mpx 5376→5376,Taro React 11569→11520,Taro Vue3 11048→10981,uni-app 3716→3719,weapp-vite 2692→2679。HMR 与 RSS 没有一致收益,Taro React HMR 的快慢顺序在两轮反转;不能宣称全框架显著提速或稳定降内存。

确定改善限定为重复解析减少和 scoped-rule 热点:15,840 字节、500 选择器、每规则 30 声明,20 次预热后交替 30 组×10 次,旧 16.30 ms、新 7.02 ms,输出相等。完整性能表及原始报告位置见工程记录。

完整验收状态

升级后 preflight c117bf03-f1be-482f-99b8-aebfac670b34 已通过并用于首轮 full-report:build:ci、五项目完整 watch、uni-app 14 平台产物、H5 dev(2 通过、1 过滤跳过)通过。visual 阶段因上述基线已有问题失败,Android/iOS/Harmony 后续专用阶段未执行。uni-app memory build 被既有 guard 跳过,不将其 1 MB 采样算作有效构建数据;功能回归中的 weapp-vite 使用构建回退,不与性能 runner 的 watch 数据混用。

上述 H5 问题已完成定向修正验证。在 baa57d7ce8f9eead9f72ee89208d69a3599b4b81 重新 prepare,run ID 为 3662e7cf-57b3-42f6-a8a0-092c056b7261:base、微信、HBuilderX 5.26、iOS、Android、Harmony、Web 脚本探针全部通过,但当前会话 cua.getState() 返回 Browsers: Error: Codex auth token is unavailable。已立即通知用户并通过 preflight block 保存原始原因。

上述浏览器阻塞已恢复。在 4603ee84876e26ee369fca637285e6ac3533b79b 新建 preflight 0dc8d5b0-3879-4d1a-a445-72774f2af964,脚本与当前会话 computer use 全部通过,实际启动 full-report:

  • 已执行 18 阶段:17 通过,visual 中断失败。build:ci、五框架完整 watch(44 分 08 秒)、14 平台产物通过;H5 dev 为 2 通过、1 过滤跳过。
  • H5 各项目完成本轮 HMR 截图,uni-app x 两种隔离各五步;微信日志记录 11 个 HMR case 通过。visual 最终图片汇总和跨端比较未执行,不宣称整体视觉通过。
  • 普通 uni-app Vite iOS 弹窗确认:项目编译器为 5.15,设备基座为 5.26。项目锁定的 @dcloudio/* 3.0.0-5010520260709002 不随 IDE 升级自动更新。
  • 普通 uni-app Vite Android,以及使用 5.26 编译器的 HBuilderX Vue3 Android/iOS,增量后再次出现 App Launch,不符合既有纯 HMR 条件。不能全部归因为版本不匹配,仍需独立定位。
  • 确认环境阻塞后停止本任务 runner/活动 CLI launch,恢复测试临时源码。Harmony 和后续三个专用设备阶段未执行;不点击忽略弹窗,不放宽断言。runner 当前将 App 错误暂存在内存,停止时 uni-app x iOS 已开始;无完整 App 通过证据。

报告:.tmp/postcss-full-acceptance-resumed/2026-09-18T15-18-25-224Z/,保留原始 launch 日志、截图和执行日志。

后续已将普通 uni-app Vite demo 的 21 个同系列编译依赖对齐到正式版 3.0.0-5020620260917001,实际元数据为编译器 5.26;未改其他项目依赖声明。frozen install 通过,限定项目重生成 13 个 static 快照无 diff,2 项 static 复核通过;14 平台构建及登记检查共 15 项通过,H5 dev 为 2 通过、1 过滤跳过。

有界 iOS 恢复检查确认版本弹窗消失,初始页面和样式探针通过,但增量后仍触发 App Launch。独立迁移前基线 821f4dd4b 的 HBuilderX Vue3 iOS 在相同 5.26 环境下也触发相同断言;生命周期检查和 App visual 实现本次未修改。这是可在基线复现的未解决项,不计为重构后纯 HMR 通过。

只读检查 HBuilderX 5.26 的上游实现后,普通 uni-app Vue3 的重启路径已定位:vite-plugin-uniBUNDLE_END 排除包含 app-service.js 的普通文件增量;没有 PAGES: / FILES: 的编译结果由 IDE 分类为全量同步,iOS launcher 的 pushPackage 显式发送 restart。这与迁移前后的运行日志一致。App Launch 证明应用生命周期重新执行,不证明操作系统进程退出或重新安装;官方“热刷新”也不承诺保持运行状态。完整源码路径和边界见工程记录。

剩余阻塞是平台原生热重载与既有纯 HMR 验收条件不一致。继续完整验收需确认保留状态的上游更新路径,或由维护者明确平台原生热重载的独立验收标准;本 PR 未将重启计为纯 HMR 成功。uni-app x 与 Harmony 不直接套用普通 Vue3 的结论。未修改 IDE、断言或旧门禁,未等待远端 CI。新 demo 编译器的结果不混入此前旧锁文件的性能样本。

Refs #1214。依赖 PR #1216,base 为 codex/docs-spacing-rpx-limitations;原 rpx warning PR 范围保持独立。

@github-actions

github-actions Bot commented Sep 18, 2026

Copy link
Copy Markdown
Contributor

PR 性能基准报告:失败

  • Commit:0ac220a494ca
  • 生成时间:2026-09-18T17:11:54.712Z
  • Benchmark:failure
  • Watch:未触发/无产物

总览

指标 结果
Build 稳态中位数平均变化 +2.04%
HMR 稳态 P95 平均变化 +3.04%
插件 Build 中位数平均变化 -0.62%
插件 HMR 门禁统计平均变化 +3.59%
Watch HMR p50 / p95 N/A / N/A ms
Watch RSS 峰值 / 最大增量 0.00 / 0.00 MB
Watch Heap 峰值 0.00 MB

Benchmark 项目矩阵

项目 平台 Base Build 冷/稳态(ms) Current Build 冷/稳态(ms) Build 变化 Base HMR median/P95(ms) Current HMR median/P95(ms) HMR 变化 状态
demo-mpx-tailwindcss-v4__mp-weixin mp-weixin 16267.48 / 16467.02 16190.09 / 16565.13 +0.51% 5473.54 / 6126.93 5305.38 / 6469.04 +5.58% ok
demo-taro-vite-react-tailwindcss-v4__mp-weixin mp-weixin 30851.15 / 30886.69 31492.77 / 30898.37 +1.07% 7042.01 / 7164.08 6695.28 / 7033.76 -1.82% ok
demo-taro-webpack-react-tailwindcss-v4__mp-weixin mp-weixin 32869.11 / 33025.31 31628.59 / 31853.05 -3.59% 5261.04 / 12111.75 5447.87 / 11865.38 -2.03% ok
demo-uni-app-vite-tailwindcss-v4__mp-weixin mp-weixin 7808.10 / 7808.52 8937.70 / 8862.07 +13.99% 971.56 / 2958.37 1310.29 / 3414.99 +15.43% ok
demo-weapp-vite-tailwindcss-v4__mp-weixin mp-weixin 3559.44 / 3527.73 3466.43 / 3477.54 -1.80% 6936.56 / 7013.60 6856.68 / 6876.53 -1.95% ok

Benchmark 插件处理阶段

项目 Build Plugin base/current(ms) 变化 HMR Plugin base/current(ms) 变化
demo-mpx-tailwindcss-v4__mp-weixin 1559.00 / 1523.00 -2.31% 1474.00 / 1492.00 +1.22%
demo-taro-vite-react-tailwindcss-v4__mp-weixin 6363.00 / 6237.00 -1.98% 3521.00 / 3319.00 -5.74%
demo-taro-webpack-react-tailwindcss-v4__mp-weixin 9840.00 / 9333.00 -5.15% 8429.00 / 9400.00 +11.52%
demo-uni-app-vite-tailwindcss-v4__mp-weixin 2538.00 / 2715.00 +6.97% 951.00 / 1021.00 +7.36%
demo-weapp-vite-tailwindcss-v4__mp-weixin N/A / N/A N/A N/A / N/A N/A

Benchmark 内存

项目 Build RSS base peak/steady(MB) Build RSS current peak/steady(MB) Peak 变化 HMR RSS base peak/steady(MB) HMR RSS current peak/steady(MB) Peak 变化
demo-mpx-tailwindcss-v4__mp-weixin 1224.26 / 1147.98 1230.57 / 1155.02 +0.52% 2142.27 / 2002.56 2154.64 / 2015.93 +0.58%
demo-taro-vite-react-tailwindcss-v4__mp-weixin 1580.59 / 1510.96 1560.31 / 1505.43 -1.28% 3057.14 / 3015.81 3071.86 / 3020.82 +0.48%
demo-taro-webpack-react-tailwindcss-v4__mp-weixin 1300.72 / 1260.05 1368.77 / 1288.41 +5.23% 1827.09 / 1763.28 1851.48 / 1790.27 +1.33%
demo-uni-app-vite-tailwindcss-v4__mp-weixin 749.64 / 749.64 836.78 / 832.46 +11.62% 1041.01 / 946.62 1031.67 / 1017.39 -0.90%
demo-weapp-vite-tailwindcss-v4__mp-weixin 583.76 / 505.43 572.20 / 530.73 -1.98% 1416.05 / 1330.05 1542.84 / 1446.98 +8.95%

Watch 明细

项目 平台 变更类型 样本数 ready(ms) avg/p50/p95/max(ms) 插件 p50/p95(ms) RSS peak/delta(MB) Heap peak(MB)

门禁与诊断

  • Benchmark 性能门禁:失败
  • Benchmark 缺失项目:无
  • Benchmark 错误:0
  • Watch 解析错误:0
  • 性能违规:demo-uni-app-vite-tailwindcss-v4__mp-weixin / buildMedian:
  • 性能违规:demo-uni-app-vite-tailwindcss-v4__mp-weixin / buildPluginMedian:
  • 性能违规:demo-uni-app-vite-tailwindcss-v4__mp-weixin / buildPeakRssMb:
  • 性能违规:demo-uni-app-vite-tailwindcss-v4__mp-weixin / buildSteadyRssMb:

运行链接

统计口径
  • Build/HMR 版本对照沿用现有 benchmark 的 base/current 和门禁统计。
  • Watch 仅报告当前提交的真实跨平台 watcher 结果,不额外运行 base;跨 shard 总览分位数按各报告摘要聚合,项目/平台行保留原始口径。
  • 未触发或缺失的场景显示为 N/A,不当作 0。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant