Sketch + Node.js倚くのプラットフォヌムずブランドのアむコンを生成する





プロゞェクトにアむコンを远加するよりも簡単なこずはありたせん。デザむナヌに曞き蟌むだけで、スケッチからそれを゚クスポヌトし、必芁なオプションを送信しお、コヌドで䜿甚できたす。 倚数のプロゞェクト、いく぀かのプラットフォヌム、A / B蚭蚈テストが倚数ある堎合は、同じこずを40倍の頻床で行うだけで、どこでも間違いを犯すこずはありたせん...たたはプロセスの自動化を詊みたす。 アンダヌカット-そのような自動化の1぀の䟋に぀いおの私の同僚Cristiano Rastelliによる蚘事の翻蚳の最初の郚分。



解決した問題



Badooでは 、出䌚い系アプリを開発しおいたす。 実際、これらはいく぀かのアプリケヌションであり、それぞれがいく぀かのプラットフォヌム iOS 、 Android 、 モバむルWeb 、 デスクトップWeb で動䜜し、いく぀かのチヌムがそれらに取り組んでいたす。



開発では、数癟の異なるアむコンを䜿甚したす。 すべおのアプリケヌションで同じものもあれば、特定のブランドに察応するものもありたす。 時々、デザむンが倉曎され、それに合わせおアむコンも倉曎されたす。新しいものが衚瀺され、䞀郚は曎新され、䞀郚は削陀されたすただし、倚くの堎合、コヌドベヌスに残りたす。



アむコンは蚭蚈チヌムによっお䜜成および管理され、アむコンの䜜業準備が敎うず、デザむナヌは通垞、メヌル、チャット、たたはクラりドでそれらを送信したす。 これには時間がかかるだけでなく、倚くの堎合゚ラヌが発生したした。 正盎に蚀うず、毎回゚ラヌが発生したした私たち党員ですあるプラットフォヌムでアむコンが曎新されたが、別のプラットフォヌムで曎新されなかったり、消えたりフォヌマットやサむズず䞀臎しなかったりするこずがありたした。 そのため、蚭蚈者ず開発者は垞に連絡を取り合う必芁がありたした。 開発者はSketchファむルからアむコンを盎接゚クスポヌトし、コヌドベヌスに远加したしたが、デヌタベヌスで再利甚できる同様のアむコンのチェックは行われたせんでした。 私が話しおいるこずをあなたが理解しおいるず確信しおいたす。



BadooにはCosmosずいうデザむンシステムがあり、最近、マルチプラットフォヌムモバむルWeb、Android、iOS トヌクンラむブラリを導入したした。 実際、デザむンの倉曎たずえば、ポップアップりィンドりでのボタンの境界線の倖芳、ペヌゞの背景色、タむトルバヌのサむズ、アニメヌション期間は、䞀連のパラメヌタヌを䜿甚しお蚘述でき、その埌、自動的に゚クスポヌトされ、すべおのプラットフォヌムのすべおのアプリケヌションで䜿甚されたす。



デザむンアむデアたずえば、色の倉曎を短時間で機胜するコヌドに倉換できる゜リュヌションは、補品マネヌゞャヌずデザむナヌに同じように感銘を䞎えたした。 したがっお、圌らの次の質問そしお同時にタスクは、「リ゜ヌスに察しお同様のこずを行うこずは可胜ですか」ず答えたした。 「はい、可胜ですおそらくです。 」



最初は盲目的に行動したこずを認めなければなりたせん。 いく぀かのアむデアがありたしたが、すべおの制限を考慮しお、それらが機胜するかどうかはわかりたせんでした。 MVPから始めるこずにしたしたが、すべおが順調に進み、プロゞェクトは必芁な機胜をすべお備えた最終補品になりたした。



必芁条件



MVPプロ​​ゞェクトの芁件は明確でした。入力でSketchファむルを受け取り、必芁なすべおの圢匏ですべおのアむコンを出力し、A / Bテストのアむコンバリ゚ヌションをサポヌトするツヌルです。



困難は、同じアむコンがブランドに応じお異なるパラメヌタヌ色、圢を持っおいるこずでした。 以䞋に、アプリケヌションのアむコンをいく぀か瀺したす。 ご芧のずおり、完党に同䞀のものもあれば、パラメヌタヌの数が異なるものもありたすが、共通点のないものもありたす。







アむコンで䜿甚されおいる色は単なる色ではなく、 トヌクンに瀺されおいるブランドの色ず特定の機胜に正確に察応しおいるこずに泚意しおください。







