Π‘Ρ…Π΅ΠΌΠ° Π½Π° ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄

ΠŸΡ€Π΅Π· послСднитС няколко Π³ΠΎΠ΄ΠΈΠ½ΠΈ Π·Π°ΠΏΠΎΡ‡Π½Π°Ρ… Π΄Π° сС Π·Π°Π½ΠΈΠΌΠ°Π²Π°ΠΌ ΠΏΠΎΠ²Π΅Ρ‡Π΅ с докумСнтацията. Π”Π° напиша обяснитСлСн тСкст Π·Π° Π½Π°Ρ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΠΉΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ Π΅Π΄Π½Π° ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³Π° систСма β€” ΠΊΠ°Ρ‚ΠΎ цяло, Ρ‚ΠΎΠ²Π° Π΅ доста просто. Π”Π° нарисувам схСма, Π½Π° която Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈ всички ΠΊΠ»ΡŽΡ‡ΠΎΠ²ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠΈΡ‚Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ тях, ΡΡŠΡ‰ΠΎ Π΅ напълно лСсно.

Но Π½Π°ΠΉ-проблСмният ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅ Π΄Π° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°ΠΌ Ρ‚Π°Π·ΠΈ докумСнтация Π°ΠΊΡ‚ΡƒΠ°Π»Π½Π°. И Π΄Π° Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ само Π·Π° тСкста, Π°ΠΌΠΈ ΠΈ Π·Π° схСмитС… Въй ΠΊΠ°Ρ‚ΠΎ цялата докумСнтация Π΅ ΠΎΠ½Π»Π°ΠΉΠ½, Ρ‚.Π΅. Π² html Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, към тСкста са ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈ изобраТСния gif/jpg/png, Π½Π° ΠΊΠΎΠΈΡ‚ΠΎ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ са ΠΈΠ·ΠΎΠ±Ρ€Π°Π·Π΅Π½ΠΈ схСмитС. А схСмитС сС рисуват Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΠΊΠ°Ρ‚ΠΎ Visio ΠΈΠ»ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ услуги ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ Π½Π° draw.io. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Π΅ΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€Π°Ρˆ схСмата Π² Π³Ρ€Π°Ρ„ΠΈΡ‡Π΅Π½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΈ я ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΡΡˆ към html. Всичко ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° просто.

Π’ Ρ‡Π΅ΠΌ Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚?

Π‘Ρ…Π΅ΠΌΠΈΡ‚Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ са прости. По-Ρ‚ΠΎΡ‡Π½ΠΎ, Π½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ слоТни. Π”Π°, броят Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈΡ‚Π΅ Π΅ дСсСтина ΠΈΠ»ΠΈ Π΄Π²Π΅, броят Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠΈΡ‚Π΅ Π΅ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»Π½ΠΎ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π°. Плюс надписи, някакви обозначСния. ΠŸΡ€ΠΎΡΡ‚ΠΈ схСми ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΎΠΏΠΈΡˆΠ°Ρ‚ ΠΈ с Π΄ΡƒΠΌΠΈ, Π° Ρ‚Π²ΡŠΡ€Π΄Π΅ слоТни, Ρ…ΡŠΠΌβ€¦ (с) 'няма Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π°Ρ‚-с'. Π‘Ρ…Π΅ΠΌΠΈΡ‚Π΅ са ΠΌΠ½ΠΎΠ³ΠΎ, ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² тях трябва Π΄Π° сС внасят ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎ-Π΅ΠΏΠΈΠ·ΠΎΠ΄ΠΈΡ‡Π½ΠΎ, Ρ‚.Π΅. постоянно, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‚Π΅ слСдват Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° Π½Π°ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΈ.

Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° Π²Π³Ρ€Π°ΠΆΠ΄Π°Ρ‚Π΅ HTML Π½Π° услугата. ΠŸΡ€ΠΎΠ±Π²Π°Ρ…Ρ‚Π΅ Π»ΠΈ?

