【Figma Plugins】はじめてのFigmaのプラグイン作り（セットアップ）

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/7eeca709-ed9a-cbcb-dc7a-5349f7b1e54c.png)

## はじめに
みなさんは、Figmaのプラグインを作ろうとしたことがありますか？
私は、デザインテクノロジストとして、デザイナーの業務効率化をしようとFigmaのプラグインの作り方を調べていたら、JavaScriptか、TypeScriptが触れれば、意外と簡単に開発することができるのだとわかりました。
そのため、この記事では、Figmaプラグインの作りの第一歩である、セットアップの方法についてまとめます。

この記事では、以下の公式ドキュメント通りに、できるだけわかりやすく、初心者でもわかりやすくまとめようと思っています。
この記事を読みながら、詰まったところがあれば、コメントで教えていただけたら、記事を更新していきたいと思っているので、ぜひコメントもお願いします。

https://www.figma.com/plugin-docs/

## 事前準備
Figmaのプラグインを作るにあたって、まずは、事前準備です！

事前準備で用意するのは以下の通りです。

### ① Figmaのデスクトップ アプリ
Figmaのプラグインを作るには、**Figmaのデスクトップアプリ** をダウンロードする必要があります。
以下のリンクからお使いのPCに合わせて、ダウンロードしてください。

https://www.figma.com/ja/downloads/

### ② エディタ
使い慣れたもので大丈夫ですが、**Visual Studio Code** か **IntelliJ IDEA** がおすすめです。
この記事では、**Visual Studio Code** のスクショを用いて説明します！

以下のリンクからダウンロードしてください。

https://code.visualstudio.com/

https://www.jetbrains.com/idea/


### ③ Node.js
Figma 公式から TypeScript を使って開発することが推奨されているいます。
TypeScriptで開発がしたい方は、Node.jsが必要です！ 

以下のリンクから、Node.jsをインストールしてください。

https://nodejs.org/en/download/

**【インストールされているか確認する】**
ターミナルで、以下のコマンドを入力して、インストールしているバージョンが表示されたら、インストールが完了しています！

```terminal.
node -v
```

## テンプレートからプラグインを開発する
事前準備の3点が用意できたら、早速プラグインの開発を始めます！

### ① Figmaのデスクトップ アプリからテンプレートをダウンロードする
#### A. Figmaの新規の Design File を作成する
Figmaのデスクトップ アプリを開き、Design Fileを作成します。
Draft で作成して、問題ありません。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/2f76f805-351f-09c7-fbd9-fe37e886eb5c.png)


#### B. Figmaのデスクトップ アプリからテンプレートをダウンロードする
`Plugins > Development > New plugin..` を選択します。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/11088b19-471c-8454-7fe5-c83001c0fead.png)
　 

その後、表示されたモーダルが表示されるため、Plugin名を入力し、Pluginを動かす範囲を選択します。

+ **Figma design + FigJam** を選ぶ
    + Figma の file と FigJam の board 両方で動くプラグインを開発したい場合、こちらを選んでください
+ **Figma design** を選ぶ
    + Figma の file だけで動くプラグインを開発したい場合、こちらを選んでください

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/2889e8f2-91ca-fc69-b199-2be4b36904e9.png)
　 

そして、プラグインのタイプを選択します。

+ **Default** を選ぶ
    + 必要最小限のファイルのみがダウンロードされるため、は、こちらをえらんでください
+ **Run Once** を選ぶ
    + プラグイン起動時に表示されるWindowを表示しないで起動するプラグインを作る場合、こちらを選んでください
+ **Custom UI** を選ぶ
    + プラグイン起動時に表示されるWindowを必要とするプラグインを作る場合、こちらを選んでください
    + 説明では、こちらを選択して進めます

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/99840508-1f87-7889-4c7b-75ecc83ad2f6.png)
　 

その後、テンプレートの保存場所を選び、Figmaのテンプレートをダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/582ecbc4-70fe-156e-d37d-756910c19aa4.png)

### ② 開発環境を整える
テンプレートをダウンロードしたら、開発環境を整えていきましょう！

#### A. エディタでダウンロードしたテンプレートを開く
エディタを開き、先ほどダウンロードした :file_folder: フォルダを選択します。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/b9747c9f-5e09-a65c-6153-e106a0d1499d.png)


#### B. 作成したフォルダ配下で TypeScript と Figma の型定義ファイルをインストール
ターミナルを開き、以下のコマンドを入力し、TypeScript と Figma の型定義ファイルをインストールします。

```terminal.
npm install -D typescript @figma/plugin-typings
```

#### C. TypeScript をインストールされているか確認する
以下のコマンドを入力し、TypeScriptがインストールされているか確認します。
インストールしているバージョンが表示されたら、TypeScriptはインストールされています。

```terminal.
tsc -v
```
　 

