
预备知识
Figma 插件开发本质上是 web 开发,你需要了解基础的 web 开发知识,比如 HTML、CSS、JavaScript。当然,如果要开发一些功能复杂的插件,也许你需要用到一些更高级的工具,比如 TypeScript、Webpack、React 等,但这些对于入门来说不是必要的。
不过,要完成本教程,你需要掌握 TypeScript……的安装。
如果还没有对最基本的 HCJ(HTML,CSS,JavaScript)很熟悉,建议先去学习这些知识,然后再尝试 Figma 插件的开发。
开发环境搭建
编辑器
首先你需要一个编辑器,最常用的是 VSCode。如果你还没有一个趁手的编辑器,那说明你还没有上手 web 开发,大侠请先修炼……
关于 TypeScript:在 Figma 官方的入门教程中已经开始默认使用 TypeScript,它能够在开放过程中帮你做到类型控制,这对复杂的插件开发环境来说是很有帮助的。但是,这也会提高初学者的入门门槛。本质上 TypeScript 也是会被编译成 JavaScript 运行的,所以在你自己的各种插件 demo 里,只用 JavaScript 也是可以的。
下载 Figma 桌面端应用
要调试你的插件,必须先装一个 Figma 的桌面端应用。因为开发过程中你的代码是在你的本地跑的,只有本地的桌面端 app 才能读取和让你调试。Figma desktop app 下载地址。
如果你已经安装了 Figma 的桌面端应用,确认一下升级到了最新版本。
新建插件
进入 Figma 桌面端以后,登录自己的账号,然后新建一个文档。
顶部菜单栏 > 插件 > 开发 > 新建插件
也就是: Menu > Plugins > Development > New Plugin 然后 Figma 有一个向导,会快速帮你搭建一个新插件。
我们选“从模板生成”(Generate from template),随便设置一个名字,比如 My First Plugin ,然后继续。选择“有界面和浏览器接口”(With UI & browser APIs)的模板。这个模板会生成一个 webview 界面,这种所见即所得的形式更能帮助我们上手和理解。

将项目保存到本地后,Figma desktop 会提示你需要安装 node.js,还建议你安装 TypeScript 和 查阅开发文档。这里要保证你安装过 node.js 。
至于 TypeScript……好吧,既然这个模板预置了,那我们就装一下。
用 VSCode 打开你本地保存的插件项目文件夹。打开命令行 control + ~ 输入:
npm install -g typescript // 不想给你的所有项目都安装,则不要加 -g
在 VSCode 中使用快捷键 ⌘⇧B (Windows 系统 Ctrl-Shift-B) 来唤起 build 任务。选择
tsc: watch - tsconfig.json

