モノリスをどのように芋たか。パヌト2、フレヌムマネヌゞャヌ

こんにちは、私の名前はスタスです。ティンコフビゞネスチヌムで働いおいたす。前回の蚘事で、同僚のVanyaがアプリケヌションアヌキテクチャの配眮方法に぀いお説明したした。Vanyaは、アプリケヌションオヌケストレヌタヌずしお機胜する特定のフレヌムマネヌゞャヌに぀いお䜕床か蚀及したしたが、それに぀いお詳しく説明したす。



画像



ティンコフビゞネスずは



Tinkoff Businessは、䞭小䌁業向けの゜リュヌションを提䟛しおいたす。絊䞎プロゞェクト、珟金および決枈サヌビス、ドキュメントデザむナヌ、その他玄20の補品です。

これはすべおアプリケヌションに実装されおいたす。これらのアプリケヌションは別々のチヌムによっお開発され、独自のリリヌスサむクルがありたす。そしお、これらのアプリケヌションはすべお、単䞀の認蚌で動䜜し、ビゞネスロゞックの共通郚分を別のラむブラリに含み、共通のUIコンポヌネントを䜿甚したす。



2幎前に戻りたしょう



兞型的なTinkoffBusinessアプリケヌションは、次のようになりたした。



画像



侊-アプリケヌションをナビゲヌトするヘッダヌ、右偎-補品ナビゲヌションを含むサむドバヌ。

圓時、マむクロフロントのアむデアはただそれほど人気が​​ありたせんでしたが、私たちはすでにこの方向に進んでいたしたサむドバヌは別のAngularアプリケヌションでした。メむンアプリケヌションはサむドバヌをiframeにロヌドしたした。これにより、アプリケヌションを個別にリリヌスできたした。



このアプロヌチには欠点がありたした。補品を切り替えるずきに、2぀のAngularアプリケヌションでペヌゞ党䜓が読み蟌たれるのを埅぀必芁がありたした。たた、ほずんどのアプリケヌションは同じバック゚ンドAPI芁求を䜿甚するため、ナヌザヌはそれらが再実行されるのを埅぀必芁がありたした。



フレヌムマネヌゞャヌのアむデア



すべおのアプリケヌションのグロヌバルタスクが出珟するたで、私たちはそのようなアヌキテクチャを䜿甚しおいたした-再蚭蚈。次に、アむデアが浮かびたした。ある皮の制埡の反転を実行しお、アプリケヌションがサむドバヌを内郚にロヌドする代わりに、サむドバヌがアプリケヌション自䜓をロヌドするのはなぜでしょうか。



これにより、珟圚のアヌキテクチャの利点を維持し、䞊蚘の問題を取り陀くこずができたしたそしお新しい問題をもたらすこずができたした、ハハ。



初期プロトタむプ



最初に、他のアプリケヌションをロヌドするために必芁な最小限の機胜を備えたプロトタむプを䜜成したした。別のドメむンがテストベンチに䜜成されたした。アプリケヌション統蚈のnginxのルヌトが倉曎されたした。以前は、察応するアプリケヌションの統蚈がパス/ sme、/ account、/ salaryなどに沿っおロヌドされおいたした。これで、Frame Managerの統蚈情報がすべおのパスに沿っお送信され、アプリケヌション自䜓の静的ルヌトに接尟蟞/静的情報が远加されたした。



明確にするために、䟋を芋おみたしょう。/some-appパスにあるアプリケヌションをsome-routeでロヌドする必芁がありたす。詳现はさおおき、/ some-app / some-route /をロヌドするずきにどのようなプロセスが発生するかを芋おみたしょう。

  1. Nginxは、このパスに沿っおFrameManagerの統蚈情報を送信したす。
  2. フレヌムマネヌゞャヌを読み蟌んでいたす。ルヌトに基づいお、圌はいく぀かのアプリをダりンロヌドするこずを理解しおいたす。
  3. iframeは、メむンアプリがロヌドされるsrc = '/ some-app / static /'で䜜成されたす。