Π”Π°, Ρ€Π°Π·Π±ΠΈΡ€Π° сС. НапримСр, ΠΌΠ΅Π½ ΠΌΠ΅ интСрСсуват Π³Ρ€Π°Ρ„ΠΈΠΊΠΈΡ‚Π΅ Π½Π° gliffy.com. Но Π·Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ трябва Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅Ρ‚Π΅ Π² външна услуга, Π·Π° Π΄Π° Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°Ρ‚Π΅. И Π΅ ΠΏΠΎ-Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄Π° Π΄Π΅Π»Π΅Π³ΠΈΡ€Π°Ρ‚Π΅ ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΡ€Π΅ΠΊΡ†ΠΈΠΈ Π½Π° ΠΊΠΎΠ»Π΅Π³Π°.

Какво Π΄Π° ΠΏΡ€Π°Π²ΠΈΠΌ?

Наскоро Π² GitHub ΠΌΠΈ ΠΏΠΎΠΏΠ°Π΄Π½Π° рСпозитория github.com/RaoulMeyer/diagram-as-code. Π”ΠΈΠ°Π³Ρ€Π°ΠΌΠ° ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄. ВоСст, описвамС схСмата, ΠΎΡ‚ която сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ, Π½Π° JS. Π’ΠΎΠ·ΠΈ JS пишСм Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π² ΡΡŠΡ‰ΠΈΡ HTML, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Π΅ ΠΈ другият тСкст Π½Π° докумСнтацията.

ΠœΠ΅ΠΆΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΡ‚ΠΎ, пиша докумСнтацията Π½Π΅ съвсСм Π² HTML. ОбикновСно докумСнтацията Π΅ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ с markdown тСкст, ΠΊΠΎΠΉΡ‚ΠΎ слСд Ρ‚ΠΎΠ²Π° сС ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π° Π² Π·Π°Π²ΡŠΡ€ΡˆΠ΅Π½ сайт Π·Π° докумСнтация с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° някой Π΄Π²ΠΈΠΆΠΎΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ wintersmith. Или wiki-систСма.

Π‘Ρ‚Π°Π²Π° ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ: Π΅Ρ‚ΠΎ, написахмС тСкста, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ сС отваря Ρ‚Π°Π³ script ΠΈ Π² Π½Π΅Π³ΠΎ Π΅ описан JS ΠΊΠΎΠ΄ΡŠΡ‚ Π½Π° схСмата.

Какво ΠΏΠ°ΠΊ Π½Π΅ Π΅ Π½Π°Ρ€Π΅Π΄?

Π’ΠΎΠ·ΠΈ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΌΠΈ харСса, Π½ΠΎ Π½Π΅ Π΅ СдинствСният ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠ° сС рисува с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ тСкстово прСдставянС. (Π’ края Π½Π° статията Ρ‰Π΅ ΠΈΠΌΠ° Π»ΠΈΠ½ΠΊΠΎΠ²Π΅ към ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ ΠΈ статии, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π°ΠΌΠ΅Ρ€ΠΈΡ… ΠΏΠΎ Ρ‚Π΅ΠΌΠ°Ρ‚Π° 'Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠ° ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄.')

И Π½Π΅ съм сам Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° докумСнтацията. Понякога ΠΈ ΠΊΠΎΠ»Π΅Π³ΠΈ допринасят β€” ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°Ρ‚ Π΄ΡƒΠΌΠΈ, промСнят описания, добавят Π½ΠΎΠ²ΠΈ изобраТСния.Β 

Π—Π°Ρ‚ΠΎΠ²Π° Π±ΠΈΡ… искал Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠ°Ρ‚Π° Π΄Π° Π΅ Π² Ρ‡Π΅Ρ‚ΠΈΠΌ, Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌ тСкстов Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ Π½Π΅ Π±ΠΈ трябвало Π΄Π° сС ΡƒΡ‡ΠΈΠΌ дълго. Понякога ΠΌΠΎΠΆΠ΅ Π΄ΠΎΡ€ΠΈ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ просто copy-paste Π·Π° Π±ΡŠΡ€Π·ΠΎ добавянС Π½Π° Π½ΠΎΠ²Π° схСма.Β 

