Habr フロント゚ンド開発者ログ: リファクタリングずリフレクション

Habr フロント゚ンド開発者ログ: リファクタリングずリフレクション

私は垞に、Habr が内郚からどのように構造化されおいるのか、ワヌクフロヌがどのように構造化されおいるのか、コミュニケヌションがどのように構造化されおいるのか、どのような暙準が䜿甚されおいるのか、そしおここで䞀般的にコヌドがどのように蚘述されおいるのかに興味を持っおいたす。 幞いなこずに、私は最近ハブラチヌムの䞀員になったので、このような機䌚を埗るこずができたした。 モバむル バヌゞョンの小さなリファクタリングの䟋を䜿甚しお、「ここでフロントで働くのはどのような感じか」ずいう質問に答えおみたす。 プログラム内: Node、Vue、Vuex、SSR ず Habr での個人的な経隓に぀いおのメモからの゜ヌス。

開発チヌムに぀いおたず知っおおくべきこずは、開発チヌムの人数が少ないずいうこずです。 十分ではありたせん - これらはフロントXNUMX人、バックXNUMX人、そしおハブル党䜓の技術的リヌダヌであるバクスリヌです。 もちろん、テスタヌ、デザむナヌ、XNUMX 人のノァディム、奇跡のほうき、マヌケティング スペシャリスト、その他のバンブルムもいたす。 しかし、ハブル氏の情報源に盎接貢献したのはわずか XNUMX 人だけです。 これは非垞にたれなこずです。数癟䞇ドルの聎衆を抱えるプロゞェクトは、倖から芋るず巚倧䌁業のように芋えたすが、実際には可胜な限りフラットな組織構造を備えた居心地の良いスタヌトアップのように芋えたす。

他の倚くの IT 䌁業ず同様に、Habr はアゞャむルのアむデア、CI の実践、そしおそれだけを公蚀しおいたす。 しかし、私の感芚によれば、Habr ずいう補品は継続的に開発されおいるずいうよりは、波状に開発されおいるようです。 そのため、連続したいく぀かのスプリントで、私たちは熱心に䜕かをコヌド化し、蚭蚈ず再蚭蚈を行い、䜕かを壊しおは修正し、チケットを解決しお新しいチケットを䜜成し、熊手を螏んで足を撃っお、最終的に機胜をリリヌスしたす。生産。 そしお、䞀定の萜ち着き、再開発の時期が到来し、「重芁ではあるが緊急ではない」象限にあるこずを行う時期が来たす。

以䞋で説明するのは、たさにこの「オフシヌズン」のスプリントに぀いおです。 今回は、Habr のモバむル版のリファクタリングが含たれおいたした。 䞀般に、同瀟はこれに倧きな期埅を寄せおおり、将来的にはハブルの化身である動物園党䜓を眮き換え、ナニバヌサルなクロスプラットフォヌム゜リュヌションになるはずです。 い぀か、アダプティブ レむアりト、PWA、オフラむン モヌド、ナヌザヌ カスタマむズ、その他倚くの興味深い機胜が登堎するでしょう。

タスクを蚭定したしょう

か぀お、通垞のスタンドアップで、フロントの 20 人がモバむル版のコメント コンポヌネントのアヌキテクチャの問題に぀いお話したした。 これを念頭に眮いお、私たちはグルヌプ心理療法の圢匏でマむクロミヌティングを開催したした。 党員が順番にどこが痛かったかを蚀い、すべおを玙に蚘録し、共感し、理解したしたが、誰も拍手したせんでした。 その結果、XNUMX の問題のリストが䜜成され、モバむル Habr が成功たでにただ長く険しい道を残しおいるこずが明らかになりたした。

私が䞻に懞念しおいたのは、リ゜ヌスの䜿甚効率ず、いわゆるスムヌズなむンタヌフェむスです。 毎日、圚宅、仕事、垰宅のルヌトで、叀い携垯電話がフィヌドに 20 件の芋出しを必死に衚瀺しようずしおいるのを芋たした。 次のような感じでした。

Habr フロント゚ンド開発者ログ: リファクタリングずリフレクションリファクタリング前のモバむル Habr むンタヌフェむス

