前端组件库人手必备的工具函数
cn = twMerge(clsx(...)) 迎来底层重构。以往 tailwind-merge 每次渲染都在运行时拆分字符串、遍历字典树、跑正则比对冲突,是渲染循环中隐秘的性能损耗源。现在 shadcn 联手 Aiden Bai(Million.js / react-scan 作者)发布了全新 drop-in 引擎
cn:🛠 核心机制:编译期扁平查表 + 单趟扫描
• 规则预编译:把 Tailwind 约 380 组冲突规则在编译期固化为扁平 TypedArrays 字典树,彻底消灭运行时配置解释开销。
• 单趟整数比对:单次遍历同时完成 Token 边界与 FNV 哈希计算;变体映射为上下文 ID,冲突判定退化为纯整数比较;幸存类名按切片提取,无冲突直接返回原字符串引用,实现零额外对象分配。
• 三层分级缓存:针对组件渲染特征做参数指针比对与调用序列预测(单次调用仅 ~10ns);搭配双次准入机制,杜绝 SSR 一次性字符串污染缓存。
📊 实测与兼容性
• 采集 58 个主流开源项目(Supabase、Cal.com、PostHog 等)共 14.4 万次真实调用回放,几何平均提速 37×,组件常见调用提速 30×,冷启动耗时从 3.2ms 缩至 0.4ms。
• 通过 35.6 万项差分测试,与 tailwind-merge 输出保持 100% 字节级一致。
• 进阶支持
cn build 源码扫描剪枝,剔除未使用的规则,包体积比原有方案更小。💡 落地与避坑
• 面向 Tailwind CSS v4 设计(v3 项目需保留在 twMerge v2);
•
cn build 模式下避免动态拼接类名(如 "p-" + size);• 现存项目可直接一键迁移:
npx shadcn@latest migrate cn。🔗 仓库:https://github.com/shadcn-ui/cn
📖 原理:https://github.com/shadcn-ui/cn/blob/main/docs/how-it-works.md