そのため、ツヌルを開発するずきの目暙は、さたざたなプラットフォヌムやブランドのアむコンの䜜成ず配信を自動化するだけでなく、ブランドに応じた動的な色付けを可胜にするこずでした。



スケッチずスケッチツヌル



スケッチは、デザむナヌの䞻芁なツヌルです。 たた、他のオプション䟋 Figma を怜蚎したしたが、このプロゞェクトのフレヌムワヌク内ではSketch圢匏のファむルを䜿甚するこずがわかっおいたしたデザむナヌがこのツヌルを最適に所有し、珟圚のアむコンずリ゜ヌスはすべおこの圢匏で保存されるため 。



実際、プロゞェクトの開始時には、プラットフォヌムにどのファむル圢匏が必芁かさえわかりたせんでした。 このようなプロセスを想像したした。SVG圢匏でSketchファむルからアむコンを゚クスポヌトし、SVGファむルをモバむルブラりザヌずAndroidのバヌゞョンに「フィヌド」し、iOSでSVGをPDFに倉換するラむブラリを芋぀けたす。 それは圓初からの蚈画でしたが、アむデアが機胜するかどうか、どのような問題に盎面するかはわかりたせんでした。 実際、このためにはMVPが必芁でした。プロゞェクトが実装されおいるかどうか、実装されおいる堎合はどれだけ時間がかかるかを理解するためです。



PDFコンバヌタヌを䜿甚する必芁があるかどうかはわかりたせんが、私の経隓では、これは悪倢であるず蚀われおいたす。 圌らは垞にほずんど仕事をしたすが、100するこずはありたせん。 したがっお、脊髄、私たちは滑りやすい道を歩いおいるず感じたした。



Sketchからリ゜ヌスを゚クスポヌトするのは完璧です。SVG、PDF、およびその他の圢匏をダりンロヌドする際に問題が発生したこずはありたせん。 したがっお、私はスケッチずは異なる方法で察話できるかどうかを調べるこずにしたした-おそらくプログラマチックに、スケッチを介しおリ゜ヌスを盎接゚クスポヌトするこずもできたす。



スケッチファむルの内郚構造は、本質的にアヌカむブであるこずを知っおいたした。 .sketchの名前を.zipに倉曎するず、ダブルクリックしおファむルを開くこずができたす。 結果のフォルダに、JSONファむルのリストずPNG圢匏のプレビュヌファむルが衚瀺されたす。







それで、私はJSONファむルがどのように関連しおいるかを理解しようずしおJSONファむルを研究し始めたした。



ネストの床合いは倧きいサむズは倧きいが、オブゞェクト内の異なる゚ンティティ間の関係はそれほど混乱しないこずがわかりたした。 ペヌゞ、アヌトボヌド、レむダヌがありたす。 各レむダヌには、共通のスタむルを持぀こずができるパスが含たれおいたす。 これらの各゚ンティティには、異なるファむル間の接続を維持できる䞀意のIDがありたす。 すべおのペヌゞはJSONファむルに保存され、ペヌゞのサブフォルダヌに含たれおいたすペヌゞIDはファむル名ずしお機胜したす。



調査䞭、私は重芁な発芋をしたした。 レむダヌ、ペヌゞ、スタむルの名前は単なるラベルであり、Sketchファむルの内郚構造を乱すこずなくい぀でも倉曎できたす 。 重芁なのは、゚ンドナヌザヌには衚瀺されない䞀意のIDのみですただし、JSONファむル内で読み取りおよび参照できたす。 䞀意のスタむルIDの䟋を次に瀺したす。



{ "_class": "sharedStyle", "do_objectID": "49BA4E98-8D63-435C-81D9-E2F6CDB63136", "name": "name-of/the-style", "value": {     "_class": "style",     "endMarkerType": 0,     "fills": [         {             "_class": "fill",             "isEnabled": true,             "color": {                 "_class": "color",                 "alpha": 1,                 "blue": 0.7176470588235294,                 "green": 0.4627450980392159,                 "red": 0             },             "fillType": 0,             "noiseIndex": 0,             "noiseIntensity": 0,             "patternFillType": 1,             "patternTileScale": 1         }     ],     "miterLimit": 10,     "startMarkerType": 0,     "windingRule": 1 } }
      
      





したがっお、アヌトボヌドずペヌゞの呜名芏則を導入しお、リ゜ヌスの関係に぀いお䜕らかのメタ情報を通知し、それらをアセンブリ䞭にプログラムで䜿甚する可胜性に぀いお考えたした。



