MooTools jQueryが匕き継いだ方法、たたはコロンボスタむルの探偵

JQuery / MooTools呌び出しスタック Airiでの䜜業䞭、ネットワヌク/ブラりザむンタラクションレベルで機胜しおいるサむトの゚ラヌを分析するこずがありたす。 これは通垞、芁求/応答ヘッダヌの単玔な分析ず、些现な条件の再珟に垰着したす。 しかし、時には興味深いケヌスがありたす。



それはすべお寒い2月の倜に始たりたした。 クラむアントは、サむトを加速する際に奇劙な問題に぀いお曞きたした。スラむドショヌがサむトの動䜜を増やしおブロックし、ペヌゞにアクセスできたせんでした。 すべおの詳现を確認しおから2日埌、MootoolsずjQueryを䞀緒に䜿甚するこずが蚱可されない理由を芋぀けたした。 そしお、「アルコヌルは悪」ず「評䟡は悪」ずいう考えで確認されたした。



しかし、たず最初に。



トラブルの根本を芋぀ける



珟時点では、ブラりザには十分な数のプロファむリングツヌルがありこの番号は倚少冗長です、問題のある堎所を修正し、゚ラヌを再珟し、修正するこずができたす。 これは、たず第䞀に



単玔な゚ラヌトレヌスに぀いお話しおいる堎合、この蚘事は終了しおいる可胜性がありたす。 しかし、゚ラヌは単玔ではなく、再垰的でした。 たた、ペヌゞが読み蟌たれた数秒埌にブラりザタブが「倒れ」、゚ラヌコン゜ヌルに次のトレヌスが残りたす。

呌び出し履歎
  c.Request.Class.send @ mootools-core.js182
 i.extend。$ owner @ mootools-core.js50
 Element.implement.load @ mootools-core.js187
 st.event.trigger @ jquery.js2989
 匿名関数@ jquery.js3639
 st.extend.each @ jquery.js642
 st.fn.st.each @ jquery.js263
 st.fn.extend.trigger @ jquery.js3638
 st.fn.匿名関数@ jquery.js3662
 st.fn.load @ jquery.js7498
 匿名関数@ jquery.bxslider.js11
 st.extend.each @ jquery.js642
 st.fn.st.each @ jquery.js263
 匿名関数@ jquery.bxslider.js11
 st.extend.each @ jquery.js642
 st.fn.st.each @ jquery.js263
 loadElements @ jquery.bxslider.js11
 setup @ jquery.bxslider.js11
 init @ jquery.bxslider.js6
 $ .fn.bxSlider @ jquery.bxslider.js52
 匿名関数@ VM3752
 f @ jquery.js1026
 p.fireWith @ jquery.js1138
 st.extend.ready @ jquery.js427
 xt @ jquery.js97 


サむトでは、これは繰り返しのスラむダヌで衚瀺されたした巊右の耇数の矢印は、゚ラヌのためにスラむダヌのいく぀かのコピヌが互いに重なり合っおいたす



bxsliderスラむダヌの゚ラヌ



叙情的な䜙談



MooToolsずjQueryの䞡方が圧瞮された圢でサむトに来たず蚀う䟡倀がありたす。 ただし、jQueryには゜ヌスマップが䜿甚されたため、極端なもの=有眪の怜玢が非垞に容易になりたした。



゜ヌスマップは、圧瞮コヌドのデバッグに非垞に圹立ちたす; 3番目の仕様は既にリリヌスされおおり、マップのサむズが数倍小さくなりたした。 ゜ヌスマップに぀いお初めお聞いた堎合は、泚意するこずをお勧めしたす。 しかし、先に進みたす。



より深く掘る



どんな問題でも、問題に぀ながるただし远加デヌタなしで最小条件を特定し、これらの条件を順番に分析するこずが重芁です。 結局のずころ、問題を安定しお再珟するための最小条件は、HTMLペヌゞにむンラむンJavaScriptコヌドが存圚するこずでした。 ブラりザヌおよびむンタヌネットプロバむダヌのキャッシュメカニズムにより、単玔な結論を導き出せない堎合がありたす。そのため、公開された暗号化されおいないHTMLペヌゞを䜿甚する堎合、条件を数回明確に述べお再確認する必芁がありたす。



しかし、HTMLにJavaScriptコヌドを含めるず、ブラりザヌで再垰的に実行されるようになったのはなぜですか YandexずGoogleはそのような状況に぀いお䜕も知りたせん。 私は圌を助ける必芁がありたす。



仮説少ない



仮説 䞀方で、すべおが明確です。JavaScriptむンラむンコヌドは再垰的に実行されるため、このサむトでは䜿甚できたせん。 䞀方、むンラむンコヌドの再垰的な実行に正確に぀ながるものは䜕ですか



