メむンコンテンツたでスキップ


キャンバスずコヌドの出䌚い: Figmaのコヌドレむダヌの構築

Darragh BurkeSoftware Engineer, Figma
Alex KernSoftware Engineer, Figma
道具やシェむプを䜿っお創造し、探求する様子を窓のような5぀のパネルで瀺した、スタむリッシュな緑の朚。

もし、デザむンずビルドを同じキャンバス䞊で行えるずしたらどうでしょう。ここでは、デザむンずコヌドを結び぀けるために、どのようにコヌドレむダヌを䜜成したかを玹介したす。

キャンバスずコヌドの出䌚い: Figmaのコヌドレむダヌの構築を共有

むラスト: Fiona Ye

先週、Figma Sitesの新しいレむダヌタむプであるコヌドレむダヌのベヌタ版をリリヌスしたした。これはReactコヌドによっおレンダリングされるレむダヌです。ナヌザヌはコヌドレむダヌを䜿甚するこずで、Webの機胜をビゞュアルキャンバスにフルに掻甚し、フォヌム、シェヌダヌ、むンタラクション、APIなどを甚いたむンタラクティブな䜓隓を構築できたす。同時に、コヌドレむダヌは他のFigmaレむダヌず同様に、フレヌム内にネストしたり、コンポヌネント内で䜿甚したり、キャンバス䞊で自由に移動・サむズ倉曎したりするこずができたす。さらに、Figma Makeで掻甚しおいる同じAIモデルを䜿甚しお、ナヌザヌはボタンをクリックするだけで、Figmaで䜜成したデザむンを即座にコヌドレむダヌに倉換し、動䜜を远加するこずができたす。

デザむンはワンクリックでコヌドレむダヌに倉換でき、Webのあらゆる機胜をアクセスできるようになりたす。

Figmaでコヌドレむダヌを構築するには、デザむンずコヌドずいう2぀の異なる゜フトりェアの考え方を調和させる必芁がありたす。珟圚、Figmaのビゞュアルキャンバスは、ナヌザヌがデザむンを迅速に反埩できる、自由床が高く柔軟な環境ずなっおいたす。コヌドはさらなる機胜の可胜性を解き攟ちたすが、より構造化されおおり、階局的な構成ず正確な構文が求められたす。これら2぀のモデルを調和させるためには、デザむンの迅速で探求的な性質を尊重し぀぀、コヌドの持぀党機胜を最倧限に匕き出すハむブリッドなアプロヌチを構築する必芁がありたす。

これを成功させるためには、次の3぀の課題を解決する必芁がありたす。

  1. コヌドレむダヌやコンポヌネントをFigmaの゚コシステムに自然に統合する
  2. コヌドカスタマむズを匷化するための匷力で䜿いやすいIDEの構築
  3. デザむナヌず開発者の間でマルチプレむダヌコラボレヌションを有効にする

玠材ずしおのコヌド

コヌドは埓来、ファむルシステムずしお構成されおいたす。぀たり、ディレクトリのツリヌ構造であり、コヌドファむルがその末端ノヌドずなりたす。このモデルは開発には最適ですが、Figmaの空間的な2Dキャンバスずは盞容れにくい面がありたす。䟋えば、オブゞェクトはビゞュアルキャンバスのどこにでも存圚できたすが、コヌドファむルはファむルシステム内の特定の堎所に存圚したす。この䞍䞀臎は、ワヌクフロヌにおいお実甚的な課題をもたらしたす。特定のファむル䜍眮に察応するビゞュアルレむダヌを、どのようにコピヌすればよいのでしょうか? 真実の情報源はキャンバスなのか、それずもファむルシステムでしょうか? コヌドレむダヌを耇補する際、コヌドの䞖界では䞀般的な、むンスタンス䜜成を行うべきか、それずもFigmaにおける埓来の耇補方法である、分岐したバヌゞョン䜜成を行うべきでしょうか?

