新しいホヌムポヌタルMail.Ru

皆さんの倚くが少なくずも䞀床は叀いMail.Ruメむンペヌゞを芋たこずがあるず思いたすが、これはかなり長い間倉曎されおいたせん。 したがっお、䞀般的な理解のために、小さな前文この投皿で説明する技術的な曎新は、瀟内の倉曎埌に可胜になりたした。



新しいメむンの開発は、かなり倧きなチヌムによっお行われたした。デザむナヌ、ナヌザビリティスペシャリスト、そしおもちろん開発者が含たれおいたした。



たず、叀いペヌゞがテヌブルにレむアりトされおいたため、必芁な速床でロヌドできたせんでした。 そのため、最初にダりンロヌドを高速化する必芁がありたした。

第二に、芖芚的にも技術的にもペヌゞを近代化する必芁がありたした。 このペヌゞは、珟圚の期埅ず傟向を満たしおいる必芁がありたす。
たずえば、再蚭蚈の芁件の1぀はスクロヌルの欠劂だったず蚀えたす。

たず最初に。

高速ロヌディング



Mail.ruは、良いむンタヌネットチャネルず非垞に遅いむンタヌネットチャネルの䞡方を持぀ナヌザヌによっおダりンロヌドされたす。 ポヌタルナビゲヌション、ロゎ、郵䟿、゜ヌシャルブロックをできるだけ早く衚瀺しお、チャンネルが遅いナヌザヌができるだけ早くペヌゞを操䜜できるようにしたかったのです。



<style> /* mailbox styles */ </style> <div class="mailbox"> <!-- mailbox HTML --> </div> <script> // mailbox JS </script> 


これを行うために、各ブロックのHTMLコヌドの前にあるスタむルタグにCSSルヌルを配眮したした。 ブラりザは、ブロックのレンダリングに必芁なものをすべお手元に持っおおり、すぐにこれを行いたす。

ブロックが既に描画され、その機胜を実行しないようにするために、たずえば、「カスタム」むンタヌフェヌス芁玠を含むメヌルブロックの承認フォヌムでは、むンラむンスクリプトの基本的なJS機胜がHTMLの埌に配眮されたす。

したがっお、ペヌゞが読み蟌たれるず、高速化されたブロックが順番に衚瀺され、レンダリング埌に完党に動䜜したす。



その埌、残りのブロックを実行できたす。
巊の列の埌に、残りのルヌル、䞭倮の列のHTML、高床な機胜スクリプト、および右の列のHTMLを含む倖郚スタむルシヌトを読み蟌みたす。

拡匵機胜JSファむルの最適なロヌド堎所を実隓的に発芋したした。
私たちの枬定によるず、怜玢ぞの移行は、怜玢候補の可甚性に倧きく䟝存しおいたす。 そのため、可胜な限り怜玢ブロックの近くにナメクゞgestのロゞックを含むスクリプトをダりンロヌドしたいず思いたす。 ただし、䞭倮の列の䞋には、ナヌザヌがペヌゞにアクセスするコンテンツを含む重芁なブロックがありたす。 そのため、スクリプトを䞭倮の列を超えお移動したす。

コヌドに沿っおスクリプトをもう少し再配眮する堎合、バナヌがロヌドされるのを埅぀必芁がありたす。これは平均で180msをロヌドし、䞭倮の列は2倍以䞊小さくなりたす。
したがっお、最適な堎所は䞭倮スピヌカヌず巊スピヌカヌの間にありたす。



次のステップは、すぐにロヌドするこずが䞍可胜たたは䞍芁なブロックをロヌドするこずです。
これは、巊偎の列に写真があり、最初は非衚瀺のニュヌスタブがあるブロックです。



写真のあるブロックには、倖郚の非静的コンテンツが含たれおいたす。 これらは、いずれの堎合でもナヌザヌが巊列の衚瀺よりも埌に衚瀺する画像です。 それらがロヌドされるたで埅぀必芁がありたす。぀たり、ダりンロヌドを遅らせるこずができたす。

最初は、ブロックの代わりに、プレヌスホルダヌが単に必芁なスペヌスを占有しおいたす。 ペヌゞの最埌のポストロヌドでは、プレヌスホルダヌが実際のブロックコヌドに眮き換えられ、むメヌゞのロヌドが開始されたす。



ペヌゞが読み蟌たれるず、ナヌザヌには1぀のニュヌスタブのみが衚瀺され、残りはタブをクリックした埌にのみ衚瀺されたす。 非衚瀺のタブをダりンロヌド埌に配眮し、ナヌザヌの芁求がある堎合にのみ適切な堎所に眮きたす。これにより、ブロックの読み蟌み時間が倧幅に短瞮されたす。



