每次拿到Figma的设计稿,第一反应不是感叹设计有多精致,而是先估一下:这个得写多久。手写CSS、对间距、调字体、切图、做响应式,一套下来少则半天多则两天,中间还要反复跟设计确认"这个16px是padding还是gap?""这个颜色有没有转换成变量?"——所以我一直在折腾怎么把"设计稿还原"这件事变得更快。这段时间在VS Code里配合Code Buddy做了一套实操流程,发现效率提升比我预期大得多,这篇就是我来详细拆解这套工作流。
先说结论:这套流程本质上是让AI替你完成从"设计稿语义"到"代码语义"的翻译,而你借助Figma的标注能力和VS Code的插件生态来做校验兜底。它不是一键生成,也不是完全不用动手,而是把还原UI设计稿中最耗时的那部分——量尺寸、敲重复样式、拼结构——压缩掉。适合任何写过几套页面、不想再干重复活的开发者参考。
1. 整体思路:先把Figma和VS Code之间的"翻译链路"打通
1.1 为什么单独用Figma导出代码不够用,单独让AI盲写也不靠谱
很多团队试过Figma的一键导出代码功能。导出出来的东西你我都懂:一堆带inline-style的div、一堆绝对值px、类名全是随机字符串,组件结构基本等于没设计,稍微有点交互就得大改。这就是"能跑但没法维护"的代码,只能用来做静态原型,不能进生产。
反过来,直接把Figma链接丢给AI编程助手去"看着写"也不行。大部分AI工具拿不到设计稿的实际像素信息,只能靠截图或描述猜测,结果就是"看起来像,但细节全飞"。间距差几个像素、圆角弧度不对、字体族不匹配,这些问题AI自己发现不了。
所以核心思路不是让某一方完全替代另一方,而是让Figma提供"数据和上下文",让Code Buddy提供"生成和生产能力",在VS Code里完成汇合。
具体来说:
- Figma负责输出"可读的设计数据":尺寸、颜色、字体、间距、层叠关系,这些通过标注和导出都能拿到。
- Code Buddy负责把"设计数据"转换为"前端代码":它能根据你给出的规则、组件描述、项目风格生成对应结构,而且支持你反复修正。
- VS Code则是"操作中介":你用本地文件、插件面板、辅助工具把两边串起来,AI生成结果立刻落在项目里。
这样一来,还原UI设计稿就不再是"肉眼对照手写",而是变成了一个半自动化的流程:设计稿==>提取规范==>喂给AI==>生成结构==>人工校验修正。
1.2 这套方案能省下哪些时间
我实测过一套中等复杂度的后台界面,四个页面的静态还原,之前手写大概要两天,用这套流程搭配Code Buddy辅助,半天到一天能完成,而且还原度能到90%以上。省时间的环节主要集中在:
- 量间距、量字号、对色值这类重复性劳动——AI直接生成,你只需要抽查。
- 重复的组件代码,比如按钮、输入框、弹窗——先在项目里定好模板,AI按模板生成。
- 页面整体骨架——给AI一个结构描述,它先搭出HTML/JSX层级,你在这个基础上做组件拆分和样式细化。
但要提醒一句:这套流程省的是"执行时间",省不了"思考时间"。你仍然需要自己决定:哪些部分该用组件抽象,哪些样式应该进设计token,交互逻辑怎么写。AI是帮你把脑中的设计翻译成代码,而不是替你决定设计怎么映射到代码架构。
2. 环境准备:VS Code里的基础配置与Code Buddy插件安装
2.1 推荐的项目结构
在开始还原之前,先把工程目录准备好。不要直接把AI生成的代码丢到某个零散文件里,否则后面维护会非常痛苦。我习惯按下面的结构组织:
src/ assets/ images/ # 从Figma切出来的图片资源 styles/ tokens.css # 设计变量:颜色、字号、间距 components/ ui/ # 通用组件:Button、Input、Card... layout/ # 布局组件:Header、Sidebar、Content pages/ Login/ Dashboard/ UserProfile/这个结构的好处是:AI生成代码时,你可以明确告诉它"按钮写到components/ui/Button.tsx里,页面骨架写到pages/Login/index.tsx",它就能按模块生成,减少后续搬文件的成本。
2.2 在VS Code里安装和激活Code Buddy
Code Buddy是一个AI编程辅助插件,在VS Code扩展商店里搜索就能装。装完后最好把它配置成独立的Temp Working Directory,让AI只在你允许的目录里读写文件,避免它乱改其他代码。
在扩展设置里我一般会做三件事:
- 绑定本地大模型或云端模型:根据你自己的网络环境选择。如果面向的是内部项目,建议开启隐私模式,防止把设计稿信息传到云端。
- 设置代码生成的语言偏好:比如你项目用的是React+TypeScript,就在设置里写清楚"默认生成React函数组件和TypeScript类型",这样AI第一版输出的代码就接近你要的规范。
- 开启自动接受/自动合并的开关:我保留"手动确认",因为AI生成的代码需要审核;但如果你已经建立了很完善的代码规范和模板,可以打开"自动应用建议"来提升速度。
提示:不要小看这一步。Code Buddy生成代码的"下限"取决于你的项目里有没有可参考的代码风格。如果项目里已经有别的页面,AI会自动模仿这些页面的结构,这也是为什么我建议先搭好项目骨架再让AI生成。
2.3 Figma侧的准备:把设计稿变成AI能“读懂”的东西
很多人忽略了这一步。Code Buddy本身不能直接读取Figma文件,它需要你把设计稿的关键信息表达清楚。我推荐两种方式,可以组合使用:
方式一:用Figma的开发者模式提取标注
在Figma中选中某个图层,右侧「Inspect」面板(新版本叫「Dev Mode」)会显示该元素的CSS信息,包括尺寸、颜色、字体、阴影、边框等等。你可以手动把关键信息记录到一个说明文件里,再提供给AI。
方式二:导出一份"设计说明"文档
这份文档不需要很复杂,但一定要包含设计稿的几个核心维度。下面是一个我常用的模板:
# 登录页设计规格 - 整体尺寸:1440x900 <=> 移动端 375x812 - 主色:#3B82F6 - 辅助色:#F59E0B - 字体族:Inter、PingFang SC - 页面结构:顶部Logo区(高64px),中间登录卡片(宽400px,圆角12px,阴影0 4px 12px rgba(0,0,0,0.06)),底部版权文字 - 表单字段:用户名、密码、记住我(勾选框)、登录按钮(主色,高44px,圆角8px) - 交互状态:hover时按钮亮度降低10%,输入框获得焦点边框变主色把这份文档放到项目根目录,比如design-spec.md。接下来,你在和Code Buddy对话时,直接把这份文档内容贴进去,或者指定让它读取这个文件。AI有了这些“硬信息”,生成出来的代码就远不止是“看起来像”,而是能精确卡到像素级。
3. 实操过程:从Figma设计稿到页面代码的完整还原流程
这一部分我会用一个虚构的登录页和一个内容卡片列表来演示,直接给你看关键指令和结果。
3.1 第一步:在Figma里梳理设计稿,提取"可复用的设计决策"
不要直接把整个设计稿截图丢给Code Buddy。截图虽然直观,但AI从一张位图里能提取到的信息非常有限,尤其是字体大小、间距这些“数字”,它会靠猜。正确做法是:先把设计稿里的设计决策拆出来,形成你给AI的"输入上下文"。
我一般是按这四步走:
- 拆解层级:在Figma的「Layers」面板里,把设计稿按区块划分。比如登录页分为:背景层、卡片容器、表单区域、页脚。这一步是为了给AI明确的“树状结构”,让它生成的代码层级结构和你视觉上看到的DOM一致。
- 记录关键尺寸:用「Dev Mode」选中卡片容器,记录它的width、padding、border-radius、box-shadow。不需要记录所有元素,只记容器级别和关键组件级别的参数。
- 建立命名映射:如果设计稿里的图层命名比较乱,我会在MindNode或文本里做一个简单的映射:设计师叫"btn_primary",前端组件叫"PrimaryButton"。这样AI生成组件时能直接对应到你的项目组件库。
- 收集资源文件:把图标、背景图等导出为SVG或PNG,放到项目的
src/assets/images里。AI需要引用图片路径时,它才知道怎么拼。
做完这些,你的"还原上下文"就齐了。下面是我会发给Code Buddy的一段指令:
读取 design-spec.md 和 src/pages/Login/ 目录下已有的基础样式。 现在需要在 src/pages/Login/index.tsx 里实现登录页的静态UI: 1. 页面整体为全屏背景,居中一个400px宽的卡片; 2. 卡片内容包含 Logo、标题、两个输入框、一个按钮、一个"记住我"区域; 3. 所有颜色、字号、间距严格使用 design-spec.md 中定义的变量,不要写死; 4. 生成Tailwind类名,或者CSS Modules类名都可以,但需保证可读性; 5. 优先使用已有的 Button 组件和 Input 组件,不要新建组件。3.2 第二步:让Code Buddy生成页面结构和样式
以我的实测体验,Code Buddy看到这样的指令后会直接生成一个基本可用的登录页组件。我来展示一次典型输出:
// src/pages/Login/index.tsx import React, { useState } from 'react'; import { Button, Input, Checkbox } from '@/components/ui'; import { LoginCard, PageWrapper, FooterText } from './Login.styles'; export default function LoginPage() { const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); // TODO: 接入登录API }; return ( <PageWrapper> <LoginCard> <img src="/assets/logo.svg" alt="logo" className="logo" /> <h1 className="title">欢迎回来</h1> <p className="subtitle">请输入您的账号信息以继续</p> <form onSubmit={handleSubmit}> <Input type="text" placeholder="用户名" value={username} onChange={(e) => setUsername(e.target.value)} /> <Input type="password" placeholder="密码" value={password} onChange={(e) => setPassword(e.target.value)} /> <div className="options-row"> <Checkbox label="记住我" /> <a href="/forgot">忘记密码?</a> </div> <Button type="primary" htmlType="submit" block> 登 录 </Button> </form> </LoginCard> <FooterText>© 2024 Example Corp</FooterText> </PageWrapper> ); }这段代码的问题在于:它用了命名导出Login.styles,但我还没有创建这个文件。没关系,让Code Buddy继续:
同时生成 Login.styles.ts 的内容。使用CSS-in-JS,主要样式包括: - PageWrapper:min-height:100vh,display:flex,居中,背景色 #F3F4F6; - LoginCard:width:400px,padding:40px,border-radius:12px,box-shadow:0 4px 12px rgba(0,0,0,0.06); - title:font-size:24px,font-weight:600,color:#111827; - options-row:display:flex,justify-content:space-between,align-items:center。AI生成后,你会发现它基本能严格按你给的参数来写。这里要记住一个技巧:你给AI的指令越"像设计评审会里的修改意见",AI的输出越精确。用具体的px值、具体的方向词("居中""左侧对齐""上下间距24px"),避免用模糊描述("看起来舒适一点""大气一点")。
3.3 第三步:用Figma的CSS信息校准AI输出
AI生成完初稿,接下来是重头戏:校准。我会在VS Code里开好浏览器预览,然后把Figma窗口放在旁边,逐区块核对。因为AI生成的样式很可能把所有间距、圆角都写成了一模一样的默认值,需要人工去对照Figma的标注来调整。
校准时我重点看这五个维度:
| 维度 | 容易出错的地方 | 校准方法 |
|---|---|---|
| 间距 | 父容器padding和子元素margin混用 | 选中Figma里的父布局看gap/padding,再对应代码里的CSS属性 |
| 颜色 | 主色用对了,但文字颜色和边框色偏灰 | 用Figma「Dev Mode」直接复制色值,替换到代码里 |
| 字体 | 忘记设置font-family或行高 | 看设计稿的文本面板里是否有指定行高,补到CSS中 |
| 圆角与阴影 | 多个组件圆角统一,但AI可能各自写不同的值 | 在设计稿里建立统一的Radius token,强制AI使用 |
| 尺寸 | 响应式断点与设计稿不一致 | 确认设计稿的Frame宽度是多少,在代码中按相同断点写媒体查询 |
当你发现某处不对时,不要急着手动改代码,而是重新给Code Buddy发一条修正指令,例如:
登录卡片和右侧装饰区之间的间距应该是48px,你写成了32px。另外按钮的圆角应该是8px,不是10px。请修正 Login.styles.ts 中对应的CSS。这样AI会修改对应文件,而且你不需要自己定位具体行号。实测下来,这种"发现差异→描述差异→AI修正"的循环,比"自己打开文件改值"要快得多,尤其是一份页面里有二三十处需要校准的时候。
3.4 第四步:图片资源与图标处理
设计稿里的图经常是SVG图标或装饰元素。如果让AI自己去找图片路径,它可能会编造一个不存在的路径,所以我们要提前准备好资源。
Figma导出资源时,我建议:
- 图标全部导出为SVG,且导出前看一下SVG内部的
fill是否是currentColor,这样才能跟随文字颜色变化。 - 位图(背景图、照片)导出为2x或3x尺寸的PNG,因为Figma默认导出是1x,用在高清屏上会发虚。
- 把导出文件放到项目的
src/assets/images后,文件名保持和Figma图层名一致或加前缀,然后你告诉Code Buddy:“图片路径统一为/assets/images/xxx.svg”。
AI生成到图片引用时就不会瞎猜。比如我让AI实现一个带背景图的内容卡片,指令可以这样写:
ContentCard组件需要包含: - 封面图:使用 /assets/images/card-cover.png,注意图片高度200px,object-fit: cover; - 标题、描述、底部标签区; - 整体卡片 hover 时有平移和阴影变化。3.5 第五步:把静态UI推进到响应式适配
大多数设计稿从Figma里导出时只有几个固定宽度的Frame,比如桌面端1440px、平板768px、手机375px。还原UI设计稿不能只还原一个宽度,代码里的媒体查询需要你根据设计稿的"栅格变化"来设定。
我的做法是:让Code Buddy先生成桌面端,然后把Figma三种宽度下的组件差异点逐一告诉它。比如:
这个页面的响应式要求: - 桌面端(>1024px):三列卡片布局,间距24px; - 平板(768px-1024px):两列卡片布局,间距16px; - 移动端(<768px):单列卡片布局,且卡片内的文字字号缩小为14px。 请补充MediaQuery到对应样式文件中。Code Buddy会按照这个规则生成Tailwind的响应式前缀,或者补充CSS媒体查询。但你仍然需要打开浏览器DevTools模拟各个断点,确认没有长度溢出、隐藏内容等问题。
4. 常见问题与排查技巧实录
4.1 AI生成的代码和Figma设计稿存在系统性偏差
这是最常遇到的问题,具体表现是:AI总是把内边距写成16px,按钮圆角写成4px,字体重量写成400,似乎有一套它惯用的"默认设计"。这类问题不是改一处两处就能解决,因为整个页面上有几十处,手动改效率极低。
我的经验是:在项目里引入设计Token(变量),然后让AI统一引用。以CSS变量为例,在tokens.css里定义:
:root { --color-primary: #3B82F6; --color-text-main: #111827; --color-text-muted: #6B7280; --space-xs: 4px; --space-sm: 8px; --space-md: 16px; --space-lg: 24px; --space-xl: 32px; --radius-sm: 4px; --radius-md: 8px; --radius-lg: 12px; --font-base: 14px; --font-title: 20px; }然后在给AI的初始指令里加上一句:
所有间距必须使用 --space-* 变量,圆角使用 --radius-* 变量,颜色使用 --color-* 变量。不允许出现魔数(直接写px数值除非特殊说明)。这样AI输出时就不会乱写默认值,它会主动去找变量。如果你的项目没有Token体系,先花十分钟建好。这一步不仅是配合AI,对整个项目的长期维护也有巨大价值。
4.2 Code Buddy无法"看到"浏览器渲染结果
AI编程助手没有肉眼,它不知道页面实际长什么样。你让它"看看这个页面哪个地方不对"是没用的,它只能修改代码,但看不到渲染结果。所以你需要主动把页面上的视觉问题转成可描述的文本。
我的做法是:打开浏览器预览,发现一处问题,就截图,然后用文字描述给AI:
- 错误示例:"这个页面看起来怪怪的"
- 正确示例:"右侧卡片的margin-bottom是40px,导致和下面卡片间距比其他间距大,应该统一为20px。同时标题的文字颜色比设计稿浅,应该改为#111827。"
把"视觉问题"翻译成"具体的CSS属性问题",是这套工作流里很重要的能力。刚开始你会觉得描述麻烦,但几次下来就习惯了,而且你描述得越具体,AI的修正就越快。
4.3 组件命名和Figma图层名不一致导致混乱
在Figma里,设计师可能把图层叫Group 832、Rectangle 7,但前端组件应该叫UserInfoCard。如果AI直接按照图层名生成代码,你会得到一堆无意义命名。
解决思路:在给AI的上下文里,给它一份「图层名→组件名」的映射表。比如:
# 图层映射 Group 832 -> UserInfoCard Rectangle 7 -> Avatar Text 56 -> UserName Text 57 -> UserEmail这样AI在生成组件时,就会用你定义的语义化名称。同时你也可以用Code Buddy的批量重命名功能,或者自己在Figma里先把图层改好,再导出设计说明。
4.4 设计稿里用了特殊字体,但项目里没有引入
很多设计稿会用自定义字体,比如某种品牌字体。AI生成代码时只会写font-family: "SomeFont",但如果你项目里没加载这个字体,浏览器就会回退到默认字体,导致视觉效果差很多。
处理方式有两种:
- 如果这个字体是免费可用的,把字体文件放到项目的
src/assets/fonts,并在@font-face里声明。同时告诉Code Buddy这个字体文件的位置,让它生成对应的font-family引用。 - 如果字体是付费的或不可用,和设计师沟通换成系统字体栈,比如
Inter, -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif。我建议把这类字体栈也做成设计Token,放在全局变量里。
4.5 页面能跑但图片资源全部404
这是因为AI给你写了一个不存在的路径。常见的情况是它写了./assets/logo.svg,但你的项目实际上在src/assets/logo.svg,而资源经过Webpack或Vite处理后,最终URL是/assets/logo.svg。
排查这类问题,我用一个笨但有效的方法:问AI"项目里现在有哪些图片文件",让它列出实际存在的路径,然后对比代码里的引用。Code Buddy能够读取项目目录结构,所以它能告诉你正确的相对路径。如果你用的是Vite,可以在vite.config.js里配置alias:
import path from 'path'; export default defineConfig({ resolve: { alias: { '@': path.resolve(__dirname, 'src'), }, }, });然后告诉AI用@/assets/...的方式引用,这样路径问题就能大幅减少。
5. 一些让还原质量更高的工作习惯
5.1 把设计评审写进"给AI的交付说明"
团队里如果有设计评审文档,那是最好的AI上下文。哪怕是很简短的描述,也对AI生成有帮助。比如在设计说明里写"这个页面的CVR很重要,按钮要突出,主按钮要明显强于次按钮",AI在生成样式时就会加大主按钮的对比度,而不是用默认样式。
我把这套说明存在项目根目录里的DESIGN_GUIDE.md中,每次新建页面都让Code Buddy先读一遍。它里面的内容大致是:
- 页面风格:简洁、留白、圆角不要超过12px
- 交互原则:hover状态要在120ms内完成过渡
- 可访问性:正文对比度不低于4.5:1
- 代码规范:类名使用BEM风格,组件用TypeScript
当Code Buddy掌握了这些规则之后,你会发现它生成的代码不再像平平无奇的"通用模板",而更贴近你自己团队的真实设计语言。
5.2 在复杂页面上,拆成多个小块让AI逐个生成
不要试图让AI一口气生成整个企业后台界面。指令越长,AI越容易遗漏你的关键要求。我的经验是:按功能区块拆分,每个区块单独生成,最后再合起来。
举例来说,一个Dashboard页面可以拆成:
- 顶部导航栏
- 左侧菜单
- 统计数据卡片区域(4个卡片)
- 销售趋势图表区域
- 最近订单列表
给AI的每一条指令里只专注一个区块,并且带上这个区块在Figma里的详细尺寸和间距。生成完之后,再让AI做一次集成收尾,统一处理区块之间的间距和对齐。
比如:
我已经在 components/dashboard/ 下生成了 StatCard、TrendChart、OrderTable 三个组件。 现在在 pages/Dashboard/index.tsx 中组装: - 页面宽度最大1440px,居中 - StatCard区域和TrendChart区域垂直间距32px - TrendChart和OrderTable之间间距40px - 左侧留24px padding,右侧留24px padding这样生成出来的页面结构清晰,组件边界也干净,后面维护起来成本低很多。
5.3 用Code Buddy做"像素级比对"的辅助
虽然AI本身没有视觉,但你可以把Figma里某一区域的关键数值提取出来,让AI对照检查。这是我近期最常用的一种方式:
这是设计稿中订单列表行的CSS标注: - 行高:48px - 单元格左内边距:16px - 文本颜色:#374151 - 字体大小:14px 这是当前OrderTable组件的样式: - 行高:52px - 单元格左内边距:12px - 文本颜色:#4B5563 - 字体大小:13px 请将当前组件修正为设计稿标注的值。虽然本质上还是"我发现了差异让AI改",但比起自己打开样式文件一个个找,这种方式省去了定位文件和计算差异的时间。尤其当设计稿有十几个表格行时,这种差异的描述+AI修正会非常高效。
5.4 别忘了给AI提供"负面示例"
有时候我说不清想要什么样的风格,但我确切知道"不要什么"。这时候负面示例比正面描述更有用。比如:
不要使用Flex内联样式,不要用!important,不要生成超过100行的单文件组件,不要在样式里写死百分比宽度。把这些负面要求写成一份AI_RULES.md,放在项目根目录,每次启动新页面的对话之前让Code Buddy读一遍。它能明显提高AI输出的质量稳定性,尤其适用于团队多人协作的场景。
6. 结个尾:这套流程能走多远
我自己用了快一个月,最大的体感变化是:不怕设计稿变更了。以前设计师中途改了一个间距、换了一个主题色,我可能要花半天去全局搜索替换;现在直接在design-spec.md里改掉对应数值,然后跟Code Buddy说"根据新的设计规范更新所有页面中涉及该变量的地方",它就能批量改完,我再做视觉抽查就好。这个能力带来的价值,在某些频繁改稿的项目里甚至超过了初次还原的效率提升。
最后再分享一个小技巧:不要只依赖AI生成大段的UI代码,把它当做一个"会写代码的同事"来协作——你给它明确的意图、上下文和反馈,它帮你把意图变成具体的、可维护的代码,同时你不放弃最终审查权。这套"Figma数据 + VS Code环境 + AI辅助 + 人工校验"的组合,是我目前用下来在UI还原这件事上性价比最高的实践方案。如果你正好被设计稿还原虐过,不妨照着这个流程搭一套,大概率你会愿意一直用下去。