Skip to content

perf(runtime): 让 cn 复用聚合包装缓存 - #1205

Merged
sonofmagic merged 3 commits into
mainfrom
codex/cn-wrap-runtime
Sep 15, 2026
Merged

sonofmagic merged 3 commits into
mainfrom
codex/cn-wrap-runtime

Conversation

@sonofmagic

Copy link
Copy Markdown
Owner

为什么 weapp cnmerge 差不多快

不是 npm cn 引擎和 tailwind-merge 差不多。上游 cn() 在稳定参数上可以快一个数量级。包上 weapp 之后,旧实现每次 clsx → unescape → npm cn() → escape,拆掉了参数身份缓存,又没有 merge 那层 256 LRU,热路径反而更慢。

改动

  • 导出 wrapRuntimeAggregator(原 wrapClassAggregator
  • @weapp-tailwindcss/cn 改为包装 cn 包的 twMerge,复用有界 LRU 和按需 unescape/escape
  • 无特殊字符时跳过 escape

不改冲突规则,不加 rpx 长度归一化。text-red + text-[80rpx] 仍与 merge 不等价。

Related to #1200

本地验证

  • pnpm --filter @weapp-tailwindcss/runtime test
  • pnpm --filter @weapp-tailwindcss/cn test
  • pnpm --filter @weapp-tailwindcss/merge exec vitest run test/twMerge.test.ts
  • pnpm --filter @weapp-tailwindcss/runtime tsd / pnpm --filter @weapp-tailwindcss/cn tsd

同一 bench 矩阵(Apple M4 Max / Node 24),热路径从「merge 快 2–10×」变成同量级:

case 优化前 cn 优化后 cn merge
short-no-conflict 4.1 M 46.1 M 42.8 M
last-wins 3.1 M 6.0 M 6.2 M
component-call 2.5 M 7.6 M 7.4 M
cache-miss 0.84 M 0.60 M 0.31 M

cache-miss 上 cn 仍快于 merge。顺带对齐了已转义 2xl: 数字变体的合并(per-token unescape)。

@sonofmagic
sonofmagic merged commit 0fe748c into main Sep 15, 2026
191 checks passed
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