:::note warn
**【TypeScriptがインストールされていなかったら....】**
インストールしているバージョンが表示されなかったら、エディタを再起動してください。

それでも、ダメだったら...
以下のコマンドから、TypeScriptを再インストールしましょう！
`npm install -D typescript`
:::


### ④ Plugin を立ち上げる
開発環境が整ったら、早速Pluginを立ち上げてみましょう！


#### A. TypeScript コンパイルの設定を行う
Figma Pluginsはブラウザで実行されるため、TypeScript を JavaScript にコンパイルする必要があります。
以下のコマンドを入力するか、以下の操作をし、自動コンパイルされるようにします。

**【コマンドでやる場合...】**
```terminal.
npm run build -- --watch
```

**【エディタで操作する場合...】**
+ **win** の場合
    + `Ctrl + Shift + B` を押し、 `watch-tsconfig.json` を選択してください
+ **mac** の場合
    + `Command + Shift + B` を押し、 `watch-tsconfig.json` を選択してください

#### B. Figmaのデスクトップ アプリで Plugin を立ち上げる
`Resources > Plugins > Development > 開発中の Plugin` を選択し、Plugin を立ち上げる

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/01a4022d-6c4b-f5b1-befd-a6c96535d05f.png)


#### C. 開発準備完了!
Plugin を立ち上げたら、Plugin の window が表示されたら、開発準備完了です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/f3a333ae-26aa-bf3e-03bb-042ede9daf69.png)

## Figma Plugins の仕組み
### ⚪︎ ファイル構成
#### :file: manifest.json
プラグインのメタ情報を記述する必須ファイル。プラグイン生成すると自動的に簡単な manifest.json が作成されます。

詳しい解説はこちらをご覧ください。

https://www.figma.com/plugin-docs/manifest/

#### :file: code.ts

メインスクリプトのソースファイルです。
figma APIを利用することでfigma上の操作が可能。

https://www.figma.com/plugin-docs/api/api-reference/

#### :file: code.js

`code.ts` をコンパイルしてできた、Figmaが実際に読み込むファイルです。

#### :file: ui.html
UI の HTML ファイル。
基本的に UI で必要となる CSS と JavaScript はすべてこのファイルに記述する必要があるため、CSS は style タグかインライン CSS、JavaScript はインライン script を使うことになります。

#### :file: package.json
Plugins開発に必要なパッケージのメタデータ記述されているファイルです。

#### :file: tsconfig.json
TypeScript の設定ファイルです。


### ⚪︎ 動作の仕組み
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/6ea41a42-6fcc-e912-c56d-e7027c510faa.png)

パフォーマンス向上のため、プラグインのメインコードは、最小のJavaScript 環境であるサンドボックス内のメインスレッドで実行されます。
そのため、XMLHttpRequestやDOMなどのブラウザAPIは、サンドボックスからは直接利用できません。

また、ブラウザAPIを使ったり、プラグインのカスタムUIを表示するには、iframeで表示されるHTMLやJavaScriptを書くことでアクセスすることができます。

#### UIからメインコードへメッセージを送る 

UI側 (iframe)からメインコード側へデータを送るには以下のようにします。 

```ui.html
<script>
    parent.postMessage({ pluginMessage: 'anything here' }, '*')
</script>
```
上記のように、`<script>`タグ内に、`parent.postMessage({ pluginMessage: { /* 送りたいデータ */ } }, '*')` の形にすることで、送ることができます。

また、メインコード側でデータを受け取るには、以下のようにします。

```code.ts
figma.ui.onmessage = (message) => {
  console.log("got this from the UI", message)
}
```
上記のように、`figma.ui.onmessage` を使い、引数の `message` に UI側で指定した`pluginMessage`を受け取り、メインコード側で使うことができます。


#### メインコードからUIへメッセージを送る
メインコード側からUI側 (iframe)へデータを送るには以下のようにします。 

```code.ts
figma.ui.postMessage('anything here')
```
上記のように、 `figma.ui.postMessage()` を使い、引数にUI側へ送りたいデータを設定します。

また、UI側で、メインコード側からのデータを受け取るには以下のようにします。

```ui.html
<script>
    onmessage = (event) => {
        console.log("got this from the Main", event.data.pluginMessage )
    }
</script>
```
上記のように、`onmessage` を使い、引数の `event.data.pluginMessage` にメインコード側でしたいしたデータを受け取ることができます。

## まとめ
この記事では、Figmaのプラグイン作成におけるセットアップの方法について紹介しました。
今後、Figmaのプラグインを作成するにあたって、勉強したことをQiitaにアウトプットしていこうと思っているので、よかったら、Qiitaのフォローお願いします

---

最後まで読んでくださってありがとうございます！

普段はデザインやフロントエンドを中心にQiitaで記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。

https://twitter.com/degudegu2510