一个“截图生码 + 代码规范化 + 多断点视觉回归”的原生 HTML/CSS 流水线。
design-to-code-pipeline/
├── assets/ # 从 Figma 导出的素材
├── generated/ # 模型首轮生成代码(输入)
├── normalized/ # 规范化后的代码(输出)
├── target/ # 目标截图(1440/1024/768/375)
├── current/ # 当前截图(回归时生成)
├── diff/ # 差异图(回归时生成)
├── reports/ # normalize/regression 报告
├── scripts/
│ ├── select_assets.py
│ ├── normalize.js
│ └── regression.js
├── asset-manifest.json
├── design-tokens.json
├── rules.json
└── package.jsonnpm install
npx playwright install chromium- 把模型首轮输出放入:
generated/index.htmlgenerated/styles.css
- 资源路径约定:
generated/*中使用../assets/...(因为generated与assets同级)examples/personal-center-round*/*中使用../../assets/...
- 把目标截图放入:
target/1440.pngtarget/1024.pngtarget/768.pngtarget/375.png
- 更新配置:
asset-manifest.json(素材映射)design-tokens.json(设计令牌)rules.json(自定义规则)
当你从 Zeplin/Figma 导出了大量素材时,可以先做自动筛选:
# 初始化 Python 环境(一次即可)
python3 -m venv .venv
./.venv/bin/pip install -r requirements-select.txt
# 准备输入
# input/assets_raw/ 放解压后的素材
# input/screenshots/target-desktop.png
# input/screenshots/target-mobile.png
npm run select-assets
# 或者:提高召回率(会增加歧义候选)
npm run select-assets-relaxed输出:
- 严格模式:
reports/asset-selection/* - 宽松模式:
reports/asset-selection-relaxed/*selected-assets.jsonambiguous-assets.jsonunused-assets.jsonasset-manifest.draft.json
npm run normalize输出:
normalized/index.htmlnormalized/styles.cssreports/normalize-report.json
npm run regress输出:
current/*.pngdiff/*.pngreports/regression-report.json
npm run check- 基础语义化修正(
div.header -> header等) - 根据规则补充
img alt - 用
asset-manifest.json回填素材占位符(支持__ASSET__name__/asset://name/{{asset:name}}) - 将 CSS 中与 token value 相同的值替换为
var(--token)(严格模式) - 注入容器响应式规则
- 输出审计报告(raw hex / raw px)
- 用 Playwright 渲染
normalized/index.html - 按断点自动截图
- 用 pixelmatch 计算差异并输出
diff图 - 按
rules.json阈值判定 PASS/FAIL(支持全局maxDiffRatio+perBreakpointMaxDiff)
- 图片转代码模型输出
generated/* - 运行
normalize - 运行
regress - 若失败:把
diff+ 报告喂给修复模型生成最小补丁 - 重复 2-4,最多 3 轮
- 本项目默认只处理静态页面还原,不包含业务交互逻辑。
- 若 target 与 current 尺寸不同,会自动补齐画布后比较,并在报告中标记
dimensionMismatch。 - 为减少噪声,建议目标截图使用固定字体、固定浏览器、固定缩放比例导出。