这让 VSCode 将 ts 文件编译成 js 文件,并且时刻监视 ts 文件保存了的变化,保持同步编译。
现在项目编译好了,我们可以来试一下运行这个插件。
运行插件
选中 Figma desktop。
顶部菜单栏 > 插件 > 开发 > My First Plugin
**
运行完以后,你会看到弹出一个 webview 窗口,这是一个方块生成器,它让你选择生成方块的数量。
然后,点击 Create 按钮,方块就生成到画布上了。(同时窗口会消失)
很有意思,我们的插件这就跑通了。那么我们来尝试着改点什么东西。
文件结构
首先我们要看一下这个插件的组成成分:
My First Plugin+-- manifest.json // 插件配置文件+-- ui.html // webview UI 界面+-- code.ts // 插件逻辑脚本+-- code.js // 编译后的 js 脚本+-- figma.d.ts // Figma 的类型定义文件+-- tsconfig.json // TypeScript 配置文件+-- README.md // 项目的说明书
我们只需要关心前三个就行了。其他的都是和编译或项目配置相关的文件。
manifest.json
货物清单,也就是插件的配置文件。
{"name": "My First Plugin","id": "82867295060577xxxx","api": "1.0.0","main": "code.js","ui": "ui.html"}
描述了插件的名字、唯一编号、版本。最主要的,约定了主入口 main 是 code.js 这个由 code.ts 编译出的脚本文件。还约定了交互界面 ui 是 ui.html 这个文件。
那么逻辑脚本文件里是什么呢?
code.ts
我们看一下这个 ts 文件。
figma.showUI(__html__);figma.ui.onmessage = msg => {if (msg.type === 'create-rectangles') {const nodes: SceneNode[] = [];for (let i = 0; i < msg.count; i++) {const rect = figma.createRectangle();rect.x = i * 150;rect.fills = [{type: 'SOLID', color: {r: 1, g: 0.5, b: 0}}];figma.currentPage.appendChild(rect);nodes.push(rect);}figma.currentPage.selection = nodes;figma.viewport.scrollAndZoomIntoView(nodes);}figma.closePlugin();};
一上来,先 figma.showUI(__html__); 显示 UI 界面。Figma 怎么知道显示哪个界面?就是 manifest 文件的 ui 入口指定的那个文件。
然后,Figma 在等待和监听从界面传来的 postMessage。一旦监听到,则调用这个回调函数。figma.ui.onmessage = msg => {...}
通过传入的参数 msg 的 type 属性,判断界面传来的请求类型。如果是 create-rectangles 那么就执行生成方块的脚本。
过程是:
- 调用 Figma API,生成指定数量的 rect 形状,使用规定的间隔、填充色。
- 在 Figma 的当前 Page 内,添加这些方块。
- 选中所有这些方块,并确保他们在当前视图中显示。
- 最后关闭 UI 界面。
ui.html
来看一眼 web 界面,比较简单的 html 定义了这个 webview。
<h2>Rectangle Creator</h2><p>Count: <input id="count" value="5"></p><button id="create">Create</button><button id="cancel">Cancel</button><script>document.getElementById('create').onclick = () => {const textbox = document.getElementById('count');const count = parseInt(textbox.value, 10);parent.postMessage({ pluginMessage: { type: 'create-rectangles', count } }, '*') // here}document.getElementById('cancel').onclick = () => {parent.postMessage({ pluginMessage: { type: 'cancel' } }, '*')}</script>
可以看到,当按钮 Create 被点击时,界面会发送一个 postMessage,它的 type 是 create-rectangles ,从而触发了我们 code 脚本中的操作。
改点什么
要真的理解这里是怎么玩转的,我们总要试着改点什么东西然后让它跑通。研究一下逻辑脚本 code.ts ,然后试着改点啥。
比如说,这些方块颜色都是一样的,太单调了。我们让他们随机生成颜色吧。
随机颜色
先看看目前的颜色是怎么确定的。
rect.fills = [{type: 'SOLID', color: {r: 1, g: 0.5, b: 0}}];
显然,这一行设定了 rect 这个对象的 fill 属性为一个确定的 rgb 组合颜色。但这个格式和我们以往见到的颜色格式不太一样,我们来查看一下 Figma 的开发文档。
我们可以在 Figma 的开发者官网找到他们的 API 文档。通过搜索和查阅找到了其 RGB/RGBA 相关的接口。原来,在 Figma 中对 rgb 颜色的定义不是我们通常看到的 0~255 的值域,而是映射成了 0~1 的数值。
没关系,那我们来生成 3 个 0~1 的随机数,然后安排给 r/g/b。
巧了,JavaScript 里我们用 Math.random() 来生成的随机数正好也在 [0, 1) 中,虽然有个开区间问题,但是可以忽略不计。
rect.fills = [{type: "SOLID",color: { r: Math.random(), g: Math.random(), b: Math.random() },},];
我们保存一下代码,因为 VSCode 还在 watch 中,所以插件应该完成了实施编译。
我们重新打开 Figma desktop,运行一下我们的插件。

当当当党!果然随机颜色了(虽然很难看)!
总结
好了,你已经完成了你的第一个 Figma 插件。
接下来,就可以多看看 Figma 官网的插件开发教程、API 文档,来探索一下还能创造些什么提效的玩意儿吧!