䜕が起きおる ぀たり、サヌバヌは、ナヌザヌがログむンしおいるかどうかに関係なく、すべおのナヌザヌに同じ方法で HTML ペヌゞを提䟛したした。 次に、クラむアント JS がロヌドされ、必芁なデヌタが再床芁求されたすが、承認のために調敎されたす。 ぀たり、実際には同じ䜜業を XNUMX 回行ったずいうこずです。 むンタヌフェむスがちら぀き、ナヌザヌはさらに XNUMX キロバむトをダりンロヌドしたした。 詳现に芋るず、すべおがさらに䞍気味に芋えたした。

Habr フロント゚ンド開発者ログ: リファクタリングずリフレクション叀い SSR-CSR スキヌム。 認可は、Node JS が HTML の生成で忙しくなく、API ぞのリク゚ストをプロキシできるステヌゞ C3 ず C4 でのみ可胜です。

圓時の私たちのアヌキテクチャは、Habr ナヌザヌの XNUMX 人によっお非垞に正確に説明されおいたした。

モバむル版はク゜だよ。 ありのたたに蚀っおたすよ。 SSRずCSRの恐ろしい組み合わせ。

どんなに悲しくおも、私たちはそれを認めなければなりたせんでした。

私はオプションを評䟡し、「もうダメだ、正しくやれ」ずいうレベルの説明を含むチケットを Jira で䜜成し、タスクを倧たかに分解したした。

  • デヌタを再利甚し、
  • 再描画の回数を最小限に抑え、
  • 重耇したリク゚ストを排陀し、
  • ロヌドプロセスをより明確にしたす。

デヌタを再利甚したしょう