Π”Ρ€ΡƒΠ³ ΠΊΠΎΠ»Π΅Π³Π° ΡΡŠΡ‰ΠΎ отбСляза, Ρ‡Π΅ ΠΊΠΎΠ΄ΡŠΡ‚ Π΅, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, чудСсСн, Π½ΠΎ Π°ΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ структура, всичко ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΌΠ½ΠΎΠ³ΠΎ строго ΠΈ ΠΈΠ·Ρ€Π°Π·ΠΈΡ‚Π΅Π»Π½ΠΎ.

Π—Π°Ρ‚ΠΎΠ²Π° ΠΎΠΏΠΈΡ‚Π°Ρ… Π΄Π° прСдставя схСмата ΠΊΠ°Ρ‚ΠΎ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ няколко ΠΌΠ°Π»ΠΊΠΈ масива, ΠΊΠΎΠΈΡ‚ΠΎ описват възли, Π²Ρ€ΡŠΠ·ΠΊΠΈ, Π³Ρ€ΡƒΠΏΠΈ възли ΠΈ Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π²ΡŠΠ·Π»ΠΈΡ‚Π΅. ΠžΡ‚ ΠΌΠΎΠ΅Ρ‚ΠΎ скромно ΠΌΠ½Π΅Π½ΠΈΠ΅, Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ Π΅ доста ΡƒΠ΄ΠΎΠ±Π΅Π½, Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, Π½Π° вкус ΠΈ цвСт…

Как Π΅ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠ°Ρ‚Π° Π² масива?

  • ВсСки възСл сС описва с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΊΠΎΠΉΡ‚ΠΎ нСдвусмислСно опрСдСля възСла.
  • Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ°, към възСла ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π΄ΠΎΠ±Π°Π²ΠΈ ΠΈΠΊΠΎΠ½Π°, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ надпис.
  • ΠœΠ΅ΠΆΠ΄Ρƒ Π΄Π²Π° възСла ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΡƒΠΊΠ°ΠΆΠ΅ Π²Ρ€ΡŠΠ·ΠΊΠ°.
  • Π—Π° Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° Π½Π° схСмата ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π·Π°Π΄Π°Π΄Π΅ цвят ΠΈ надпис.
  • НаправлСниСто Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° сС опрСдСля ΠΎΡ‚ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ° към Ρ†Π΅Π»Ρ‚Π°. А ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΡŠΡ‚ ΠΈ Ρ†Π΅Π»Ρ‚Π° сС ΡƒΠΊΠ°Π·Π²Π°Ρ‚ с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ Π½Π° Π²ΡŠΠ·Π»ΠΈΡ‚Π΅.
  • МоТС Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ Π΅Π΄ΠΈΠ½ ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅ възли Π² Π³Ρ€ΡƒΠΏΠ°.
  • Π’Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΡƒΠΊΠ°Π·Π°Π½Π° ΠΊΠ°ΠΊΡ‚ΠΎ ΠΎΡ‚ Π³Ρ€ΡƒΠΏΠ°Ρ‚Π°, Ρ‚Π°ΠΊΠ° ΠΈ към Π³Ρ€ΡƒΠΏΠ°Ρ‚Π°.

ΠšΠ°Ρ‚ΠΎ слСдватС Ρ‚Π΅Π·ΠΈ прости ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Ρ‚Π΅ слСдната схСма. ЛСсно, Π½Π°Π»ΠΈ? Напълно.

Π‘Ρ…Π΅ΠΌΠ° Π½Π° ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄

Вя сС описва с слСдния js ΠΊΠΎΠ΄. ΠžΡΠ½ΠΎΠ²Π½ΠΎΡ‚ΠΎ Ρ‚ΡƒΠΊ Π΅ ΠΎΠ±Π΅ΠΊΡ‚ΡŠΡ‚ elements. Π’ Π½Π΅Π³ΠΎ са ΡƒΠΊΠ°Π·Π°Π½ΠΈ nodes β€” възли, edges β€” Π²Ρ€ΡŠΠ·ΠΊΠΈ.
Β 

  const elements = {
    nodes: [       // описвамС възли
      { id: 'client', type: 'smartphone', label: 'Мобилно ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅'},
      { id: 'server', type: 'server', label: 'ОсновСн ΡΡŠΡ€Π²ΡŠΡ€'},
      { id: 'db1', type: 'database', label: 'Π‘Π°Π·Π° Π΄Π°Π½Π½ΠΈ 1'},
      { id: 'db2', type: 'database', label: 'Π‘Π°Π·Π° Π΄Π°Π½Π½ΠΈ 2'},
    ],
    edges: [       // ΡƒΠΊΠ°Π·Π²Π°ΠΌΠ΅ Π²Ρ€ΡŠΠ·ΠΊΠΈ
      { source: 'client', target: 'server', label: 'заявка' },
      { source: 'server', target: 'db1', label: 'заявка' },
      { source: 'server', target: 'db2', label: 'заявка' },
    ],
  };
  Diagram('scheme1', elements);

Π Π°Π·Π±ΠΈΡ€Π° сС, самият Π°Π· Π½Π΅ измислих визуализацията Π½Π° схСмата, Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° cytoscape.js β€” ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠΎΡ‰Π΅Π½ инструмСнт Π·Π° визуализация. Π§Π°ΡΡ‚ΡŒ ΠΎΡ‚ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ ѝ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ само Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ си.Β 

Ясно, Ρ‚ΠΎΠ²Π° Π΅ прост ΠΏΡ€ΠΈΠΌΠ΅Ρ€. МоТС Π»ΠΈ Π΄Π° бъдС ΠΏΠΎ-слоТно?

Π”Π°, Ρ€Π°Π·Π±ΠΈΡ€Π° сС. Π—Π° ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ β€” ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ positions, Π·Π° ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π½Π° Π³Ρ€ΡƒΠΏΠΈ β€” ΡƒΠΊΠ°Π·Π²Π°ΠΌΠ΅ списък Π½Π° Π³Ρ€ΡƒΠΏΠΈΡ‚Π΅ Π² groups, Π° Π·Π° самитС Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ group.

Π‘Ρ…Π΅ΠΌΠ° Π½Π° ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄

А Π΅Ρ‚ΠΎ ΠΈ ΠΊΠΎΠ΄Π°:

<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, позволява Π±ΡŠΡ€Π·ΠΎ запълванС Π½Π° всички Π΄Π°Π½Π½ΠΈ ΠΏΠΎ аналогия ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈ copy-paste.

Π—Π°Ρ‰ΠΎ positions са ΠΎΡ‚Π΄Π΅Π»Π΅Π½ΠΈ ΠΎΡ‚ Π²ΡŠΠ·Π»ΠΈΡ‚Π΅?

Π’Π°ΠΊΠ° Π΅ ΠΏΠΎ-ΡƒΠ΄ΠΎΠ±Π½ΠΎ. ΠŸΡŠΡ€Π²ΠΎ посочвамС nodes. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° посочим Π΄Π²Π΅-Ρ‚Ρ€ΠΈ Π³Ρ€ΡƒΠΏΠΈ ΠΈ Π΄Π° Π³ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Π² Π²ΡŠΠ·Π»ΠΈΡ‚Π΅. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°ΠΌΠ΅ Π²Ρ€ΡŠΠ·ΠΊΠΈΡ‚Π΅. А Ρ‡Π°ΠΊ слСд ΠΊΠ°Ρ‚ΠΎ основнитС ΠΎΠ±Π΅ΠΊΡ‚ΠΈ ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠΈΡ‚Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ тях са Π½Π°Π»ΠΈΡ‡Π½ΠΈ, сС Π·Π°Π΅ΠΌΠ°ΠΌΠ΅ с Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ‚Π΅Π·ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ Π½Π° схСмата. Или ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΡ‚ΠΎ.

