ロコガイド テックブログ

「地域のくらしを、かしこく、たのしく」する、株式会社ロコガイドの技術部ブログです。主にトクバイ・ロコナビのサービス開発について発信しています。

「地域のくらしを、かしこく、たのしく」する、株式会社ロコガイドの技術部ブログです。
主にトクバイ・ロコナビのサービス開発について発信しています。

ゼロから始めるFigma Plugin② 〜Boilerplate導入編〜

eyecatch

こんにちは!ロコガイド 技術部バックエンドグループの @ar_tama です。
第1回から随分間があいてしまいましたが、第2回の更新です!

先日、デザイナーの id:rei-suzuki と社外向けに1つプラグインを公開しました。 techblog.locoguide.co.jp

もうひとつ社内向けにもプラグインを作ってるのですが、そちらのご紹介は id:rei-suzuki に譲るとして、
今日は開発を進める上で出会った素敵なBolierplateについて紹介します。

Figma Plugin TypeScript Bolierplate

https://github.com/aarongarciah/figma-plugin-typescript-boilerplate

Figma PluginはTypeScriptを使って開発することは第1回でも触れたとおりですが、
こちらはそれを更に拡張して最適な土台を作ってくれます。
デフォルトで

  • TSのコンパイル
  • Linterやwebpack等々のデフォルト設定
  • テスト(Jest)
  • ビルド・テストのGithub Actions
    • Node12系、13系で動かしてくれる
  • UI.html のビルド
    • css, js(ts)のファイルを分けて管理できるようにしてくれている

の機能が揃っています。
簡単なプラグインの作成であれば導入はほぼ不要なものですが*1
改修を重ねてtsファイルが肥大化した・しそうなプロジェクトには早めに導入するとたいへん幸せになれます。
※ 詳しくはこちら

導入方法

新規プロジェクトに導入する場合

Quick Startを参考にファイルを配置後、
npm install npm run dev して開発をスタートします。簡単ですね!

src 以下には各コードのボイラープレートもありますので、適宜参考にしながら書き換えていくのがよいですね。
具体的にはplugin / UI間でのメッセージングのInterfaceなどが用意されています。

既存のプロジェクトに導入する場合

今回は既に進行しているプロジェクトに導入したので、このように進めていきました。

1. 既存のファイルを退避する

コンフリクトを避けるために、既存のファイルは予めバックアップしておきましょう。

  • manifest.json
  • code.ts
  • ui.html
  • (独自に設定している場合は)tsconfig.json

2. Boilerplateを導入する

プロジェクトのディレクトリで
npx degit https://github.com/aarongarciah/figma-plugin-typescript-boilerplate
npm install
した後に、退避したファイルを配置していきます。

  • manifest.json, config → ルートディレクトリ
    • 一部boilerplateの設定を反映させる必要があるので注意(★例
  • code.ts → src/plugin/
  • ui.html → src/ui/

3. 動作確認をする

npm run dev でビルド後、Figma Pluginが動作するか試してみましょう。

小ネタ

このBoilerplateを利用したプラグインは、 dist 以下にビルド結果が出力されます。
デフォルトではgitignoreに指定されてしまっているので、
(Developer Modeでの配布など)ビルド後のファイルを含める必要があればignoreから外しましょう。
また、このような運用の場合はcommit hook等で npm run build しておくと更に便利ですね。

おわりに

「せっかくTSで開発しているんだし、主要ロジック部分のテストが書きたい」と思ったのが
このBolierplateを見つけたきっかけでした。*2

結果コードも整理され(UI側のファイルが分割できた・TSを導入できたのが本当に嬉しい)、
中程度以上の規模のプロジェクトの生産性をさくっと爆上げしてくれると感じています。
皆さんもぜひ試してみてください💪

*1:Dark Mode Switcherでは使用していません

*2:そのテストについては次回のエントリで取り上げたいと思います