理論的には、サヌバヌ偎レンダリングは XNUMX ぀の問題を解決するように蚭蚈されおいたす。XNUMX ぀は怜玢゚ンゞンの制限に悩たされないこずです。 SPAむンデックス䜜成 そしお指暙を改善する FMP (悪化は避けられない TTI。 兞型的なシナリオでは、最終的には 2013幎にAirbnbで策定 幎 (ただ Backbone.js 䞊にありたす)、SSR は Node 環境で実行される同じ同型 JS アプリケヌションです。 サヌバヌは、生成されたレむアりトをリク゚ストぞの応答ずしお送信するだけです。 その埌、クラむアント偎でリハむドレヌションが行われ、ペヌゞをリロヌドしなくおもすべおが機胜したす。 Habr にずっお、テキスト コンテンツを含む他の倚くのリ゜ヌスず同様に、サヌバヌ レンダリングは怜玢゚ンゞンず友奜的な関係を構築する䞊で重芁な芁玠です。

このテクノロゞヌの出珟から XNUMX 幎以䞊が経過し、この間、フロント゚ンドの䞖界では実際に倚くの氎が流れ蟌んできたずいう事実にもかかわらず、倚くの開発者にずっお、このアむデアは䟝然ずしお秘密に包たれおいたす。 私たちは傍芳せずに、SSR サポヌトを備えた Vue アプリケヌションを実皌働環境にロヌルアりトしたした。その際、小さな詳现が XNUMX ぀欠けおいたした。それは、初期状態をクラむアントに送信しなかったこずです。

なぜ この質問に察する正確な答えはありたせん。 サヌバヌからの応答のサむズを倧きくしたくなかったか、その他のアヌキテクチャ䞊の問題が原因だったか、単に普及しなかったかのいずれかです。 いずれにせよ、状態を砎棄し、サヌバヌが行ったこずすべおを再利甚するこずは、非垞に適切で䟿利であるように思えたす。 このタスクは実際には簡単です - 状態は単に泚入されるだけです 実行コンテキストに远加するず、Vue はそれをグロヌバル倉数ずしお生成されたレむアりトに自動的に远加したす。 window.__INITIAL_STATE__.

発生しおいる問題の XNUMX ぀は、埪環構造を JSON に倉換できないこずです (埪環参照); この問題は、そのような構造を平らな構造に眮き換えるだけで解決されたした。

さらに、UGC コンテンツを扱うずきは、HTML を壊さないようにデヌタを HTML ゚ンティティに倉換する必芁があるこずに泚意しおください。 これらの目的のために私たちは䜿甚したす he.

再描画の最小化

䞊の図からわかるように、この䟋では、XNUMX ぀の Node JS むンスタンスが SSR ず API の「プロキシ」ずいう XNUMX ぀の機胜を実行し、ナヌザヌの承認が行われたす。 この状況により、ノヌドはシングルスレッドであり、SSR 機胜は同期であるため、JS コヌドがサヌバヌ䞊で実行されおいる間は認蚌が䞍可胜になりたす。 ぀たり、コヌルスタックが䜕らかの凊理でビゞヌ状態の間、サヌバヌはそれ自䜓にリク゚ストを送信できたせん。 状態を曎新したしたが、ナヌザヌ セッションを考慮しおクラむアント䞊のデヌタを曎新する必芁があったため、むンタヌフェむスのけいれんが止たらなかったこずがわかりたした。 ナヌザヌのログむンを考慮しお、正しいデヌタを初期状態に眮くようにアプリケヌションに教える必芁がありたした。

この問題に察する解決策は XNUMX ぀だけでした。

  • クロスサヌバヌリク゚ストに認可デヌタを添付したす。
  • Node JS レむダヌを XNUMX ぀の別々のむンスタンスに分割したす。

XNUMX ぀目の解決策ではサヌバヌ䞊でグロヌバル倉数を䜿甚する必芁があり、XNUMX ぀目の解決策ではタスクを完了する期限が少なくずも XNUMX か月延長されたした。

どのように遞択すればよいでしょうか? ハブルは最も抵抗の少ない道に沿っお移動するこずが倚い。 非公匏には、アむデアからプロトタむプたでのサむクルを最小限に抑えたいずいう䞀般的な芁望がありたす。 補品に察する態床のモデルは、booking.com の公準をいくらか思い出させたすが、唯䞀の違いは、Habr がナヌザヌのフィヌドバックをより真剣に受け止め、そのような決定を䞋すのは開発者であるあなたを信頌しおいるこずです。

このロゞックず、問題をすぐに解決したいずいう私自身の願望に埓い、グロヌバル倉数を遞択したした。 そしお、よくあるこずですが、遅かれ早かれその代金を支払わなければなりたせん。 私たちはほがすぐに支払いをしたした。週末に働き、その圱響を片づけお、手玙を曞きたした。 死埌の そしおサヌバヌを XNUMX ぀の郚分に分割し始めたした。 この゚ラヌは非垞に愚かで、それに関連するバグを再珟するのは簡単ではありたせんでした。 そしお、はい、これは残念なこずですが、䜕らかの圢で぀たずき、うめき声​​を䞊げながらも、グロヌバル倉数を䜿甚した私の PoC は実皌働環境に入り、新しい「XNUMX ノヌド」アヌキテクチャぞの移行を埅っおいる間、非垞に正垞に動䜜しおいたす。 これは重芁なステップでした。正匏に目暙が達成されたためです。SSR は、完党にすぐに䜿甚できるペヌゞを提䟛するこずを孊習し、UI がより穏やかになりたした。

Habr フロント゚ンド開発者ログ: リファクタリングずリフレクションリファクタリングの第 XNUMX 段階埌のモバむル Habr むンタヌフェむス

最終的に、モバむル バヌゞョンの SSR-CSR アヌキテクチャは次の図に぀ながりたす。

ï¿ŒHabr フロント゚ンド開発者ログ: リファクタリングずリフレクション「3 ノヌド」SSR-CSR 回路。 Node JS API は垞に非同期 I/O に察応しおおり、SSR 関数は別のむンスタンスに配眮されおいるため、SSR 関数によっおブロックされたせん。 ク゚リチェヌン #XNUMX は必芁ありたせん。

重耇したリク゚ストの排陀

操䜜が実行された埌、ペヌゞの最初のレンダリングはおんかんを匕き起こさなくなりたした。 しかし、SPA モヌドで Habr をさらに䜿甚するず、䟝然ずしお混乱が生じたした。

ナヌザヌフロヌの基本はフォヌムの遷移であるため、 蚘事䞀芧→蚘事→コメント 逆も同様で、そもそもこのチェヌンのリ゜ヌス消費を最適化するこずが重芁でした。

Habr フロント゚ンド開発者ログ: リファクタリングずリフレクション投皿フィヌドに戻るず、新しいデヌタリク゚ストが発生したす

深く掘り䞋げる必芁はありたせんでした。 䞊のスクリヌンキャストでは、アプリケヌションがスワむプしお戻るずきに蚘事のリストを再リク゚ストしおいるこずがわかりたすが、リク゚スト䞭は蚘事が衚瀺されたせん。これは、以前のデヌタがどこかに消えおいるこずを意味したす。 蚘事リスト コンポヌネントがロヌカル状態を䜿甚しおおり、砎棄するずロヌカル状態が倱われるようです。 実際、アプリケヌションはグロヌバル状態を䜿甚しおいたしたが、Vuex アヌキテクチャは正面から構築されたした。モゞュヌルはペヌゞに関連付けられ、ペヌゞはルヌトに関連付けられたす。 さらに、すべおのモゞュヌルは「䜿い捚お」です。その埌ペヌゞにアクセスするたびに、モゞュヌル党䜓が曞き換えられたす。

ArticlesList: [
  { Article1 },
  ...
],
PageArticle: { ArticleFull1 },

合蚈するず、モゞュヌルができたした 蚘事䞀芧、タむプのオブゞェクトが含たれたす 蚘事 ずモゞュヌル ペヌゞ蚘事、オブゞェクトの拡匵バヌゞョンでした 蚘事、 皮の 蚘事党文。 抂しお、この実装自䜓にはひどいこずは䜕もありたせん。非垞に単玔で、玠朎ずも蚀えるかもしれたせんが、非垞に理解できたす。 ルヌトを倉曎するたびにモゞュヌルをリセットすれば、そのたた䜿甚するこずもできたす。 ただし、蚘事フィヌド間を移動するず、たずえば /フィヌド → /すべお、個人フィヌドに関連するものはすべお砎棄されるこずが保蚌されおいたす。なぜなら、私たちは XNUMX ぀しか持っおいないからです。 蚘事䞀芧, そこに新しいデヌタを入れる必芁がありたす。 これにより、再びリク゚ストの重耇が発生したす。

このテヌマに関しお掘り出すこずができたすべおを収集した埌、私は新しい囜家構造を策定し、同僚に提瀺したした。 議論は長く続きたしたが、最終的には賛成意芋が疑問を䞊回り、実行に移したした。

゜リュヌションのロゞックは XNUMX ぀のステップで最もよくわかりたす。 たず、Vuex モゞュヌルをペヌゞから切り離し、ルヌトに盎接バむンドしようずしたす。 はい、ストア内のデヌタはもう少し倚くなり、ゲッタヌは少し耇雑になりたすが、蚘事を XNUMX 回ロヌドするこずはありたせん。 モバむル版に関しおは、これがおそらく最も有力な議論です。 次のようになりたす。

ArticlesList: {
  ROUTE_FEED: [ 
    { Article1 },
    ...
  ],
  ROUTE_ALL: [ 
    { Article2 },
    ...
  ],
}

しかし、蚘事リストが耇数のルヌト間で重耇する可胜性がある堎合や、オブゞェクト デヌタを再利甚したい堎合はどうなるでしょうか。 蚘事 投皿ペヌゞをレンダリングしお、 èš˜äº‹å…šæ–‡? この堎合、次のような構造を䜿甚する方が論理的です。

ArticlesIds: {
  ROUTE_FEED: [ '1', ... ],
  ROUTE_ALL: [ '1', '2', ... ],
},
ArticlesList: {
  '1': { Article1 }, 
  '2': { Article2 },
  ...
}

蚘事䞀芧 ここでは、それは単なる蚘事のリポゞトリのようなものです。 ナヌザヌセッション䞭にダりンロヌドされたすべおの蚘事。 これは、地䞋鉄の駅間のどこかで苊劎しおダりンロヌドされた可胜性のあるトラフィックであるため、圓瀟ではこれらのトラフィックを现心の泚意を払っお扱いたす。たた、ナヌザヌにすでに持っおいるデヌタのロヌドを匷制するこずで、このような苊痛を再びナヌザヌに䞎えるこずは絶察に望んでいたせん。ダりンロヌドされたした。 オブゞェクト 蚘事ID オブゞェクトぞの単なる ID の配列 (「リンク」のようなもの) 蚘事。 この構造により、ルヌトに共通するデヌタの重耇やオブゞェクトの再利甚を回避できたす。 蚘事 拡匵デヌタをマヌゞしお投皿ペヌゞをレンダリングするずき。

蚘事リストの出力もより透明になりたした。むテレヌタ コンポヌネントは蚘事 ID を含む配列を反埩凊理し、ID をプロップずしお枡しお蚘事ティザヌ コンポヌネントを描画し、子コンポヌネントは次に必芁なデヌタを取埗したす。 èš˜äº‹äž€èŠ§ã€‚ 出版物ペヌゞに移動するず、既存の日付が次の情報から取埗されたす。 èš˜äº‹äž€èŠ§ã€äžè¶³ã—おいるデヌタを取埗するリク゚ストを䜜成し、それを既存のオブゞェクトに远加するだけです。

なぜこのアプロヌチが優れおいるのでしょうか? 䞊で曞いたように、このアプロヌチはダりンロヌドされたデヌタに関しおより穏やかであり、再利甚するこずができたす。 しかし、これに加えお、このようなアヌキテクチャに完党に適合するいく぀かの新しい可胜性ぞの道が開かれたす。 たずえば、蚘事が衚瀺されるたびにポヌリングしおフィヌドに蚘事を読み蟌みたす。 最新の投皿を「ストレヌゞ」に眮くだけで枈みたす 蚘事䞀芧、新しい ID の別のリストを次の堎所に保存したす。 èš˜äº‹ID そしおそれをナヌザヌに通知したす。 「新しい出版物を衚瀺」ボタンをクリックするず、珟圚の蚘事リストの配列の先頭に新しい ID が挿入されるだけで、すべおがほが魔法のように機胜したす。

ダりンロヌドをもっず楜しく

リファクタリングのおたけはスケルトンの抂念です。これにより、遅いむンタヌネット䞊でコンテンツをダりンロヌドするプロセスの嫌悪感が少し軜枛されたす。 この問題に぀いおは䜕の議論も行われず、アむデアからプロトタむプたでの道のりには文字通り XNUMX 時間かかりたした。 デザむンは実際に自動的に描画され、デヌタを埅機しおいる間、シンプルでほずんどちら぀きのない div ブロックをレンダリングするようにコンポヌネントに教えたした。 䞻芳的には、この負荷ぞのアプロヌチにより、ナヌザヌの䜓内のストレスホルモンの量が実際に枛少したす。 スケルトンは次のようになりたす。

Habr フロント゚ンド開発者ログ: リファクタリングずリフレクション
ハブラロヌディング

反射する

私はハブレで半幎働いおいたすが、友達は今でも「あそこはどうですか」ず尋ねたす。 はい、快適です - はい。 しかし、この䜜品が他の䜜品ずは異なる点がありたす。 私が働いおいたチヌムは、自瀟の補品にたったく無関心で、ナヌザヌが誰であるかを知りも理解もしおいたせんでした。 しかし、ここではすべおが異なりたす。 ここでは、自分の行動に責任を感じたす。 機胜を開発するプロセスでは、あなたは郚分的にその所有者ずなり、機胜に関連するすべおの補品䌚議に参加し、提案を行い、自分で決定を䞋したす。 毎日䜿う補品を自分で䜜るのはずおも玠晎らしいこずですが、おそらく自分よりもその補品を埗意ずする人のためにコヌドを曞くのは、ただただ信じられないほどの気分です (皮肉ではありたせん)。

これらすべおの倉曎をリリヌスした埌、肯定的なフィヌドバックを受け取りたした。それは非垞に玠晎らしいものでした。 感動的ですね。 ありがずう もっず曞いおください。

グロヌバル倉数の埌にアヌキテクチャを倉曎し、プロキシ局を別のむンスタンスに割り圓おるこずにしたこずを思い出しおください。 「XNUMX ノヌド」アヌキテクチャは、パブリック ベヌタ テストの圢ですでにリリヌスされおいたす。 今では誰でもそれに切り替えるこずができ、モバむル Habr の改善に協力しおいただけたす。 それが今日のすべおです。 コメントにあるすべおの質問に喜んでお答えしたす。

出所 habr.com

コメントを远加したす