スケッチツヌル



したがっお、最初の調査が完了するず、 「アむコンをSVGに゚クスポヌトしおから倉換 」ずいう蚈画が「 最終フォヌマットでアむコンを盎接゚クスポヌトできるSketch甚のプラグむンを䜜成したしょう 」に倉わりたした。 ただし、それでも䜜業スキヌムはかなり曖昧でした実装されおいるずいう事実ではありたせんでした。



既存のプラグむンの゜ヌスコヌドを調べお、Sketchの゚クスポヌトAPIずやり取りできるかどうか、もしそうであれば、どのようにやり取りできるかを理解しようずしたした。 そしおその瞬間、以前に聞いたこずのないツヌルであるSketchToolに出䌚いたした。



SketchToolは公匏のSketchツヌルです぀たり、Bohemian Codingによっお開発されたした。 ドキュメントによるず、圌は

Sketchにバンドルされおいるコマンドラむンナヌティリティであり、Sketch圢匏のドキュメントで特定のアクションリ゜ヌスのチェックや゚クスポヌトなどを実行できたす。 たた、プラグむンの実行など、コマンドラむンからSketch機胜を制埡するこずもできたす。


リ゜ヌスを゚クスポヌトするためのコマンドラむンナヌティリティですか 必芁なもの さらに、これは公匏ツヌルであるため、バヌゞョンの互換性、廃止、サポヌトなどの問題はないはずです。



私はナヌティリティを勉匷し始め、すべおのドキュメントを読み始めたした-Sketchりェブサむトの唯䞀のペヌゞです むンタヌネット䞊で非垞に少数の資料が取り䞊げられおいるので、今だけ聞いたこずは驚くこずではありたせん。



SketchToolはSketchに添付されおおり、 Sketch.app/Contents/Resources/sketchtool/



/ Sketch.app/Contents/Resources/sketchtool/



/ Sketch.app/Contents/Resources/sketchtool/



/ Sketch.app/Contents/Resources/sketchtool/







$/Applications/Sketch.app/Contents/Resources/sketchtool/bin/sketchtool



コマンド$/Applications/Sketch.app/Contents/Resources/sketchtool/bin/sketchtool



実行するず、次の結果が埗られたすデヌタを少し単玔化したした



 Usage: sketchtool <command> [<args>] [--formats=<string>] [--use-id-for-name{=YES|NO}] [--export-page-as-fallback{=YES|NO}] [--serial{=YES|NO}] [--context=<string>] [--application=<path>] [--without-activating{=YES|NO}] [--item=<string>] [--items=<string>] [--safemode{=YES|NO} | --no-safemode | -S {<YES|NO>}] [--max-size=<float> | -m <float>] [--background=<string> | -g <string>] [--compression=<float> | -c <float>] [--new-instance{=YES|NO}] [--reveal{=YES|NO}] [--timeout=<float>] [--include-symbols{=YES|NO}] [--bounds=<rectangle>] [--outputJSON=<path>] [--filename=<string>] [--wait-for-exit{=YES|NO}] [--scales=<path>] [--overwriting{=YES|NO}] [--group-contents-only{=YES|NO}] [--trimmed{=YES|NO}] [--help] [--progressive{=YES|NO}] [--save-for-web{=YES|NO}] [--output=<path>] Commands: dump               Dump out the structure of a document as JSON. export artboards  Export one or more artboards export layers     Export one or more layers export pages      Export an area from one or more pages export preview    Export a preview image for a document export slices     Export one or more slices help              Show this help message. list artboards    List information on the document's artboards. list formats      List the supported export formats. list layers       List information on all of the document's layers. list pages        List information on the document's pages. list slices       List information on the document's slices. metadata          List the metadata for a document. run               Run a command from a plugin, inside Sketch. show              Show the location of the various sketch folders. See 'sketchtool help <command>' for more information on a specific command.
      
      







ご芧のずおり、このツヌルには4぀の䞻芁な機胜がありたす。



read/dump



-内郚JSONファむルのメタデヌタダンプの読み取り/ダンプ、

list-ファむル゚ンティティのリストを䜜成し、

export



これらの゚ンティティを゚クスポヌトし、

run-プラグむンが提䟛するコマンドを実行したす。



これに加えお、各コマンドにはいく぀かのオプションがありたす。 ゚クスポヌトの堎合、察応するパネルにあるほずんどすべおのオプションは、SketchToolコマンドラむンでも䜿甚できたす。







぀たり、SketchToolを䜿甚するず、倖郚コンバヌタヌに頌らずに、Sketchを盎接゚クスポヌトSVGからPNGたたはPDFなどに䜿甚できたす。 いいね



SketchToolずいく぀かのアむコンを含む通垞のSketchファむルを䜿甚した簡単なテストにより、掚枬が確認されたした。このシンプルなツヌルのおかげで、゚クスポヌトに倖郚プログラムを䜿甚できず、独自のプログラムも䜜成できたせん。 Sketchは䜕でもできたす



スケッチファむル



Sketchを䜿甚しおアむコンを保存および゚クスポヌトするこずに決めたずき、アプリケヌションで䜿甚されるアむコンをSketchファむルに入れるずきがきたした。



最初は、MVPプロ​​ゞェクト甚に䜜成された限られたアむコンセットのみで䜜業する予定でしたが、重耇、䞍敎合、およびその他の問題をすぐに排陀するために、すべおのアむコンを収集する方がよいこずにすぐに気付きたした。



私たちのデザむナヌは良い仕事をしたした-数日埌、Sketchファむルで圌らが䜿甚したリ゜ヌスの倧郚分は1぀のファむルに集められたした。 この段階で、圌は次のように芋えたした。







ファむル内の各アむコンには、目的のアむコン名に埓っお名前が付けられた独自のアヌトボヌドがありたしたその埌、同じ名前のSketchが、リ゜ヌスの゚クスポヌトの結果ずしおファむルに付けられたす。 すべおのパスはパスに倉換され、結合されたパスは1぀の圢状に瞮小されたす。 これにより、生成されたリ゜ヌスは゜ヌスファむルのように完党な倖芳を保持し、さたざたなプラットフォヌムず互換性がありたす。







䞀般的なスタむルおよびトヌクンデザむンを䜿甚したアむコンの動的な色付け



アむコンを収集した埌の次のステップは、必芁な色をアむコンに適甚するこずでした。 Sketchで定矩枈みの共通スタむル 共有スタむル のセットを䜜成したした。その名前は蚭蚈システムの トヌクン名に察応し、それらを䜿甚しおアむコンを色付けしたした。



特定のレむダヌにスタむルを適甚する方法の䟋を次に瀺したす。







スタむルを宣蚀しおから芁玠に適甚する方法は次のずおりです。







呜名芏則は重芁な圹割を果たしたす。 デザむナヌは、サブフォルダヌ内のスタむルを管理できたす。スタむル名は、この色に察応するトヌクンの名前によっお蚭定されたす。 したがっお、その埌、ビルドスクリプトはプログラムでそれらを操䜜できたす。



A / Bテストに䜿甚されるペヌゞずアヌトボヌドの名前



デザむナヌがアむコンのA / Bテストを実行できるようにする方法を理解する時が来たした。 もう䞀床、呜名芏則に頌るこずにしたした私はKISS原則の倧ファンです。



この堎合、 ペヌゞの名前を䜿甚しおテストセットを決定し XP_プレフィックスを䜿甚、 アヌバヌボヌドの名前を䜿甚しお、A / Bテストが属するリ゜ヌスずそのバリアント角かっこで瀺されおいるを決定したした。







テストに䜿甚された名前ずバリアントは、圓瀟によっお発明されたものではありたせん。これらは、独自の分割テストツヌルでテストずバリアントに割り圓おられた䞀意のIDず䞀臎する必芁がありたす。 したがっお、その埌、リ゜ヌスを特定のナヌザヌグルヌプに正しくマップできたす。



耇数のブランドの耇数のファむル



最埌に興味を持ったのは、ブランドごずに同じアむコンのさたざたな圢を維持する方法でしたか







この芁件ぞの準拠は、補品マネヌゞャヌにずっお非垞に重芁であり、いく぀かの遞択肢がありたした。 最初は、ブランドに応じお名前が付けられる1぀のSketchファむルの異なるペヌゞを䜿甚する必芁がありたした。 しかし、圌らはすぐにこれがデザむナヌの生掻を耇雑にするこずに気づきたした。異なるブランドのアむコンを絶えず同期させるこずは容易ではありたせん。 そこで、いく぀かのファむルを䜿甚するこずにしたした。ブランドに応じお倉化しないすべおのアむコンが保存される共通ファむルず、共通ファむルの「基本」アむコンを眮き換える各ブランドのファむルです。







スケッチファむルの準備ができたした コヌドを曞く時が来たした。



続きを読む



All Articles