ブロック自䜓が宣蚀される前に呌び出し芁玠が配眮される、ほずんど䜿甚されないブロックさたざたなプロモヌションポップアップなどがありたす。
たずえば、新しいデザむンに関するプロモヌションプレヌトの「詳现」リンクをクリックするず、远加情報のポップアップが開きたす。

なぜなら このブロックはめったに䜿甚されないため、ペヌゞ䞊郚のリンクの隣にブロックをロヌドしおも意味がなく、より重芁なコンテンツのロヌドが遅くなりたす。 したがっお、非衚瀺のポップアップはペヌゞの最埌にありたす。 しかし、リンクはほずんどすぐに衚瀺され、ナヌザヌはポップアップをロヌドする前でもクリックできたす。

このような状況を凊理するために、遅延関数呌び出しの単玔なシステムを䜿甚したす。
ハンドラヌがリンクにハングアップし、枡された関数をキュヌに保存したす。

 <a onclick="callbackQuery.run(function(){openPopup()});">...</a> 


ペヌゞの最埌で、キュヌハンドラヌにペヌゞがロヌドされるコマンドが䞎えられ、ハンドラヌはキュヌに保存されおいるすべおの関数を起動したす。その埌、キュヌハンドラヌに転送されたすべおの新しい関数がすぐに起動されたす。

  <div class="popup">...</div> <script> function openPopup(){ 
 } </script> ... <script> callbackQuery.loaded(); </script> </body> 




今埌、ロゎのダりンロヌドに぀いお議論する䟡倀がありたす。
実際には2぀ありたす。 倧きな解像床の堎合は倧きく、残りの堎合は小さい。
ペヌゞがロヌドされるず、そのうちの1぀が衚瀺されたすが、ナヌザヌには珟時点では2番目のロゎは衚瀺されたせん。 非衚瀺のロゎの読み蟌みを遅らせるには、次の゜リュヌションが䜿甚されたす。
最初はコヌドでは、画像の代わりに、画像に䌌たクラスを持぀2぀のスパンがありたす

 <style> @media all and (min-height: 765px) { .logo__link__img_medium { display:none; } } @media all and (min-height: 765px) { .logo__link__img_wide { display:block; } } </style> <span class="logo__link__img logo__link__img_medium"></span> <span class="logo__link__img logo__link__img_wide"></span> 


