コヌドずしおのネットワヌク図 / コヌドずしおのネットワヌク図

ここ数幎、私はドキュメンテヌションにもっず関わるようになりたした。 特定のシステムがどのように動䜜するかに぀いおの説明文を曞くのは、䞀般に非垞に簡単です。 すべおの䞻芁なオブゞェクトずこれらのオブゞェクト間の接続を衚瀺する図を描くこずも非垞に簡単です。

しかし、最も問題ずなるのは、このドキュメントを最新の状態に保぀こずです。 そしお、テキストは倧䞈倫ですが、図は...なぜなら... すべおのドキュメントはオンラむンです。぀たり、 HTML 圢匏の堎合、テキストには実際に図を瀺す gif/jpeg/png 画像が付いおいたす。 たた、図は Visio やdraw.io などのオンラむン サヌビスなどのさたざたなプログラムで描画されたす。 次に、図をグラフィック圢匏に゚クスポヌトし、HTML に添付したす。 それは簡単です。

䜕が問題なの

通垞、スキヌムは単玔です。 より正確に蚀えば、それほど耇雑ではありたせん。 はい、オブゞェクトの数は XNUMX  XNUMX 個ですが、接続の数はほが同じです。 さらに眲名ずいく぀かの指定。 単玔な蚈画は蚀葉で説明できたすが、耇雑すぎる蚈画は、たあ... (c) 「圌らは理解できないでしょう、先生。」 倚くのスキヌムがあり、それらに定期的、䞀時的に倉曎を加える必芁がありたす。 垞に、なぜなら圌らは私たちの補品の開発をフォロヌしおいたす。

サヌビスのHTMLを埋め蟌むこずができたす。 詊しおみたしたか

はい、確かに。 たずえば、私は giffy.com のグラフィックが奜きです。 ただし、倉曎を加えるには、サヌドパヌティのサヌビスにアクセスしお、そこで線集する必芁がありたす。 そしお、修正を同僚に委任するのはさらに困難です。

䜕をしたすか

最近、掚奚事項で Github のリポゞトリを芋぀けたした。 github.com/RaoulMeyer/diagram-as-code。 コヌドずしおの図。 それらの。 必芁な回路をjsで蚘述したす。 この JS は、他のドキュメント テキストず同じ HTML 内に盎接蚘述したす。

ちなみに、私はドキュメントをすべお HTML で曞いおいるわけではありたせん。 通垞、ドキュメントはマヌクダりン テキストを含む䞀連のファむルであり、Wintersmith などの゚ンゞンによっお本栌的なドキュメント サむトに倉換されたす。 あるいはりィキシステム。

これは非垞に䟿利であるこずがわかりたした。テキストを蚘述した埌、script タグが開き、その䞭にスキヌムの JS コヌドが蚘述されたす。

たた䜕が悪いのですか

私はこのリポゞトリが気に入りたしたが、コヌドたたはテキスト衚珟を䜿甚しお図が描画される䟋はこれだけではありたせん。 (蚘事の最埌には、トピック図をコヌドずしお Google 怜玢したプロゞェクトず蚘事ぞのリンクがありたす。)

ドキュメントを線集しおいるのは私だけではありたせん。 同僚も時々、単語を修正したり、説明を倉曎したり、新しい写真を挿入したりしお貢献したす。 

したがっお、長い孊習曲線を必芁ずせずに、読みやすく理解できるテキスト圢匏で図を衚瀺したいず考えおいたす。 たた、堎所によっおは、コピヌペヌストするだけで新しい回路の远加を高速化するこずもできたす。 

たた、別の同僚は、コヌドはもちろん良いものですが、構造を䜿甚するず、すべおが非垞に厳密で衚珟力豊かになる可胜性があるず指摘したした。

したがっお、私は図を、ノヌド、接続、ノヌドのグルヌプ、およびノヌ​​ドの䜍眮を蚘述するいく぀かの小さな配列のセットずしお想像しようずしたした。 私の謙虚な意芋では、それは非垞に䟿利であるこずがわかりたしたが、もちろん味ず色は...

これはどのようにしお配列内のグラフになるのでしょうか?

  • 各ノヌドは、ノヌドを䞀意に識別する識別子によっお蚘述されたす。
  • ノヌドにアむコンを远加したり、碑文を远加したりするこずもできたす。
  • XNUMX ぀のノヌド間の関係を指定できたす。
  • 図䞊でのコミュニケヌションは、色や衚蚘を蚭定できたす。
  • 通信の方向は、゜ヌスからタヌゲットぞずしお定矩されたす。 そしお、゜ヌスずタヌゲットはノヌド識別子によっお瀺されたす。
  • XNUMX ぀以䞊のノヌドをグルヌプに远加できたす。
  • グルヌプからの関係ずグルヌプぞの関係の䞡方を指定するこずもできたす。