同時に、アプリケヌション自䜓に倧幅な改善が必芁でした。そのため、アプリケヌションブランチのマスタヌをフォヌクし、そこに必芁な倉曎を远加した埌、倉曎を加えおアプリケヌション自䜓の個別のコピヌを䜜成したした。



最初の問題



そこで、4぀のアプリケヌションをFrame Managerに転送し、゜リュヌションが機胜しおいるこずを確認したした。他のすべおのアプリケヌションは翻蚳されるこずになっおいた。そしお、ここで問題が発生したした。通垞のバヌゞョンずFrameManagerで動䜜するバヌゞョンを同時に維持するにはコストがかかりすぎるこずが刀明したした。



叀いバヌゞョンのマスタヌに倉曎するたびに、アプリケヌションの新しいバヌゞョンを絶えず曎新し、新たな競合を解決し、既存の機胜が頻繁に壊れ、回垰テストのコストがほが2倍になる必芁がありたした。これにはすべお時間がかかりすぎたした。新しい解決策が必芁であるこずは明らかでした。



改善点



アプリの1぀のバヌゞョンがサむドバヌずフレヌムマネヌゞャヌの䞡方で機胜する堎合、それは私たちに倚くの問題を救うでしょう。䜕ができるか芋おみたしょう。



たず、アプリケヌションがフレヌムマネヌゞャヌで実行されおいるかどうかを䜕らかの方法で刀断する必芁がありたす。これは非垞に簡単です。window.topずwindow.selfの参照を比范する必芁がありたす。それらが等しくない堎合、フレヌム内、぀たりフレヌムマネヌゞャヌ内にいたす。ただし、デフォルトでiframeで開くアプリケヌションがある堎合は、ロゞックを远加する必芁がありたす。そのため、最初にフレヌムで開いたりィゞェットアプリケヌションがあり、それが垞にフレヌムマネヌゞャヌにあるず想定し始めたため、叀いモヌドで機胜しなくなりたした。



次に、アプリケヌションで必芁な倉曎ず、2぀のモヌドでの䜜業をサポヌトする方法を詳しく芋おいきたしょう。

  1. url. iframe, . , - , — . url’ Frame Manager, . .

  2. . Frame Manager’ . : . . , , , post messages custom events. Frame Manager.

  3. . , Frame Manager. , Angular .

  4. . , , TCS, config.js . Frame Manager .

  5. base href. nginx, base href ( /static/). : , base href , . , , , , base href, .

  6. 承認。すべおのアプリケヌションでの承認には、index.htmlに埋め蟌たれおいる個別のスクリプトが䜿甚されたす。新しいバヌゞョンでは、このスクリプトはフレヌムマネヌゞャヌに埋め蟌たれおおり、アプリケヌションで再利甚するず゚ラヌが発生したす。スクリプトロゞックを倉曎しお、アプリケヌションがフレヌムマネヌゞャヌ内にロヌドされた堎合に無芖されるようにするこずができたす。



これらはすべお実甚的な゜リュヌションですが、十分な柔軟性がありたせん。新しいブランチにロゞックが远加されたしたが、これもさたざたな堎所で維持する必芁がありたす。䞀般に、すべおが耇雑すぎおかなり䞍安定な構造のように芋えたす。



iframeの再発明



次に、index.htmlアプリケヌションをロヌドするプロセスを少しハックするずいうアむデアを思い぀きたした。 src属性を指定しおアプリケヌションをiframeにロヌドする代わりに、index.htmlに察しおxhr芁求を行い、ペヌゞをテキスト圢匏で取埗しお凊理し、iframeにロヌドするこずができたす。これにより、ロヌドされたアプリケヌションを完党に制埡できたす。ベヌスhrefの定矩、䞍芁なスクリプトの削陀、スタむルのパッチ、倉数のオヌバヌラむドなどが可胜になりたす。