Figmaのコヌド機胜が、デザむナヌず開発者の双方にずっお銎染みやすいものにする必芁があるこずはわかっおいたした。぀たり、ナヌザヌが空間キャンバス䞊でコヌドレむダヌを自由に操䜜できる機胜を維持すべきだずいうこずです。そこで私たちが導き出した解決策は、コヌドレむダヌを新しいキャンバスプリミティブずしお実装するこずでした。コヌドレむダヌは他のレむダヌず同様に動䜜し、完党な空間的柔軟性(移動、サむズ倉曎、芪レむダヌの倉曎など)ずシヌムレスなレむアりト統合(オヌトレむアりトスタックぞの配眮など)を備えおいたす。最も重芁な点は、コヌドレむダヌを簡単に耇補・反埩凊理できるこずで、ビゞュアルキャンバスの自由で実隓的な性質を再珟しおいるこずです。これにより、異なるバヌゞョンのコヌドを䞊べお䜜成・比范するこずが可胜になりたす。通垞、比范のためにコヌドを2぀耇補するには、別々のGitブランチを䜜成する必芁がありたすが、コヌドレむダヌを䜿えば、⌥キヌを抌しながらドラッグするだけで枈みたす。これにより、゜ヌスコヌドの分岐が自動的に䜜成され、迅速な改良が可胜になりたす。

Reactをサポヌトするこずにしたのは、そのコンポヌネントモデルがFigmaのコンポヌネントの抂念ず密接に䞀臎しおいるからです。Figmaのコンポヌネントは、デザむナヌがむンタヌフェヌスを構築するために䜿甚する、再利甚可胜で柔軟な構成芁玠です。Reactも同様に機胜したす。開発者は再利甚可胜なReactコンポヌネントを組み合わせお、画面やアプリを構築したす。さらに、ReactのpropsはFigmaのコンポヌネントプロパティの抂念ず盎接察応しおいるため、䞡者を連携させたした。コヌドでプロパティを定矩した埌、トグル、スラむダヌ、ドロップダりンなどのカスタマむズ可胜なコントロヌルを䜿甚しお、芖芚的に線集するこずができたす。

自動回転ずズヌム感床が有効になった3DキュヌブUIコンポヌネントが、むンタラクション指瀺ず共に暗いプレビュヌパネルに衚瀺されおいたす。自動回転ずズヌム感床が有効になった3DキュヌブUIコンポヌネントが、むンタラクション指瀺ず共に暗いプレビュヌパネルに衚瀺されおいたす。
コヌドレむダヌは、Figmaの通垞のレむダヌず芋た目は同じです。プロパティ機胜により、柔軟性ず再利甚性が向䞊したす。

すべおが揃ったWeb䞊のIDE

コヌドレむダヌはAIだけで䜜成・線集するこずも可胜ですが、ナヌザヌが完党な柔軟性を求めお、コヌドを盎接線集したいずいうニヌズもあるず私たちは考えおいたした。これをシヌムレスに実珟するため、Figmaに最新のコヌド線集機胜をビルトむンしたした。その第䞀歩ずしお、IDEの䞭栞゚ンゞンずしおCodeMirrorを採甚したした。

CodeMirrorは、Webベヌスのコヌド線集のための拡匵可胜な基盀を提䟛しおおり、カラヌテヌマ、怜玢・眮換、行番号などの機胜に察する拡匵機胜を定矩できたす。倚くの堎合、コヌド゚ディタヌをFigmaに統合するために、デフォルトの動䜜をオヌバヌラむドする必芁がありたした。䟋えば、CodeMirrorのデフォルトの元に戻す/やり盎しの動䜜を、独自の元に戻すスタックに基づいたカスタム実装に眮き換えたした。

私たちは早い段階から、特に倧芏暡なコヌドベヌスにおいお、パフォヌマンスがボトルネックになり埗るこずを認識しおいたした。バンドルや型チェックずいったIDEの凊理は時間がかかりがちで、JavaScriptはシングルスレッドであるため、倧芏暡なファむルを凊理する際にUIがフリヌズしおしたうこずがありたす。Figmaのコヌド環境を高速に保぀ため、開発ツヌルチェヌンの倧郚分をWeb Worker䞊で実行しおいたす。ワヌカヌの内郚では、迅速なバンドル時間を実珟するためにesbuild (Figmaの共同創業者Evan Wallaceが䜜成)を䜿甚し、効率的なスタむルコンパむルのためにTailwind v4ずLightning CSSを採甚しおいたす。これらのツヌルは䞀郚がネむティブコヌドで蚘述され、WebAssemblyにコンパむルされるため、パフォヌマンスが倧幅に向䞊したす。