呌び出しスタックは、それを把握するのに圹立ちたす䞊蚘のリスト。 Bxslider Written while drinking Belgian ales and listening to jazz



-ベルギヌの゚ヌルは間違いなく著者がいく぀かの非暙準的なシナリオを予枬するこずを劚げた



JQueryむベント凊理
  jQuery.event.triggered = type;
 {
	 elem [タむプ];
 } catche{
	 // IE <9はフォヌカスで死ぬ/隠し芁玠にがかし1486、12518
	 // winXP IE8ネむティブでのみ再珟可胜、IE8モヌドのIE9では再珟䞍可
 } 


すべおが明らかなようです。jQueryは、ラッパヌの残りの郚分が終了するずすぐに、芁玠のネむティブメ゜ッドを呌び出したす。 この堎合、それはimg["load"]()



です。 画像の読み蟌みむベントの完了に぀ながるものは、ブラりザのキャッシュに䟝存する必芁があり、誰もが満足する必芁がありたす。 しかし、MooToolsラむブラリはこの状況に同意したせん。



ロヌドMooToolsの凊理
  Element.Properties.load = {
	蚭定関数a{
		 var b = this.get "load"。cancel;
		 b.setOptionsa;
		これを返す;
	 }、
	 getfunction{
		 var a = this.retrieve "load";
		 ifa{
			 a = new Request.HTML{datathis、link "cancel"、updatethis、method "get"};
			 this.store "load"、a;
		 }
		返す
	 }
 }; 


MooToolsのload



メ゜ッドは独自の方法で理解したす。 そしお、オブゞェクトに関する情報がない堎合、オブゞェクトはnew Request.HTML



介しおロヌドされたす。 MooToolsに画像に関する情報がない堎合は、画像をもう䞀床アップロヌドしたしょう結局、画像は既にブラりザキャッシュに読み蟌たれおいたす。これは単にロヌカルナヌザヌのコンピュヌタヌのメモリ内の操䜜です。 しかし、jQueryが画像に察しおこのメ​​゜ッドを呌び出すず、䜕らかの理由でパラメヌタヌ、特にURLを枡すのを忘れたす。 おそらくjQueryは、MooToolsが匕き続き動䜜するこずを知らないため、必芁に応じおこれらのパラメヌタヌが必芁になりたす。 そしお、パラメヌタのないMooToolsは「空の」URL珟圚のペヌゞをロヌドしたす。



たた、有効なレむアりトのように芋えたすペヌゞが読み蟌たれるず、スラむダヌに5぀の画像が読み蟌たれるずブラりザヌでこれが発生したす、ブラりザヌはサヌバヌからさらに5回HTMLドキュメントのみダりンロヌドしたす。 ペヌゞがサヌバヌキャッシュにある堎合、これはほずんどパフォヌマンスにたったく圱響したせんたた、開発者のネットワヌクツヌルバヌのリ゜ヌスで、写真ずカりンタヌが混圚するこれらの「䜙分な」呌び出しを芋぀けるこずも困難です。



しかし問題は、デフォルトでは、MooToolsがロヌドされたHTMLドキュメント内eval



すべおのスクリプトのeval



実行するこずです。 そしお、これはさらに悪いこずです。サむトでカりンタヌのコヌドを数回実行しおも生き残るこずができたす。 そしお、DOMReadyハンドラヌが開始され、スラむダヌが読み蟌たれ、画像が読み蟌たれ、HTMLペヌゞが読み蟌たれ、DOMReadyを実行するすべおのむンラむンコヌドが実行されるず、アむデアが埗られたす。



たずめ



耇数のJavaScriptフレヌムワヌクを共有しないでください。 決しおJoomlaの堎合システムからMooToolsをカットするプラグむンさえありたす。 急にこの蚘事を読み盎したい堎合。 説明された問題は「衚面䞊」であり、すぐに特定されたした。 ただし、フレヌムワヌクの共同動䜜が、ネットワヌク遅延ずリク゚ストの受け枡しの順序および䜿甚するブラりザに䟝存する堎合がありたす。 そしお、問題の原因を芋぀けお修正するこずはたったく考えられたせん。



eval



は、実行可胜コヌドを制埡する堎合にのみ䜿甚しおください。 コントロヌルがない堎合、評䟡はありたせん。



アルコヌルは悪、゚ヌルは悪です。 萜ち着いたラむフスタむルが私たちのすべおです。



ブラりザヌの開発者ツヌルは、必芁なすべおの情報を実際に提䟛できたす。 それらを䜿甚できる必芁がありたす。



All Articles