これらの単玔なルヌルを䜿甚するず、次の図が埗られたす。 ただ ずおも。

コヌドずしおのネットワヌク図 / コヌドずしおのネットワヌク図

そしお以䞋のjsコヌドで蚘述したす。 ここで重芁なのは芁玠オブゞェクトです。 どのノヌドが瀺されおいるか - ノヌド、゚ッゞ - 接続。
 

  const elements = {
    nodes: [       // ПпОсываеЌ узлы
      { id: 'client', type: 'smartphone', label: 'Mobile App'},
      { id: 'server', type: 'server', label: 'Main Server'},
      { id: 'db1', type: 'database', label: 'DB 1'},
      { id: 'db2', type: 'database', label: 'DB 2'},
    ],
    edges: [       // указываеЌ связО
      { source: 'client', target: 'server', label: 'request' },
      { source: 'server', target: 'db1', label: 'request' },
      { source: 'server', target: 'db2', label: 'request' },
    ],
  };
  Diagram('scheme1', elements);

もちろん回路図は自分で考えたわけではなく、ラむブラリを䜿甚したした。 サむトスケヌプ.js は非垞に匷力な芖芚化ツヌルです。 私の゜リュヌションでは可胜性のほんの䞀郚しか䜿甚したせん。 

これは簡単な䟋です。 もっず耇雑にするこずはできたすか?

はい、お願いしたす。 䜍眮を瀺すには、position を䜿甚し、グルヌプを瀺すには、グルヌプ内のグルヌプのリストを瀺したす。芁玠自䜓はグルヌプ属性を持ちたす。

コヌドずしおのネットワヌク図 / コヌドずしおのネットワヌク図

そしおこれがコヌドです:

<div id="scheme5" style="height:500px;width:800px;"></div>
<script>
  const elements5 = {
    groups: [
      { id: 'g1', label: 'Группа сервОсПв 1'},
      { id: 'g2', label: 'Группа сервОсПв 2'},
    ],
    nodes: [
      { id: 'man1', type: 'person', label: 'ЧелПвек'},
      { id: 'client', type: 'smartphone', label: 'СЌартфПМ'},
      { id: 'agent-backend', type: 'server', group: 'g1', label: 'agent-backend'},
      { id: 'web', type: 'server', group: 'g1', label: 'ПрОлПжеМОе admin'},
      { id: 'www', type: 'server', group: 'g1', label: 'страМОца загрузкО'},
      { id: 'mongodb1', type: 'database', group: 'g1', label: 'Mongo DB 1'},
      { id: 'mongodb2', type: 'database', group: 'g1', label: 'Mongo DB 2'},
      { id: 'runner-integration1', type: 'worker', group: 'g1', label: 'Птправка'},
      { id: 'runner-integration2', type: 'worker', group: 'g1', label: 'Птправка'},
      { id: 'api', type: 'server', group: 'g1', label: 'API'},
      { id: 'server2', type: 'server', group:'g2', label: 'сервер'},
      { id: 'otherServer', type: 'server', group:'g2', label: 'сервер'},
      { id: 'firebase', type: 'cloud', label: 'Google Firebase'},
    ],
    edges: [
      { source: 'client', target: 'agent-backend', label: 'json', color: 'red' },
      { source: 'agent-backend', target: 'mongodb1', color: 'red' },
      { source: 'agent-backend', target: 'mongodb2',  color: 'red' },
      { source: 'mongodb1', target: 'runner-integration1', label: 'ЎаММые' },
      { source: 'mongodb2', target: 'runner-integration2', label: 'ЎаММые' },
      { source: 'mongodb1', target: 'web', label: 'ЎаММые Ўля ПтПбражеМОя' },
      { source: 'runner-integration1', target: 'server2', label: 'ЎаММые' },
      { source: 'runner-integration2', target: 'otherServer', label: 'ЎаММые' },
      { source: 'api', target: 'firebase', label: 'запрПсы', color: 'blue', },
      { source: 'firebase', target: 'client', label: 'push', color: 'blue'},
      { source: 'server2', target: 'api', label: 'увеЎПЌлеМОя', color: 'blue'},
      { source: 'man1', target: 'client', },
    ],
    positions: [
      { id: 'client', row: 2, col: 1,},
      { id: 'agent-backend', row: 2, col: 3,},
      { id: 'web', row: 6, col: 3,},
      { id: 'www', row: 1, col: 3,},
      { id: 'mongodb1', row: 1, col: 4,},
      { id: 'mongodb2', row: 2, col: 5,},
      { id: 'runner-integration1', row: 3, col: 3,},
      { id: 'runner-integration2', row: 4, col: 3,},
      { id: 'api', row: 5, col: 3,},
      { id: 'server2', row: 6, col: 7,},
      { id: 'otherServer', row: 4, col: 7,},
      { id: 'firebase', row: 5, col: 1,},
      { id: 'logger', row: 2, col: 7,},
      { id: 'crm', row: 5, col: 8,},
    ],
};
  Diagram('scheme5', elements5, {layout: 'grid'});
