如何将 Next.js(TypeScript)UI 自动转换为 Figma 设计?
可以半自动完成。先运行 Next.js 页面,捕获浏览器渲染结果,导入为 Figma 可编辑图层,再整理组件和设计规范。如果目前只有 React components 和 CSS/Tailwind,建议先用一个代表性页面验证这条路径。
需要分别评估页面外观的还原程度,以及导入后能否形成方便维护的 Figma 组件库。网页导入工具可以帮助还原一部分外观,组件库通常需要人工整理。
为什么应从运行中的页面转换
Next.js、TypeScript 和 React 描述页面如何生成。浏览器运行页面后,才能得到实际的 DOM、计算后的 CSS、字体、图片和元素尺寸。
基于浏览器渲染结果导入时,通常不需要直接解析 .tsx 或理解 React hooks。此时 Tailwind 样式已经应用到页面上,捕获工具可以根据最终显示结果重建图层。因此,即使工具对 React 源码的解析能力有限,也不一定妨碍它导入 React 渲染的页面。
不过,DOM 与 React 组件树并不一一对应。例如,一个 <Button /> 可能输出多层 DOM,也可能根据 props 显示不同内容。仅凭页面外观,无法可靠地推回它的全部 props、状态和复用关系。
可以先尝试什么工具
可以尝试 html.to.design。它提供 Figma 插件和浏览器扩展,可将网页转换为可编辑图层。根据官方文档,生成的图层包括 frames、文本、图片和矢量,工具还提供 Auto Layout 相关选项。具体页面的还原效果仍需实际验证。官方扩展说明
根据页面访问方式选择导入入口:
| 页面情况 | 导入方式 |
|---|---|
| 可以公开访问的页面 | 在 Figma 插件中通过 URL 导入 |
localhost、登录后页面或需要 VPN 的页面 | 在能访问页面的浏览器中使用扩展捕获 |
| 需要打开菜单、弹窗后的特定界面 | 先操作到目标状态,再使用扩展捕获 |
URL 导入由工具服务器访问页面,因此无法直接读取你电脑上的 localhost。官方文档建议这类页面使用浏览器扩展。URL 导入说明
具体怎么操作
1. 运行项目并准备目标页面
如果项目的 package.json 已配置 dev 脚本,可以使用对应包管理器启动,例如:
npm run dev
以终端显示的地址为准,在浏览器中打开目标路由。捕获前确认:
- 字体、图片和异步数据已经加载完成。
- 页面处于需要交付的状态,例如默认界面、菜单展开或弹窗打开。
- 视口尺寸已经确定,桌面端和移动端分别捕获。
- 长页面中的懒加载内容已经出现。
不要只保存服务端返回的 HTML 就开始转换。对于依赖客户端渲染、异步数据或运行时样式的页面,这样可能遗漏实际界面内容。
2. 捕获页面并导入 Figma
安装配套的浏览器扩展和 Figma 插件,在浏览器中捕获目标页面或局部区域,再通过工具支持的导入入口放入 Figma。html.to.design 的扩展文档介绍了整页和局部捕获流程。浏览器捕获步骤
第一次可以选择一个包含导航、文字、图片和重复组件的页面,检查导入效果后,再决定是否批量处理其他路由。
3. 对照浏览器检查结果
检查时保持浏览器与 Figma Frame 的宽度一致,优先查看:
- 字体、字重、行高和文本换行是否一致。
- 元素间距、容器尺寸、图片裁切是否正确。
- 阴影、渐变、边框和圆角是否保留。
- 固定定位、滚动区域和遮罩层是否出现偏差。
- 图层是否便于编辑,调整文字长度后布局是否仍然合理。
页面看起来相近,不代表 Auto Layout 和响应式行为已经正确。即使工具生成了 Auto Layout,也应检查方向、间距、对齐和尺寸设置是否符合后续编辑需求。
布局、样式和组件分别能保留多少
| 目标 | 应有的预期 |
|---|---|
| 当前视口的布局和视觉样式 | 可以通过导入获得起点,复杂效果需要检查和修正 |
| 文本、图片等可编辑内容 | 取决于工具输出,需确认是否生成独立图层 |
| React 组件名称、props 和组件边界 | 不能仅凭渲染结果可靠恢复 |
| Figma Components、Variants 和实例关系 | 需要核对工具能力,并按组件语义整理 |
| Tailwind tokens 与 Figma Variables 的对应关系 | 需要从项目定义中提取并建立映射 |
| 响应式规则和交互逻辑 | 多个页面状态的捕获不能替代完整规则,通常需要补建 |
对于按钮、输入框、卡片等重复元素,可以先导入具有代表性的实例,整理为 Figma Components,再补充 Variants 和实例关系。组件较多时,可以在项目中准备一个临时展示页,集中呈现尺寸、状态和样式,减少逐页寻找实例的工作。
如果只能先导出样式
可以先整理项目已有的颜色、字号、间距、圆角和阴影定义。如果项目使用 CSS variables 或集中管理的设计 token,优先读取这些定义,再映射为 Figma Styles 或 Variables。
也可以在浏览器开发者工具中选中元素后,用下面的代码读取其计算样式:
// 在浏览器开发者工具 Console 中运行。
// $0 表示当前在 Elements 面板中选中的元素。
const element = $0;
if (element instanceof Element) {
const style = getComputedStyle(element);
const properties = [
'color',
'background-color',
'font-family',
'font-size',
'font-weight',
'line-height',
'padding',
'gap',
'border-radius',
'box-shadow'
];
const result = Object.fromEntries(
properties.map((name) => [name, style.getPropertyValue(name)])
);
console.log(JSON.stringify(result, null, 2));
}
这段代码只能帮助记录所选元素的样式,不会生成 Figma 文件,也不会自动识别设计 token。计算值反映的是当前元素在当前状态下的结果,不能据此还原全部 Tailwind 配置或断点规则。
对于这个项目,可以把首轮目标设为获得可编辑、视觉接近的页面稿,再根据 React 组件和样式定义补建 Figma 组件库。是否适合大规模使用,要看代表性页面的导入质量和后续整理成本,仅凭工具的功能列表无法判断。
备注:内容仅供参考。
