1. 从“impeccable”这个词说起:它到底在解决什么问题
第一次看到“impeccable”这个词,是在一个前端开发者的讨论串里。有人贴了一张截图,说“这个 AI 写出来的页面,终于有点 impeccable 的意思了”。当时我愣了一下——impeccable,无懈可击、无可挑剔,这个词放在前端设计语境里,分量其实很重。因为做过前端的人都知道,让一个页面“能跑”和让一个页面“无可挑剔”,中间隔着的可能是几十个小时的像素级调整。
后来我花了不少时间去研究这个词背后的东西,发现它并不是某个具体产品的名字,而更像是一个评价标准,或者说是一类工具想要达到的目标状态。围绕它出现的几个关键词——AI coding agents、frontend design、CLI、browser extension——拼在一起,其实勾勒出了一个很清晰的场景:用 AI 编程代理来辅助前端设计,通过命令行工具和浏览器扩展来落地。
这个场景解决的核心痛点是什么?我自己的体会是:前端开发里最耗时的从来不是写业务逻辑,而是那些“说不清道不明但一眼就能看出不对”的视觉细节。间距差 2px、圆角不统一、阴影层次混乱、响应式断点处理得生硬——这些问题 AI 以前很难帮你搞定,因为它不理解“好看”的标准。但现在情况变了,一批新的工具开始尝试把“设计品味”这件事拆解成可执行的规则和检查项。
这篇文章适合谁看?如果你是一个前端开发者,或者正在用 AI 辅助写代码,又或者你对“怎么让 AI 生成的界面不那么像 AI 生成的”这个问题感兴趣,那接下来的内容应该对你有用。我会从实际使用的角度,把这类工具的工作方式、配置细节、踩坑经验都摊开来讲,尽量做到你看完就能上手试。
提示:本文讨论的“impeccable”是一个设计质量标准的概念,不特指某一个商业产品。文中涉及的工具和方法论,均基于公开可查的技术实践整理。
2. AI coding agents 在前端设计里的真实能力边界
2.1 为什么通用代码生成搞不定前端视觉
我最早用 AI 写前端代码的时候,最大的感受是:它能给你一个“结构正确”的页面,但离“视觉正确”还差得远。比如你让它写一个卡片组件,它会给你一个 div,里面有标题、描述、按钮,CSS 也写得有模有样。但你把它放到真实项目里,就会发现一堆问题:卡片的内边距和项目里其他卡片不一致、按钮的 hover 状态没有过渡、文字的行高在移动端看起来太挤。
这些问题的根源在于,通用代码生成模型训练时看到的“好代码”和“好设计”是两回事。代码质量可以靠语法、结构、命名规范来衡量,但设计质量涉及到视觉层次、对齐、留白、色彩对比度这些更主观的东西。一个模型可以写出完全符合 ESLint 规范的 CSS,但依然做出一个看起来“很不对劲”的界面。
AI coding agents 在这方面的进步,主要体现在它们开始引入设计系统的约束。也就是说,它不再凭空生成样式,而是从你项目里已有的设计 token(颜色变量、间距变量、字体层级)里取值。这个转变很关键,相当于把“设计品味”这件事从模型的能力问题,转化成了工程问题——只要你的设计系统是 impeccable 的,AI 生成的东西就不会太离谱。
2.2 从“生成代码”到“审查代码”的转变
我观察到的一个明显趋势是,这类工具的重心正在从“帮你写”转向“帮你查”。这个转变其实很符合实际工作流——写代码这件事,AI 已经做得够好了,但审查代码,尤其是审查视觉相关的代码,才是真正稀缺的能力。
举个例子,你写了一个按钮组件,AI 审查工具会告诉你:这个按钮的点击区域高度是 36px,低于移动端推荐的 44px 最小触控区域;按钮文字和背景的对比度是 3.2:1,低于 WCAG AA 标准的 4.5:1;按钮的 focus 状态没有可见的轮廓线,键盘用户无法感知焦点位置。这些检查项,每一个都有明确的标准依据,不是主观判断。
这种“审查”能力之所以重要,是因为它把前端设计里那些“老师傅才知道”的经验,变成了可自动化执行的规则。你不需要在一个团队里待三年才能学会这些,工具会直接告诉你哪里不对、为什么不对、怎么改。
2.3 当前阶段的实际局限
当然,我也得说清楚这类工具目前做不到什么。它们能检查对比度、间距、触控区域这些可量化的指标,但对于“这个页面的视觉节奏是否舒服”“这个动效是否自然”这类需要审美判断的问题,还是无能为力。
我试过让 AI 审查一个我做的落地页,它指出了所有技术层面的问题,但当我问它“这个页面的视觉重心是不是偏了”的时候,它给的建议就很泛泛,什么“可以尝试调整布局”之类的废话。所以我的经验是:把 AI 当成一个极其严谨的初级设计师,它能帮你守住底线,但天花板还得靠你自己。
还有一个现实问题是,这类工具对项目上下文的依赖很强。如果你的项目没有统一的设计 token,样式都是硬编码的,那 AI 审查出来的结果就会很碎片化,今天说这个按钮圆角不对,明天说那个卡片阴影不一致,但你没有一个统一的参照系去批量修复。所以我在实际项目里,会先花时间把设计 token 整理清楚,再让 AI 介入审查,效率会高很多。
3. CLI 工具在 impeccable 工作流里的角色
3.1 为什么是命令行而不是图形界面
说到 CLI,很多人第一反应是“这不是倒退吗,现在什么工具不都是图形界面”。但我在实际用下来之后,发现 CLI 在前端设计审查这个场景里,反而有它独特的优势。
第一个优势是可集成性。你可以把 CLI 工具直接挂到 CI/CD 流程里,每次提交代码的时候自动跑一遍设计审查,有问题就阻断合并。这个在图形界面里很难做到,你总不能让设计师每次提交前都手动打开一个网页去点检查按钮。
第二个优势是批量处理能力。前端项目里动辄几十上百个组件,用图形界面一个个检查是不现实的。CLI 工具可以一次性扫描整个目录,输出一份完整的报告,你拿着报告去批量修复就行。
第三个优势是可配置性。CLI 工具通常支持配置文件,你可以把团队的规范写进去,比如“所有按钮的最小高度是 44px”“所有文字的对比度不低于 4.5:1”“间距只能取 4 的倍数”。这些规则一旦配置好,就是团队共享的资产,新人进来直接跑一遍就知道哪里不符合规范。
3.2 一个典型的 CLI 工作流拆解
我拿一个实际项目举例,说说我是怎么把 CLI 工具嵌到工作流里的。假设你有一个 React 项目,用的是 Tailwind CSS,团队有一套自己的设计 token。
第一步是安装和初始化。通常这类工具会提供一个 init 命令,让你生成一个配置文件。配置文件里你会定义几个关键东西:设计 token 的来源(比如从 tailwind.config.js 里读)、审查规则的严格程度(warning 还是 error)、要忽略的文件或目录。
# 以某个设计审查 CLI 为例的初始化流程 npx design-audit init # 生成的配置文件大致长这样// design-audit.config.js module.exports = { tokens: { spacing: [0, 4, 8, 12, 16, 24, 32, 48, 64], radius: [0, 4, 8, 12, 16, 9999], colors: './src/styles/colors.js' }, rules: { 'min-touch-target': 'error', 'color-contrast': 'error', 'consistent-spacing': 'warn', 'focus-visible': 'error' }, ignore: ['**/*.test.tsx', '**/node_modules/**'] }第二步是跑审查。你可以在本地开发的时候手动跑,也可以挂到 pre-commit hook 里。我个人的习惯是本地手动跑,因为有些警告我需要判断是不是误报,不想让它阻断我的提交。
npx design-audit scan ./src/components第三步是看报告。好的 CLI 工具会输出结构化的报告,告诉你哪个文件、哪一行、什么问题、严重程度、建议怎么改。我见过做得比较好的,还会直接给出修复后的代码片段,你复制粘贴就行。
第四步是修复和验证。修完之后再跑一遍,确认问题都解决了。如果是挂到 CI 里的,就等 CI 跑完看结果。
3.3 配置文件的几个关键字段怎么填
配置文件是 CLI 工具的灵魂,填得好不好直接决定了审查结果有没有用。我踩过的坑主要集中在这几个字段上。
tokens.spacing这个字段,我建议你从项目实际用的间距值里提取,不要照搬什么“8 的倍数”这种通用规则。因为每个项目的设计系统不一样,有的用 4 的倍数,有的用 5 的倍数,你强行套一个通用规则,只会得到一堆误报。我一般会写个脚本,把项目里所有 CSS 的 margin 和 padding 值统计一遍,取出现频率最高的那些值作为白名单。
rules 的严格程度,我的经验是分阶段来。刚开始用的时候,全部设成 warn,先看看工具能查出什么问题,心里有个数。等你确认它的判断是靠谱的,再把关键规则(比如对比度、触控区域)设成 error,其他的保持 warn。不要一上来就全设 error,不然你会被淹没在报错里,最后干脆把工具关了。
ignore 字段,这个一定要认真配。测试文件、storybook 的 stories 文件、第三方组件库的包装文件,这些通常不需要审查。如果你不忽略它们,报告里会混入大量噪音,真正的问题反而被淹没了。
注意:不同 CLI 工具的配置字段名可能不一样,上面给的是示意。实际使用时请以你所用工具的官方文档为准。但配置的思路是通用的:定义 token 来源、设置规则严格程度、排除不需要审查的文件。
4. Browser extension 如何补足 CLI 看不到的视觉问题
4.1 CLI 的盲区在哪里
CLI 工具再强,它本质上是在静态代码层面做分析。它能读你的 JSX、你的 CSS、你的配置文件,但它看不到渲染后的实际效果。这就导致了一些问题它查不出来。
比如,你的 CSS 里写了一个color: #666,CLI 工具会检查这个颜色和背景色的对比度。但如果这个元素被一个父级的opacity: 0.5影响了呢?实际渲染出来的对比度可能只有 2:1,但 CLI 不知道,因为它不执行渲染。
再比如,响应式布局的问题。CLI 可以检查你有没有写媒体查询,但它没法知道在 375px 宽度下,你的导航栏是不是真的会换行、文字是不是真的会溢出。这些只有真正在浏览器里渲染出来才能看到。
还有交互状态的问题。hover、focus、active、disabled 这些状态,CLI 只能检查你有没有定义,但定义得对不对、视觉效果好不好,它判断不了。而 browser extension 可以直接在页面上模拟这些状态,让你看到实际效果。
4.2 浏览器扩展的典型使用场景
我日常用得最多的 browser extension 功能,是实时审查当前页面。打开一个页面,点一下扩展图标,它就会在当前页面上叠加一层标注,把有问题的元素高亮出来,旁边显示问题描述。
这个功能在几个场景下特别有用。第一个是验收 AI 生成的页面。你用 AI 生成了一个页面,代码看起来没问题,CLI 也跑过了,但你还是不放心。这时候用扩展在浏览器里打开,一眼就能看出有没有视觉上的硬伤。
第二个是检查响应式断点。好的扩展会提供一个断点切换器,你可以在 320px、375px、768px、1024px、1440px 这些常见宽度之间快速切换,看页面在不同尺寸下的表现。这个比你在开发者工具里手动拖拽要方便得多,而且它会自动重新跑一遍审查规则。
第三个是模拟交互状态。你可以强制一个元素进入 hover 或 focus 状态,然后看它的样式是否符合预期。这个在检查键盘可访问性的时候特别有用——你按 Tab 键遍历页面上的可聚焦元素,扩展会实时告诉你当前焦点在哪个元素上、它的 focus 样式是否可见。
4.3 扩展和 CLI 怎么配合使用
我的工作流是这样的:CLI 管代码提交前的批量检查,扩展管开发过程中的实时反馈。
具体来说,我在写组件的时候,会开着浏览器扩展,边写边看。每写完一个组件,就在浏览器里刷新一下,点扩展看看有没有新问题。这个阶段的反馈是即时的,我改起来也快。
等到一个功能模块写完了,准备提交了,我再跑一遍 CLI 审查。这时候 CLI 会从代码层面做一次全面扫描,包括那些我在浏览器里可能没注意到的文件。如果 CLI 报了问题,我再回到浏览器里确认一下,然后修复。
这个配合方式的好处是,把审查分成了两个层次:扩展负责“看得见”的问题,CLI 负责“看不见”的问题。两者结合,基本能覆盖前端设计质量的大部分检查项。
还有一个技巧是,我会把扩展的审查结果和 CLI 的审查结果做对比。如果扩展发现了 CLI 没发现的问题,那说明这个问题是渲染层面的,我需要去检查是不是有动态样式或者继承样式在作怪。如果 CLI 发现了扩展没发现的问题,那说明这个问题在静态代码里存在,但当前页面没有触发到,可能是某个条件分支下的样式。
5. 把 impeccable 标准落地到日常开发的具体做法
5.1 先建立设计 token 的单一事实来源
我见过很多项目,设计 token 散落在各个地方:有的在 CSS 变量里,有的在 JS 常量里,有的直接硬编码在组件里。这种情况下,你让 AI 去审查设计质量,它连个参照系都没有,只能瞎猜。
所以我的第一步永远是统一设计 token。具体做法是,在项目里建一个tokens目录,里面用 JSON 或 JS 文件定义所有的基础值:颜色、间距、圆角、字体大小、行高、阴影、动画时长。然后通过构建工具把这些 token 转换成 CSS 变量、Tailwind 配置、JS 常量,供不同场景使用。
// tokens/index.js export const spacing = { xs: '4px', sm: '8px', md: '16px', lg: '24px', xl: '32px', '2xl': '48px' }; export const radius = { none: '0', sm: '4px', md: '8px', lg: '12px', full: '9999px' }; export const colors = { primary: { 50: '#eff6ff', 500: '#3b82f6', 700: '#1d4ed8' }, neutral: { 0: '#ffffff', 100: '#f5f5f5', 500: '#737373', 900: '#171717' } };这个文件一旦建好,后面所有的审查工具都从这里读数据。CLI 工具读它来判断你的样式值是否在允许范围内,浏览器扩展读它来判断渲染出来的颜色和间距是否符合规范。单一事实来源这个原则,在设计系统里怎么强调都不过分。
5.2 给 AI agent 写一份“设计约束说明书”
如果你在用 AI coding agent 帮你写前端代码,我强烈建议你给它准备一份设计约束说明书。这份说明书不用很长,但要把关键规则写清楚,让 AI 在生成代码的时候有据可依。
我自己的说明书大概包含这几块内容。第一块是间距规则:所有 margin 和 padding 只能取 token 里定义的值,不允许出现 13px、17px 这种随意值。第二块是颜色规则:文字颜色只能用 neutral 系列,主色只能用于交互元素,不允许用纯黑 #000 和纯白 #fff 做文字和背景的对比。第三块是组件规则:按钮最小高度 44px,输入框最小高度 40px,卡片圆角统一用 md,弹窗圆角统一用 lg。第四块是响应式规则:移动端优先,断点用 640px、768px、1024px、1280px,不允许自定义断点。
这份说明书你可以直接放在项目根目录,命名成DESIGN_CONSTRAINTS.md,然后在给 AI 的 prompt 里引用它。我实测下来,有了这份说明书之后,AI 生成的代码需要返工的比例明显下降。因为它不再需要猜你的设计偏好,而是直接按照你给的规则来。
5.3 建立审查结果的优先级处理机制
审查工具跑出来的问题,不是每一个都值得立刻修。我一般会把问题分成三个优先级。
P0 级别是必须马上修的,主要是可访问性问题:对比度不达标、触控区域过小、focus 状态不可见、图片没有 alt 文本。这些问题直接影响用户能不能用你的产品,不能拖。
P1 级别是应该尽快修的,主要是设计一致性问题:间距不在 token 范围内、圆角值不统一、颜色用了非 token 值。这些问题不影响功能,但影响产品的专业感,积累多了会让整个界面看起来很乱。
P2 级别是可以排期修的,主要是优化类问题:动画时长可以更合理、阴影层次可以更丰富、留白可以更舒服。这些问题属于“锦上添花”,有时间就改,没时间也不影响大局。
我一般会在 CI 里把 P0 设成阻断,P1 设成警告,P2 只记录不阻断。这样既保证了底线,又不会因为一些细枝末节的问题卡住整个团队的进度。
5.4 一个完整的检查清单
下面这张表是我自己整理的前端设计质量检查清单,你可以直接拿去用,也可以根据项目情况增删。
| 检查项 | 标准 | 检查方式 | 优先级 |
|---|---|---|---|
| 文字对比度 | 正文不低于 4.5:1,大号文字不低于 3:1 | CLI + 扩展 | P0 |
| 触控区域 | 移动端可点击元素不小于 44x44px | CLI + 扩展 | P0 |
| 焦点可见 | 所有可聚焦元素有可见的 focus 样式 | 扩展 | P0 |
| 图片替代文本 | 所有 img 有 alt 属性 | CLI | P0 |
| 间距一致性 | 所有间距值来自 token 集合 | CLI | P1 |
| 圆角一致性 | 同类组件圆角值统一 | CLI | P1 |
| 颜色一致性 | 所有颜色值来自 token 集合 | CLI | P1 |
| 响应式断点 | 使用项目定义的断点,不自定义 | CLI + 扩展 | P1 |
| 动画时长 | 在 150ms 到 400ms 之间 | CLI | P2 |
| 阴影层次 | 不超过 3 个层级 | CLI | P2 |
这张表的好处是,它把“impeccable”这个模糊的标准,拆解成了可执行、可验证的具体条目。你不需要去争论“这个页面够不够完美”,只需要对着表一项项检查,全部通过就是 impeccable。
6. 实际项目里踩过的坑和对应的解法
6.1 误报太多导致团队放弃使用
这是我遇到的最大的坑。刚开始推设计审查工具的时候,我兴冲冲地配了一堆规则,结果跑出来几百个警告,团队里的人一看就烦了,说“这工具净报些没用的”,然后就不了了之。
后来我反思了一下,问题出在我没有做规则的渐进式启用。正确的做法应该是:第一周只开 P0 规则,让团队先适应;第二周加上 P1 规则,同时把第一周发现的误报规则调成忽略;第三周再考虑加 P2。每一步都要给团队消化的时间,不能一口气全上。
还有一个减少误报的技巧是,给规则加例外机制。比如对比度检查,有些装饰性的文字确实不需要满足 4.5:1,你可以在代码里加一个注释/* design-audit-disable-next-line */,让工具跳过这一行。这个机制很重要,因为没有任何一套规则能覆盖所有情况,必须给开发者留一个“我知道我在做什么”的出口。
6.2 设计 token 和实际代码脱节
第二个坑是,我建好了设计 token,但团队里的人还是习惯直接写硬编码的值。你问他为什么不用 token,他说“我不知道有这个 token”或者“这个 token 名字太长了懒得打”。
这个问题的解法有两个层面。技术层面,我在 ESLint 里加了一条规则,禁止在样式文件里出现硬编码的颜色值和间距值,必须用 token 变量。这条规则一加,硬编码的情况立刻少了很多。文化层面,我在团队里定了一个规矩:新增 token 需要经过设计评审,但使用 token 不需要任何审批。降低使用门槛,提高新增门槛,这样大家就愿意用现成的 token 了。
6.3 浏览器扩展和 CLI 结果不一致
第三个坑是,同一个组件,浏览器扩展说没问题,CLI 说有问题。这种情况通常是因为两者的检查逻辑不一样:扩展检查的是渲染后的计算样式,CLI 检查的是源码里的声明样式。
比如你在 CSS 里写color: #666,但父元素有opacity: 0.8,扩展计算出来的实际对比度是达标的(因为它把 opacity 算进去了),但 CLI 只看#666和背景色的对比度,可能就不达标。这种不一致不是 bug,而是两个工具的检查维度不同。
我的处理方式是:以扩展的结果为准来判断用户实际看到的效果,以 CLI 的结果为准来判断代码层面的规范性。如果两者冲突,说明这个样式有动态因素,需要人工判断。我一般会去检查一下这个 opacity 是不是必要的,如果是必要的,就在 CLI 里给这一行加例外;如果不是必要的,就把它去掉,让两边一致。
6.4 AI 生成的代码绕过审查规则
第四个坑是,AI coding agent 生成的代码有时候会“巧妙”地绕过审查规则。比如规则要求间距必须是 4 的倍数,AI 就写margin: calc(4px * 3.25),算出来是 13px,但字面上看是 4 的倍数。这种写法能骗过简单的正则检查,但实际效果还是不对。
解法是让审查工具做计算而不是做匹配。好的工具会解析 CSS 的 calc 表达式,算出最终值再判断。如果你的工具不支持这个,那就需要在 AI 的 prompt 里明确禁止使用 calc 来做间距计算,只允许直接写 token 值。
还有一个更隐蔽的绕过方式是,AI 用内联样式style={{ marginTop: '13px' }}来写样式,这样就不会被 CSS 文件的审查规则覆盖到。解法是在 CLI 配置里把 JSX 文件也纳入扫描范围,检查内联样式里的值。
7. 我对这套方法论的一些个人体会
用了大半年这套工具链之后,我最大的感受是:impeccable 不是一个终点,而是一个持续逼近的过程。你不可能一次性把所有问题都修完,也不应该追求一次性修完。更现实的做法是,把审查工具当成一个“设计质量的温度计”,定期量一量,看看是在变好还是变差。
另一个体会是,工具能帮你守住底线,但突破上限还得靠人。对比度、间距、触控区域这些,工具可以帮你检查,但一个页面有没有“灵魂”,能不能让用户觉得“这个产品很用心”,还是取决于做产品的人有没有审美追求。工具只是把你的审美追求变得更容易执行、更不容易遗漏。
还有一点我想说的是,不要被工具绑架。我见过有人为了通过审查,把设计改得四平八稳,结果页面变得很无聊。审查规则是死的,设计是活的。当规则和你的设计直觉冲突的时候,先问问自己:这个规则背后的原理是什么?我的设计是不是真的违反了这个原理?如果确认是规则太死板,那就大胆地加例外,甚至改规则。工具是为你服务的,不是反过来。
最后分享一个我最近在用的技巧:我会定期把审查报告导出,然后对比上个月的数据,看看哪类问题在减少、哪类问题在增加。这个趋势比单次的审查结果更有价值,因为它反映的是团队习惯的变化。如果某类问题持续增加,说明要么是规则不合理,要么是培训没到位,需要针对性处理。这个做法让我把设计质量管理从“救火”变成了“防火”,效果好了很多。