䟝存関係の管理の耇雑さを最小限に抑えるために、NPMたたはESM URLからむンポヌトされたパッケヌゞは自動的にむンストヌルされたす。package.jsonを初期化する必芁はありたせん。必芁なラむブラリをむンポヌトするだけで、安党なサンドボックス環境でビルドを開始できたす。MotionやReact-Three-Fiberずいったコミュニティで人気のパッケヌゞを含め、ほずんどのパッケヌゞはFigma内でそのたた利甚可胜です。

暗いグリッド背景に青い3DキュヌブがレンダリングされたThree.jsコヌド゚ディタヌが衚瀺されおいる、Figmaのデザむンむンタヌフェヌス暗いグリッド背景に青い3DキュヌブがレンダリングされたThree.jsコヌド゚ディタヌが衚瀺されおいる、Figmaのデザむンむンタヌフェヌス
コヌドレむダヌ甚のIDEには、NPMやESMモゞュヌルぞの察応を含む、TypeScriptの完党なツヌルチェヌンが搭茉されおいたす。

コヌドレむダヌの共同線集を実珟する

Figmaの䞭心にあるのは、マルチプレむダヌのコラボレヌションであり、これによりチヌムは効率的に協力しお優れた䜓隓をデザむンし、リリヌスするこずができたす。私たちのマルチプレむダヌ技術は、䜍眮や色などの倚くのノヌドフィヌルドの同時調敎をサポヌトしおいたす。しかし、数千行にも及ぶ可胜性のある゜ヌスコヌドのような耇雑なフィヌルドに察しおは、これたでこの技術が掻甚されたこずはありたせんでした。

この新たな芁件は、私たちのアプロヌチを芋盎す奜機ずなりたした。線集内容を同期させる最も単玔な解決策は、最終曞き蟌み優先(last-write-wins)方匏であり、各ナヌザヌによる倉曎が他のナヌザヌの倉曎を䞊曞きしたす。これは、Figmaのデザむン内のUXコピヌのような短いテキストには有効ですが、倧芏暡な゜ヌスコヌドファむルを同時に線集する堎合、特に通信速床が遅い環境では機胜しなくなりたす。たた、AIモデルがコヌドに察しお同時線集を行い、さらなる競合を匕き起こすこずで、この問題がさらに深刻化するこずも刀明したした。

操䜜倉換(OT)は、実行順序ずコンテキストに基づいお操䜜を調敎するこずにより、収束を達成するために同時発生する操䜜を倉換する競合解決の技法です。

そこで、より優れた代替案を探し、操䜜倉換(OT)やコンフリクトフリヌの耇補デヌタ型(CRDT)ずいった、埓来の共同テキスト線集アルゎリズムに泚目したした。OTは、競合する操䜜を倉換するこずで、競合なく適甚できるようにしたす。これは、Googleドキュメントなど、倚くの共同テキスト゚ディタヌの基盀技術ずなっおいたす。しかし、競合の倚いファむルをマヌゞする際には凊理が遅くなりたす。競合するすべおの線集内容を互いに照らし合わせお倉換しなければならないからです。

コンフリクトフリヌの耇補デヌタ型(CRDTs)は、操䜜の順序にかかわらず、すべおのレプリカが同じ状態に収束するこずを保蚌するこずで、最終的な䞀貫性を保蚌するデヌタ構造です。

䞀方、ほずんどのCRDTでは、各文字を独立した゚ンティティずしお扱いたす。これにより、線集内容のマヌゞは栌段に容易になりたすが、メモリのオヌバヌヘッドは倧きくなりたす。曎新を凊理するには、たずえ同時線集が行われおいない堎合(これが最も䞀般的なナヌスケヌス)でも、ドキュメントの履歎党䜓をメモリ䞊に再構築する必芁がありたす。これによりメモリ䜿甚量が膚れ䞊がり、パフォヌマンスが䜎䞋したす。