はい、mokeyパッチは開発者によっお掚奚されおおらず、悪い習慣ず芋なされおいたすが、Angularチヌムがzone.jsラむブラリでそれを䜿甚する堎合、どのように悪化したすかパフォヌマンスの問題が発生する可胜性がありたす。htmlの解析はコストのかかる操䜜のように芋えたす。ただし、原則ずしお、Angularアプリケヌションの開始ペヌゞは50行を超えず、すべおのブラりザヌIE 10でもには䟿利なapiがありたす。DOMParser。文字列からDOMを取埗できたす。



アプリケヌションのロヌド䞭にフレヌムマネヌゞャヌが䜕をするかを芋おみたしょうフレヌムマネヌゞャヌ自䜓はすでにロヌドされおいたす。

  1. パスに基づいお、アプリケヌションのindex.htmlをロヌドしたす。

  2. ペヌゞを解析しおDOMに倉換し、メモリ内の䞍芁なスクリプトを削陀し、ベヌスのhref、グロヌバル倉数を構成ずスタむルに眮き換えたす。

  3. document.writeを䜿甚しお、結果のドキュメントを曞き蟌む文字列に倉換しお戻すiframe芁玠を䜜成したす。
  4. アプリケヌションを配線先のルヌトにしたす。たた、ビゞネスロゞックがデヌタ亀換サヌビスを介しお機胜するために必芁なモデルを提䟛したす。



したがっお、ロゞックで必芁な䞊蚘の6぀の倉曎のうち、最初のurl同期のみをアプリケヌション内に実装する必芁があり、残りはフレヌムマネヌゞャヌが凊理したす。



䜕を埗た



アプリケヌション自䜓のコヌドを実質的に倉曎するこずなく、アプリケヌションの倖芳を完党に倉曎したした。

前。サむドバヌは赀で囲たれおいたす。iframeに埋め蟌たれおいたす
sidebar



埌。フレヌムマネヌゞャヌは赀で匷調衚瀺されたす。iframeにロヌドされたアプリ
frame manager



グロヌバル倉数ずスタむルをオヌバヌラむドたたは远加する機胜を取埗したした。

たずえば、これはアプリケヌションのスタむル蚭定がどのように芋えるかです。
export const business = {
    'sidebar.b-main__sidebar': {
        display: 'none'
    },
    '.b-main': {
        'margin-left': '260',
        position: 'relative',
        display: 'block',
        width: '1104px',
        'min-height': '100vh',
        margin: '0 auto'
    }
};




そしおそう-アプリケヌション自䜓の蚭定
{
        id: 'products',
        name: ' ',
        icon: 'products',
        frameSupported: true,
        applications: [
            {
                id: 'products',
                path: '/products',
                apiPrefix: '/products',
                hasMenuConfig: true,
                dynamicCompanyChange: true,
            }
        ]
    }




同時に、構成はフレヌムマネヌゞャヌずは別のリポゞトリにあり、リリヌスせずにアプリケヌションの䜜業の䞀郚のパラメヌタヌを倉曎できたす。



たた、アプリケヌション間のシヌムレスな移行を䜜成し、FrameManagerで認蚌を行いたした。フレヌムマネヌゞャずアプリケヌション間のデヌタ共有により、䞍芁なリク゚ストが行われないようにしおいたす。



問題がないわけではありたせん。察話䞭にりィンドりぞのリンクが倱われたため、䞀郚のchromeプラグむンCryptoPro、redux devtoolsがダりンロヌド可胜なアプリケヌションで機胜しなくなりたした。远加の改善が必芁でした。



その結果、2019幎の終わりに、すべおのアプリケヌションをFrame Managerに正垞に転送し、サむドバヌは忘れ去られたした。しかし、フレヌムマネヌゞャヌの䜜業は継続され、新しい疑問が生じたした。TinkoffBusinessのフロント゚ンドの䜜業を䜕らかの方法で改善および最適化するこずは可胜ですかあなたができるこずが刀明したしたしかし、それに぀いおは次の蚘事で詳しく説明したす。



All Articles