МоТС ли и бСз positions?

МоТС ΠΈ Π±Π΅Π· positions. Но Ρ‰Π΅ бъдС ΠΌΠ°Π»ΠΊΠΎ стСгнато, Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ Ρ‚Π°ΠΊΡŠΠ² Π²Π°Ρ€ΠΈΠ°Π½Ρ‚. Π’ΠΎΠ²Π° сС дълТи Π½Π° Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ Π·Π° cytoscape ΠΈΠΌΠ° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌ Π·Π° Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π²ΡŠΠ·Π»ΠΈΡ‚Π΅. fcose, ΠΊΠΎΠΉΡ‚ΠΎ ΡΡŠΡ‰ΠΎ ΠΎΡ‚Ρ‡ΠΈΡ‚Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π³Ρ€ΡƒΠΏΠΈ. Π£ΠΊΠ°Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° positions ΠΏΡ€Π°Π²ΠΈ схСмата ΠΏΠΎ-управляСма, Π½ΠΎ Π½Π° Π΅Ρ‚Π°ΠΏΠ° Π½Π° ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΈΡ Ρ‡Π΅Ρ€Ρ‚Π΅ΠΆ Π½Π° схСмата ΠΌΠΎΠΆΠ΅ ΠΈ Π±Π΅Π· positions.

Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° positions ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΡƒΠΊΠ°Π·Π²Π°Ρ‚ Π² стил ΠœΠΎΡ€ΡΠΊΠΈ Π±ΠΎΠΉ. Π’.Π΅. Π΅Π΄ΠΈΠ½ възСл сС Ρ€Π°Π·ΠΏΠΎΠ»Π°Π³Π° Π² a1, Π° Π΄Ρ€ΡƒΠ³ Π² d5. ОсобСно ΠΏΠΎΠΌΠ°Π³Π°, Ρ‡Π΅ cytoscape Ρ„ΠΎΡ€ΠΌΠΈΡ€Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈΡ‚Π΅ Π½Π° canvas ΠΏΠΎΠ΄Π²ΠΈΠΆΠ½ΠΈ, Ρ‚.Π΅. ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π³ΠΈ прСмСстим, Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΈ Π½Π° Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π° слСд Ρ‚ΠΎΠ²Π° Π΄Π° фиксирамС Π² ΠΊΠΎΠ΄Π° прСдпочитаният Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅.

Π’ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅, ясно. МоТСм ΠΎΠΏΠΈΡ‚Π°Ρ‚ΠΈ?
Β 
Π Π°Π·Π±ΠΈΡ€Π° сС, Π·Π° Π±ΡŠΡ€Π·ΠΎ създаванС Π½Π° схСми си Π½Π°ΠΏΡ€Π°Π²ΠΈΡ… малък Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€, ΠΊΠΎΠΉΡ‚ΠΎ сам обновява схСмата ΠΈ я ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π° (Π² localStorage).

ΠžΠΏΠΈΡ‚Π°Ρ…Ρ‚Π΅ Π»ΠΈ? Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° я Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΈ Π½Π° Π²Π°ΡˆΠ°Ρ‚Π° страница.

Π’ΠΎΠ³Π°Π²Π° ΠΎΡ‰Π΅ вСднъТ:

1. Π‘Π²ΡŠΡ€Π·Π²Π°ΠΌΠ΅ скрипта

<script src="https://unpkg.com/@antirek/network-diagram@0.1.4/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.

Какво Π² ΠΊΡ€Π°ΠΉΠ½Π° смСтка?

