@figit/dom-to-figma

中文文档
0.2.4发布于 2026/08/22MITTypeScriptES Module构建来源已验证近 30 天下载 3.1万

在浏览器中将任意 DOM 树转换为 Figma 剪贴板有效载荷 .

中文使用文档
文档目录12 节
  1. 安装
  2. 它会做什么
  3. 版式
  4. 多帧画布
  5. 结果形状
  6. 跟踪模式
  7. 自定义装载器
  8. 字体
  9. 图像
  10. 分类
  11. 运行时间要求
  12. 免责声明

@figit/dom-to-figma (英语)

在浏览器中将任意 DOM 树转换为 Figma 剪贴板有效载荷 .

import { createFigmaConverter } from "@figit/dom-to-figma";

const figma = createFigmaConverter();

const result = await figma.convert({
  element: document.getElementById("design"),
  width: 1280,
  height: 800,
  name: "Hero",
});

await navigator.clipboard.write([result.toClipboardItem()]);

贴入法相. 结束了.

安装

pnpm add @figit/dom-to-figma

它会做什么

行走一棵真正的 DOM 树,读取计算过的样式, 并制作Figma 在粘贴上读取的内容。 文本成为可编辑的文本;图像,向量,梯度,阴影,边框,并形成占位符全部结转.

被斯莱克用于生产,从浏览器直接将设计复制到Figma.

版式

默认转换器推断 本地图像自动显示:有弹性的容器,平板块流动,包裹行,并网格成为真正的堆栈(stackMode,相距相接,相接相接,相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相相接相接相接相接相接相接相接相接相接相相接相接相接相接相相接相接相接相 推论是每个容器的,并对照浏览器所测量到的几何——任何不能完全复制的容器都回落到绝对定位上,因此结果永远不会比固定位置的粘贴更糟糕.

const figma = createFigmaConverter(); // layout: "auto" (default)

过 layout: "absolute" 以禁用推断和定位每个框架(1.0前行为):

const figma = createFigmaConverter({ layout: "absolute" });

多帧画布

过 frames 而不是一个 element 将数个 DOM 树复制到一个相片上 :

const result = await figma.convert({
  frames: [
    { element: a, width: 800, height: 600, x: 0,   y: 0, name: "Hero" },
    { element: b, width: 800, height: 600, x: 900, y: 0, name: "Pricing" },
  ],
  canvasName: "Landing",
});

await navigator.clipboard.write([result.toClipboardItem()]);

结果形状

type ConvertResult = {
  document: FigmaClipboard;          // raw node-change document
  bytes: Uint8Array;                 // encoded .fig-style binary
  base64: string;                    // base64 of bytes
  toClipboardItem(): ClipboardItem;  // ready for navigator.clipboard.write
  toClipboardHtml(): string;         // raw HTML envelope Figma reads on paste
};

跟踪模式

过 trace: true 也可以从每个发射的Figma节点取出一张地图,回到它来自的DOM元素. 它默认是关闭的,在被禁用时不增加成本,并且永远不会改变有效载荷字节——它的存在是为了工具(可视的抖动,调试)而不是生产拷贝.

const figma = createFigmaConverter({ trace: true });
const result = await figma.convert({ element, width: 1280, height: 800 });

for (const entry of result.trace.entries) {
  // entry.guid    → the emitted node's Figma GUID
  // entry.domPath → ":scope > div:nth-child(2) > p:nth-child(1)"
  // entry.rect    → source rect (getBoundingClientRect) at convert time
  // entry.kind / entry.tag / entry.text
}

domPath 以 root.querySelector(domPath) (根元素为: :scope) (中文(简体) ). 文本节点带有其所有元素的路径加一 ::text[i] 后缀,一个文本节点的每个被包裹的行段共享该路径. result.trace 实值 undefined 除非转换器是用 { trace: true }。 。 。 .

自定义装载器

转换器采用三个可选的钩:

const figma = createFigmaConverter({
  fontLoader,   // (props) => Promise<FontFile>
  imageLoader,  // (req) => Promise<ImageFile>
  classify,     // (element, defaultKind) => ElementKind
});

重复 convert() 调用相同的转换器再利用缓存字体和图像。 打电话 figma.clearCache() 把他们丢掉.

字体

默认 : createFontsourceLoader() 通过 jsDelivr 的 CDN 从字体源取出字体 。 覆盖所有Google字体外加其他开源家族. 不需要 API 密钥 .

import { createFontsourceLoader } from "@figit/dom-to-figma";

const figma = createFigmaConverter({
  fontLoader: createFontsourceLoader({ subset: "latin-ext" }),
});

对于非fontsource字体,请自写加载器:

import type { FontLoader } from "@figit/dom-to-figma";

const myFontLoader: FontLoader = async ({ family, weight, italic }) => {
  const url = await myFontCDN(family, weight, italic);
  const response = await fetch(url);
  return { bytes: await response.arrayBuffer() };
};

图像

默认 : createDirectImageLoader() 直接执行 fetch(src)。没有CORS的交叉原生图像需要自定义的加载器,一般是代理链:

import type { ImageLoader } from "@figit/dom-to-figma";

const myImageLoader: ImageLoader = async ({ src }) => {
  const url = `https://my-proxy.example/?url=${encodeURIComponent(src)}`;
  const response = await fetch(url);
  const blob = await response.blob();
  return {
    bytes: await blob.arrayBuffer(),
    mimeType: blob.type,
  };
};

软件包内部将WebP/AVIF/etc重新编码为PNG,因此装入器只需要返回生字节和一个MIME类型.

分类

classify 让您将 DOM 元素映射到 Figma 节点类型 。 默认分类器返回 text, (中文(简体) ), image, (中文(简体) ), vector, (中文(简体) ), frame, (中文(简体) ), group, (中文(简体) ), form-with-placeholder,或 skip数字 :

import type { Classify } from "@figit/dom-to-figma";

const classify: Classify = (element, defaultKind) => {
  if (element.dataset.role === "text-wrapper") {
    return "text";
  }
  return defaultKind;
};

运行时间要求

在任何现代浏览器中运行. 取决于 window.getComputedStyle, (中文(简体) ), Blob, (中文(简体) ), ClipboardItem, (中文(简体) ), document.createElement, (中文(简体) ), crypto.subtle.digest, (中文(简体) ), Image,以及 <canvas>。 。 。 .

免责声明

与法格玛无关或得到其认可.

版本与发布记录

@figit/dom-to-figma 共发布 8 个版本,首次发布于 2026/05/19;过去 12 个月发布了 8 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.2.4latest2026/08/222 个月前
0.2.32026/08/222 个月前
0.2.22026/08/063 个月前
0.2.12026/07/233 个月前
0.2.02026/07/223 个月前
0.1.02026/07/114 个月前

关于 @figit/dom-to-figma 的常见问题

@figit/dom-to-figma 是什么?

在浏览器中将任意 DOM 树转换为 Figma 剪贴板有效载荷 .

如何安装 @figit/dom-to-figma?

在项目目录运行 npm install @figit/dom-to-figma,或使用 pnpm add / yarn add / bun add。

@figit/dom-to-figma 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@figit/dom-to-figma 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@figit/dom-to-figma 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=20。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@figit/dom-to-figma 可以商用吗?

@figit/dom-to-figma 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@figit/dom-to-figma 的下载量有多少?

根据 npm 官方下载统计,@figit/dom-to-figma 在 2026/10/15 – 2026/11/13 这 30 天内被下载 30,977 次,日均约 1,033 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@figit/dom-to-figma 还在维护吗?

最新版本 0.2.4 发布于 2026/08/22(2 个月前);至今共发布 8 个版本,其中过去 12 个月发布了 8 个;首次发布于 2026/05/19。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。