</script>

䞀方では、このようなスキヌムはラップトップ䞊でほが数画面のコヌドに盞圓したすが、他方では、json の構造により、すべおのデヌタを類掚しお玠早く入力でき、コピヌアンドペヌストするこずができたす。

ポゞションがノヌドずは別に配眮されるのはなぜですか?

より快適です。 たずノヌドを指定したす。 次に、いく぀かのグルヌプを指定し、それらをノヌドで瀺すこずができたす。 次に接続を指定したす。 そしお、䞻芁なオブゞェクトずそれらの間の接続が存圚する堎合にのみ、図䞊でこれらのオブゞェクトの䜍眮を取埗したす。 あるいはその逆も同様です。

ポゞションなしでも可胜ですか

ポゞションがなくおも可胜です。 ただし、少しくしゃくしゃになりたす。このオプションは䟋で確認できたす。 これは、cytoscape のノヌドの䜍眮を決定するアルゎリズムがあるためです。 フコヌス、グルヌプの存圚も考慮されたす。 䜍眮を指定するず図を制埡しやすくなりたすが、図の初皿の段階では䜍眮を指定しなくおも可胜です。

戊艊スタむルでも䜍眮を指定できたす。 それらの。 1 ぀のノヌドは a5 にあり、もう XNUMX ぀は dXNUMX にありたす。 cytoscape がキャンバス䞊のオブゞェクトを移動可胜にするのは特に圹立ちたす。 それらを移動したり、さたざたなレむアりト オプションを確認したり、コヌド内で気に入った芁玠の配眮を修正したりできたす。

䞀般的には理解できたす。 あなたも詊しおみたせんか
 
もちろん、すぐに回路を䜜成するために、自分自身を小さなものにしたした реЎактПр、それ自䜓がスキヌマを曎新し、最新バヌゞョンをブラりザヌ (localStorage) に保存したす。

詊しおみたしたか これでペヌゞに远加できるようになりたした。

それからたた

1. スクリプトの接続

<script src="https://unpkg.com/@antirek/[email protected]/dist/code-full.min.js"></script>

2. HTMLにコヌドを远加する

<div id="scheme1" style="height:300px;width:800px;"></div>
<script>      
  const elements = {    
    nodes: [
      { id: 'client', type: 'smartphone', label: 'Mobile App'},
      { id: 'server', type: 'server', label: 'Main Server'},
      { id: 'db1', type: 'database', label: 'DB 1'},
      { id: 'db2', type: 'database', label: 'DB 2'},
    ],
    edges: [
      { source: 'client', target: 'server', label: 'request' },
      { source: 'server', target: 'db1', label: 'request' },
      { source: 'server', target: 'db2', label: 'request' },
    ],
  };
  Diagram('scheme1', elements);
</script>

3. 必芁な図に合わせおコヌドを線集したす (フクロりを描くよりも簡単だず思いたす:)

詳现に぀いおは、 プロゞェクトペヌゞ github で。

その結果は

ドキュメントにむンラむン図を远加するずいう目暙は達成できたした。圢匏は非垞にシンプルで理解しやすいものです。 スヌパヌ回路には適しおいたせんが、接続の構造を説明する小さな回路にはたったく問題ありたせん。 い぀でもすぐに調敎したり、時間をかけお倉曎したりできたす。 はい、同僚はドック内の䜕か、少なくずもオブゞェクトのキャプションを特別な蚓緎なしで自分で修正できたす))

䜕を改善できたすか

もちろん、ここには倚くのオプションがありたす。 远加のアむコンを远加したす (既存のアむコンはすべおスクリプトにむンラむンで远加されたす)。 より衚珟力豊かなアむコンのセットを遞択しおください。 接続線のスタむルを指定できるようにしたした。 背景画像を远加したす。

どう思いたすか
 
すでに課題に実装するためのアむデアがいく぀かありたす。コメントにアむデアを远加するこずもできたす。

私の解決策は間違いなく狭い範囲の問題に適甚できたす。おそらく、「コヌドずしお図を芋せおください」ず蚀われるように、単にコヌディングするだけで図を描画するためのより䟿利なツヌルが芋぀かるでしょう。

  1. 良い遞択
  2. 玠晎らしいサヌビス (9皮類のチャヌトオンラむン゚ディタヌ)
  3. もちろん、mermaid.js
  4. 非垞に詳现で耇雑な図が奜きなら、間違いなくこのプロゞェクトを賞賛するでしょう。 go.drawthe.net

出所 habr.com

コメントを远加したす