Достигнах Ρ†Π΅Π»ΠΈΡ‚Π΅ си β€” Π΄Π° направя добавянСто Π½Π° схСми Π² докумСнтацията ΠΈΠ½Π»Π°ΠΉΠ½, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΡŠΡ‚ Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ прост ΠΈ Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌ. НС Π±ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠΆΠ΄Π°Π» Π·Π° супСрсхСми, Π½ΠΎ Π·Π° ΠΌΠ°Π»ΠΊΠΈ схСми, ΠΊΠΎΠΈΡ‚ΠΎ обясняват структурата Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠΈΡ‚Π΅ β€” Π΅ доста Π΄ΠΎΠ±Ρ€ΠΎ. Π’ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ Π±ΡŠΡ€Π·ΠΎ Π΄Π° сС ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π° ΠΈ Π½Π΅Ρ‰ΠΎ с Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π΄Π° сС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ. Π”Π°, ΠΈ ΠΊΠΎΠ»Π΅Π³ΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ сами Π΄Π° ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°Ρ‚ Π½Π΅Ρ‰ΠΎ Π² докумСнтацията, ΠΏΠΎΠ½Π΅ подписитС ΠΏΠΎΠ΄ ΠΎΠ±Π΅ΠΊΡ‚ΠΈΡ‚Π΅ Π±Π΅Π· особСно ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅))

Какво ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΈ?

Има, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΈ. Π”Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ добавянС Π½Π° Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΈΠΊΠΎΠ½ΠΊΠΈ (всички Π½Π°Π»ΠΈΡ‡Π½ΠΈ са Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ ΠΈΠ½Π»Π°ΠΉΠ½ Π² скрипта). Π”Π° ΠΏΠΎΠ΄Π±Π΅Ρ€Π΅ΠΌ ΠΏΠΎ-ΠΈΠ·Ρ€Π°Π·ΠΈΡ‚Π΅Π»Π΅Π½ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ ΠΈΠΊΠΎΠ½ΠΊΠΈ. Π”Π° създадСм Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΡƒΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° стила Π½Π° Π»ΠΈΠ½ΠΈΠΈΡ‚Π΅ Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠΈΡ‚Π΅. Π”Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Ρ„ΠΎΠ½ΠΎΠ²ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

А ΠΊΠ°ΠΊΠ²ΠΎ мислитС Π²ΠΈΠ΅?
Β 
Π’Π΅Ρ‡Π΅ ΠΈΠΌΠ°ΠΌ няколко ΠΈΠ΄Π΅ΠΈ Π·Π° рСализация Π² issues, Π΄ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ Π²Π°ΡˆΠΈΡ‚Π΅ Π² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅.

ΠœΠΎΠ΅Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΠΌΠΎ Π² тСсСн ΡΠΏΠ΅ΠΊΡ‚ΡŠΡ€ ΠΎΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΈ ΠΌΠΎΠΆΠ΅ Π±ΠΈ Ρ‰Π΅ Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ ΠΏΠΎ-ΡƒΠ΄ΠΎΠ±Π΅Π½ инструмСнт Π·Π° рисуванС Π½Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΈ, просто ΠΊΠ°Ρ‚ΠΎ Π³ΠΈ ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ β€” ΠΊΠ°ΠΊΡ‚ΠΎ сС ΠΊΠ°Π·Π²Π° β€žΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚Π΅ ΠΌΠΈ Π΄ΠΈagrama си ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄β€œ

  1. Π”ΠΎΠ±Ρ€Π° ΠΏΠΎΠ΄Π±ΠΎΡ€ΠΊΠ°
  2. Π‘Ρ‚Ρ€Π°Ρ…ΠΎΡ‚Π΅Π½ сСрвиз (9 Ρ‚ΠΈΠΏΠ° Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€)
  3. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, mermaid.js
  4. И Π°ΠΊΠΎ ΠΎΠ±ΠΈΡ‡Π°Ρ‚Π΅ супСр Π΄Π΅Ρ‚Π°ΠΉΠ»Π½ΠΈ ΠΈ слоТни схСми β€” Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Ρ‰Π΅ Π²ΠΈ Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»ΠΈ: go.drawthe.net

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster