SuperAPI AI 工具集

figma-code-connect

设计与创作

查看项目

更新于 10-16 10:49

技能介绍

用途

figma-code-connect 用于创建 Code Connect 模板文件(.figma.ts),把 Figma 组件映射到代码片段。当用户提到 Code Connect、Figma 组件映射等需求时可使用。本技能只编写 .figma.ts 模板文件,不编写 .figma.tsx。

前置条件

  • Figma MCP 服务器必须已连接:在开始前确认 Figma MCP 工具(例如 get_code_connect_suggestions)可用。若不可用,引导用户启用 Figma MCP 服务器并重启其 MCP 客户端。
  • 组件必须已发布:Code Connect 仅适用于已发布到 Figma 团队库的组件。若组件未发布,告知用户并停止。
  • 需要组织版或企业版套餐:Free 或 Professional 套餐不可用 Code Connect。
  • URL 必须包含 node-id:Figma URL 必须包含 node-id 查询参数。
  • TypeScript 类型:为在 .figma.ts 文件中获得编辑器自动补全与类型检查,需要把 @figma/code-connect/figma-types 加入 tsconfig.json 的 types:
{
  "compilerOptions": {
    "types": ["@figma/code-connect/figma-types"]
  }
}

重要格式说明

只编写 .figma.ts 模板文件——绝不编写 .figma.tsx。本技能产出的是无解析器模板:一个 .figma.ts 文件,其默认导出使用 figma.code... 标签模板。不要编写 .figma.tsx 文件,也不要用 figma.connect()——那是另一套独立的、基于解析器的 Code Connect 格式(以不同方式发布),对本技能而言是错误的产物;写成 .figma.tsx 的输出会被直接拒绝。如果某组件已存在 .figma.tsx,保持其不变,并在其旁边添加你的 .figma.ts 模板。

步骤 1:解析 Figma URL

从 URL 中提取 fileKey 和 nodeId:

URL 格式 fileKey nodeId
figma.com/design/:fileKey/:name?node-id=X-Y :fileKey X-Y → X:Y
figma.com/file/:fileKey/:name?node-id=X-Y :fileKey X-Y → X:Y
figma.com/design/:fileKey/branch/:branchKey/:name 用 :branchKey 取自 node-id 参数

始终把 nodeId 中的连字符改为冒号:1234-5678 → 1234:5678。

步骤 2:发现未映射组件

调用 MCP 工具 get_code_connect_suggestions,传入 fileKey、nodeId(冒号格式)以及 excludeMappingPrompt: true。该工具会识别选区中尚无 Code Connect 映射的已发布组件。对返回值中的每个组件提取 mainComponentNodeId,后续步骤使用这些解析后的节点 ID(而非 URL 中的原始值)。若返回多个组件,对每个组件重复步骤 3–6。

步骤 3:获取组件属性

调用 MCP 工具 get_context_for_code_connect,传入 fileKey、步骤 2 解析出的 mainComponentNodeId、clientFrameworks(依据 figma.config.json 的 parser 字段)与 clientLanguages(依据项目文件扩展名推断)。响应包含 Figma 组件的属性定义,属性类型包括:TEXT、BOOLEAN、VARIANT、INSTANCE_SWAP、SLOT。

步骤 4:确定代码组件

若用户未指定要连接的代码组件:查看 figma.config.json 的 paths 与 importPaths;在代码库中搜索与 Figma 组件同名的组件;读取候选文件并把其 props 接口与步骤 3 的 Figma 属性比对;若多个匹配,选择 props 接口最接近的一个;若无匹配,展示最接近的两个候选并请用户确认。在进入步骤 5 前与用户确认。

步骤 5:创建模板文件(.figma.ts)

文件命名为 ComponentName.figma.ts——绝不用 .figma.tsx。模板结构如下:

// url=https://www.figma.com/file/{fileKey}/{fileName}?node-id={nodeId}
// source={path to code component from Step 4}
// component={code component name from Step 4}
import figma from 'figma'
const instance = figma.selectedInstance

export default {
  example: figma.code`<Component ... />`,       // 必填:代码片段
  imports: ['import { Component } from "..."'], // 可选:import 语句
  id: 'component-name',                         // 必填:唯一标识
  metadata: {                                    // 可选
    nestable: true,
    props: {}
  }
}

属性映射:

Figma 属性类型 模板方法 使用场景
TEXT instance.getString('Name') 标签、标题、占位文本
BOOLEAN instance.getBoolean('Name', { true: ..., false: ... }) 切换可见性、条件属性
VARIANT instance.getEnum('Name', { 'FigmaVal': 'codeVal' }) 尺寸、变体、状态枚举
INSTANCE_SWAP instance.getInstanceSwap('Name') 固定组件槽位的可替换实例
SLOT instance.getSlot('Name') 无固定内容的槽位区域
(子图层) instance.findInstance('LayerName') 无属性对应的命名子实例
(文本图层) instance.findText('LayerName') → .textContent 命名文本图层的文本内容

VARIANT 映射必须列全 get_context_for_code_connect 返回的所有取值,遗漏会使输出为 undefined。当多个 VARIANT 组合产生不同代码输出时,需生成穷尽的条件分支。

限定 getSlot 仅用于 SLOT 类型属性,INSTANCE_SWAP 用 getInstanceSwap()。

插值包装规则:字符串值(getString、getEnum、textContent)用引号包裹;实例/片段值(executeTemplate().example)用花括号包裹;槽位片段(getSlot 结果)直接插入 figma.code...;布尔裸属性用条件表达式。

嵌套可配置实例:若子实例未作为组件属性暴露但仍可独立配置,需动态解析而非硬编码,可用 findInstance() 或 findConnectedInstance() 并调用 executeTemplate()。

步骤 6:校验

读回 .figma.ts 文件并检查:文件类型与格式是否正确(ComponentName.figma.ts,非 .figma.tsx,且未使用 figma.connect());步骤 3 中每个 Figma 属性是否都被处理;输出的代码是否合法且类型正确;是否存在硬编码子内容;插值包装是否正确。若仍有不确定之处,可查阅 api.md。

适用场景

把 Figma 设计系统中的已发布组件与前端代码库中的组件建立对应关系,使设计稿的组件能在代码侧显示对应的代码片段,便于设计与开发协作。

限制

需要已连接 Figma MCP 服务器;组件必须已发布到团队库;需组织版或企业版套餐;URL 必须含 node-id;仅产出 .figma.ts 无解析器模板,不产出 .figma.tsx 或使用 figma.connect()。