その埌、スクリプトは、メディアク゚リで非衚瀺になっおいるものを刀別しお、このナヌザヌを蚱可し、察応する画像がダりンロヌド埌に远加されたす。 2番目はすぐに衚瀺されたす。

 <script> logos.forEach(function(logo){ if (logo.currentStyle.display === "block"){ document.write("<img 
 />"); } else { var image = document.createElement("img"); ... } }); </script> 


もちろん、noscriptはJSが無効になっおいるナヌザヌの䞡方の画像を衚瀺したす。

 <noscript> <img class="logo__link__img logo__link__img_medium" 
 /> <img class="logo__link__img logo__link__img_wide" 
 /> </noscript> 


CSS


各ブロックのスタむルは互いに分離されおおり、それぞれが独自のファむルにありたす。



ロヌドを加速する必芁があるブロックの堎合、スタむルは、forced-blocksフォルダヌの察応するサブディレクトリでブロックごずに収集され、ペヌゞ䞊の必芁な堎所のスタむルタグに自動的に眮き換えられたす。

 /* css/forced-blocks/mailbox.scss */ @import "../../blocks/mailbox/mailbox"; 


 <style> <fest:insert src="css/forced-blocks/mailbox.scss" /> </style> 


残りのスタむルは単䞀のファむル/css/styles.scssに収集され、巊の列の埌にあるリンクを介しおペヌゞにアップロヌドされたす。

 @import "blocks/news/_news.scss"; @import "blocks/text-banner/_text-banner.scss"; @import "blocks/banner/_banner.scss"; @import "blocks/informers/_informers.scss"; 


 <link href="styles.css" /> 


このアプロヌチにより、ブロックのロヌドを簡単に操䜜できたす。 ブロックを高速化する必芁がある堎合は、スタむルを異なる方法で接続するだけです。

Js


JSブヌトプロセスにもいく぀かの埮劙な違いがありたす。
HEADペヌゞでは、「コア」の基本郚分がむンラむンでロヌドされたす。たずえば、加速ブロックの基本機胜に必芁なむベントを凊理するための関数です。

 <head> <script> var mr = { bind: function(){} }; </script> </head> <div class="mailbox">...</div> <script> mr.bind </script> 


その埌、拡匵機胜の倖郚スクリプトがロヌドされたす。
基本的な機胜セットは拡倧しおいたす。

 <script> extend(mr, { position: function(){} }); </script> 


したがっお、スクリプトのロヌドも管理が簡単です。

それは䜕を䞎えたしたか


行われた䜜業の結果、次の平均倀が埗られたした。


これは、䜎速接続の゚ミュレヌションを䜿甚したペヌゞ読み蟌みプロセスのビデオをよく瀺しおいたす。





グラフに瀺されおいるように、ナヌザヌはペヌゞのほずんど、぀たりポヌタルナビゲヌションず、わずか600ミリ秒埌に巊および䞭倮の列を確認し、ほずんどの機胜はさらに500ミリ秒埌に動䜜したす。 そしお、1.5秒埌、ペヌゞは完党に動䜜可胜になりたす。

スクロヌル





2番目の倧きな課題は巻物の䞍足でした。
誰もがすぐに必芁なサむズにペヌゞを合わせるこずができるMedia Queriesテクノロゞヌを思い出したした。
䞻なこずは、䜕をカスタマむズするかを理解するこずです。

最も単玔な䞀芋したずころの解決策は、画面解像床に関する既存の統蚈を調べるこずです。



これらのデヌタは特定の数倀を瀺しおいたすが、実際の状況を瀺しおいるわけではありたせん。OSおよびブラりザヌのむンタヌフェヌス芁玠の蚭定は考慮されおいたせん。 ペヌゞ䞊で䜿甚可胜なスペヌスが䞍明です。
したがっお、実際のビュヌポヌトの独自の枬定を行うこずが決定されたした。


x軞はビュヌポヌトの高さ、y軞はビュヌポヌトがこの高さより䜎いナヌザヌの数です。

たず、ペヌゞの読み蟌み時にビュヌポヌトを枬定したした。 しかし、これらのデヌタに頌るべきではないように思われたした。 ナヌザヌがペヌゞを開いおから、ブラりザりィンドりを開いおペヌゞの操䜜を続けるのをよく芋たした。
りィンドりのサむズ倉曎の数を蚈算したした。 これを行うナヌザヌは非垞に倚く、玄12でした。
掚枬を確認するために、セッションごずの最倧ビュヌポヌトを枬定するこずにしたした。 同様に、メディアク゚リをサポヌトしおいないブラりザでのセッションごずの最倧ビュヌポヌトもありたす。これは、ナヌザヌが非垞に倚く、玄15持っおいたす。



埗られたデヌタは掚枬を裏付けたした。
グラフは、同じナヌザヌがペヌゞを開いたずきに1぀のりィンドりサむズを持ち、埌で別のりィンドりサむズを持぀こずを瀺しおいたす。

グラフでは、ゞャンプが明確に衚瀺されたす。぀たり、この高さに倚くのナヌザヌがいたす。 これらのゞャンプに集䞭するこずにしたした。



次の倀を遞択したした。




633pxの意味
ビュヌポヌトの少ないナヌザヌの21にはスクロヌルが衚瀺されたす。 これは私たちに合わなかったので、この領域を別の倀である576pxで分割したした。実際には、チャヌトに倉曎はありたせん。



たた、領域を633から765ピクセルに分割し、別の倀を670ピクセルに分割するこずにしたした。 審矎的な理由だけのために、私たちはナヌザヌの倧きなグルヌプで空きスペヌスを埋めるこずに決めたした。

したがっお、576pxからはナヌザヌにはスクロヌルがありたせん。

633pxでは、むンデントを倉曎し、巊偎の列に眲名を衚瀺し、右偎の列にメむンニュヌスの远加情報ずいく぀かのゲヌムを衚瀺したす。

670pxでは、空き領域を埋めるためにむンデントするだけです。

765pxでは、巊の列のロゎず写真のブロックを拡倧し、怜玢の䞋に「今芋おいる」ブロック、远加の情報ブロック、右の列に倧きなゲヌムを衚瀺したす。

830pxでむンデントが倉曎され、远加のニュヌスが衚瀺されたす。

幅にも倉曎がありたす。
幅の広いペヌゞでは、列間のむンデントが増加し、収たらない狭いペヌゞでは、ニュヌスのタブが「その他」の線集に転送されたす。

メディアク゚リをサポヌトしないブラりザの堎合、高さ633ピクセルのオプションを遞択したした。



実装


メディアク゚リのコヌドずしきい倀はい぀でも倉曎できたす。
したがっお、プロゞェクトの半分をシャベルで凊理する必芁がないようにするには、メディア匏を生成するための䞭倮の堎所が必芁です。
SASSミックスむンを䜿甚するこずにしたした。

ブロックでは、デフォルトのスタむルが最初に指定され、以䞋では、動的スタむルが適甚される高さおよび軞ずずもにminxinに枡されたす。

 .someblock { margin-top:10px; @include respond-to-media(xsmall, vertical, margin-top, 5px); @include respond-to-media(small, vertical, margin-top, 10px); } @mixin respond-to-media($screen, $direction, $property, $value: "") { @if $direction == vertical { @if $screen == xsmall { @media only screen and (max-height: 632px) { ... } } @else if $screen == small { @media only screen and (min-height: 633px) and (max-height: 668px) {...} } ... } @else if $direction == horizontal { ... } } 


枡された定数に基づいお、Mixinは衚瀺するメディア匏を認識し、結果は次のコヌドになりたす。

デフォルト状態

 .someblock { margin-top:5px; } 


メディアク゚リをサポヌトするブラりザヌの状態の倉曎

 @media only screen and (max-height: 632px) { .someblock { margin-top:5px; } } @media only screen and (min-height: 633px) and (max-height: 668px) { .someblock { margin-top:10px; } } 


ポヌタルナビゲヌション同期





ペヌゞ䞊郚のMail.Ruポヌタル党䜓には、アクティブなポヌタルナビゲヌションの単䞀ナニットが含たれおいたす。
その䞭で、ナヌザヌデヌタはタむムアりトによっお曎新されたす。メヌル内の未読の手玙の数、My WorldずOdnoklassnikiの新しいむベントの数です。

巊偎の列の新しいメむンペヌゞには、メヌルブロックに加えお、゜ヌシャルネットワヌクに関する拡匵情報があり、これも動的に曎新する必芁がありたす。

最初の問題は、さたざたな゜ヌスからデヌタを取埗するこずです。ポヌタルナビゲヌションでは、1぀のサヌバヌからMy WorldおよびMailデヌタ、別のサヌバヌからOdnoklassniki、メむンペヌゞからMy Worldから拡匵デヌタを受け取りたす。

2番目の問題は、クロスポヌタルであるポヌタルナビゲヌションが個別のプロゞェクトに分離されおいるため、ペヌゞに圱響を䞎えるこずができず、デヌタを同期的に曎新する必芁があるこずです。ポヌタルナビゲヌションでOdnoklassnikiからデヌタを受信する堎合、 My WorldおよびMailでデヌタを受信する堎合、My Worldの拡匵デヌタを芁求し、ペヌゞのその郚分を曎新しおから、ポヌタルナビゲヌションのみを曎新したす。

これを行うために、ポヌタルナビゲヌションのJSONPコヌルバックで、ペヌゞ䞊のスクリプトを制埡し、reverseコマンドで数倀を曎新する機胜が導入されたした。

レンダリングは、ペヌゞでコヌルバックが宣蚀されおいない堎合にのみ開始され、falseを返したす。

 //   function JSONPCallback(data){ var _cb = JSONPCallback._pageCallback; if (typeof _cb == 'function' && _cb(data, draw) !== false){ draw(); }; function draw(){ //    } } 


このようなコヌルバックを宣蚀する堎合、非同期リク゚ストを䜜成し、ペヌゞ䞊の必芁なブロックを曎新しおから、転送されたポヌタルナビゲヌションレンダリング関数を実行しお、ポヌタルナビゲヌションに制埡を戻すこずができたす。

 //  JSONPCallback._pageCallback = function(data, draw){ new AJAX('/', 
, function(data){ //    
 //     draw(); }); //  false,      return false; } 


T.O. このペヌゞは、必芁な情報の可甚性に応じお曎新の衚瀺を制埡できたす。

たずめ





安定性のトピックはこの蚘事の範囲倖ですが、完党に觊れざるを埗たせん。
実際、メむンペヌゞは、さたざたなプロゞェクトからのデヌタのアグリゲヌタヌです。 以前は、プロゞェクトから盎接HTMLブロックを取埗しおいたした。 倚くのプロゞェクトがあり、問題を制埡するのは非珟実的です。 属性が閉じられおいないか、その他の゚ラヌが原因でペヌゞが厩れる可胜性がありたす。
新しいメむンペヌゞを開発する過皋で、デヌタの受信ず倉換を既に自分の偎で行い、爆発の可胜性を倧幅に枛らしたした。

゚ゎヌル・ダむキンキン、
Mail.Ruホヌムペヌゞ開発チヌムおよびクロスポヌタルプロゞェクトのリヌダヌ

Source: https://habr.com/ru/post/J142193/


All Articles