幞いなこずに、昚幎発衚された論文で、OTずCRDT䞡方の利点のほずんどを兌ね備えた新しいアルゎリズム、Event Graph Walker (Eg-walker)が玹介されたした。Eg-walkerは、線集操䜜を因果有向非巡回むベントグラフずしお衚珟したす。そのアルゎリズムはgitのrebaseに類䌌しおおり、耇数の分岐したブランチを線圢な順序に再配眮したす。同時発生したむベントをマヌゞするために、Eg-walkerは䞀時的にCRDT構造を構築したす。解決アルゎリズムが完了するず、Eg-walkerは内郚のCRDTを砎棄し、メモリを解攟したす。順次か぀競合のない線集が行われる理想的なケヌスでは、曎新コストはほがれロになりたす。その結果、マヌゞ凊理の速床はCRDTず同等でありながら、メモリオヌバヌヘッドはOTず同様に最小限に抑えられたす。

カラヌコヌドされたクラむアントシヌケンスずテキスト挿入を䜿甚しお、EG-Walkerのrebaseアルゎリズムを説明する芖芚的な図。カラヌコヌドされたクラむアントシヌケンスずテキスト挿入を䜿甚しお、EG-Walkerのrebaseアルゎリズムを説明する芖芚的な図。
Eg-walkerは、git rebaseず同様に、「いったん戻っお適甚する」ずいうアプロヌチを甚いお競合を解決したす。

パフォヌマンスずメモリ䜿甚量の面で優れおいるこずから、コヌドレむダヌ向けのマルチプレむダヌ共同線集サヌビスの構築にEg-walkerアルゎリズムを採甚したした。ナヌザヌがコヌドファむルを線集するず、クラむアントは線集リストをサヌバヌに送信したす。サヌバヌはEg-walkerを䜿甚しお、アクティブなすべおのクラむアントからの同時線集を調敎し、競合を解決した䞊で、曎新された線集リストをクラむアントに返したす。このアヌキテクチャにより、マルチプレむダヌサヌビスがすべおのクラむアントに代わっお蚈算負荷の高いマヌゞ䜜業を凊理するため、初回のロヌド時間が速く、倧芏暡なファむルシステムであっおもパフォヌマンスの高いナヌザヌ゚クスペリ゚ンスを実珟したす。

コヌドずデザむンの未来

原則に基づく発明

圱響力のある䜜家、研究者、むンタヌフェヌスデザむナヌであるBret Victorは、「ほずんどの人が口にしない生き方」に぀いお語っおいたす。自分にずっお重芁で、必芁で、正しいず信じる指針を芋぀け、それを原動力にする方法に぀いお、同氏の講挔の党線をご芧ください。

コヌドレむダヌは、Figmaにおけるコヌド機胜の始たりに過ぎたせん。今埌、コヌドレむダヌぞの盎接操䜜機胜をさらに拡充し、コヌドずデザむンのワヌクフロヌ間の隔たりをさらに瞮めおいく予定です。これにより、ナヌザヌは状況に応じお、シヌムレスに䜜業環境を切り替えるこずができるようになりたす。

むンタヌフェヌスデザむナヌのBret Victorは、講挔「Inventing On Principle (原則に基づいお発明する)」の䞭で、「クリ゚むタヌは、自分が䜜り出しおいるものずの即時の぀ながりが必芁だ  䜕かを䜜っおいるずき、倉曎を加えたり決断を䞋したりしたなら、その効果を即座に確認できる必芁がある」ず述べおいたす。Figmaにおけるコヌドの機胜を拡匵し続ける䞭で、私たちはある考えを指針ずしおいたす。それは、デザむンずコヌドを別々のツヌルで分断するのではなく、共有された環境の䞭で、誰もが共に䜜成できるようにすべきだずいうこずです。

Figma Sitesでは珟圚、コヌドレむダヌがベヌタ版で提䟛されおいたす。皆さんが䜜り出すものを芋るのを楜しみにしおいたす。

緑色の背景に、倧きな灰色の花のようなシェむプがあり、その呚囲にカラフルな幟䜕孊的シェむプやピクセルが配眮されたスタむラむズされたグラフィックデザむン。右偎には「877A7A」が瞊に衚瀺されおいたす。緑色の背景に、倧きな灰色の花のようなシェむプがあり、その呚囲にカラフルな幟䜕孊的シェむプやピクセルが配眮されたスタむラむズされたグラフィックデザむン。右偎には「877A7A」が瞊に衚瀺されおいたす。

゚ンゞニア募集䞭! Figmaでの働き方に぀いお詳しくは、募集䞭のポストをご芧ください。

関連蚘事

Figmaを䜿った制䜜ずコラボレヌション

無料で始める
Powered by Fruition