ActionWeb。 非同期むンタヌネット。

2005幎2月18日のJesse James Garrettの蚘事「Webアプリケヌション開発ぞの新しいアプロヌチ」でAJAXが最初に蚀及されおから4幎が経過したした。 この間、おそらくすべおのWeb開発者がこのテクノロゞヌを少なくずも1回は詊したこずがあり、通垞のむンタヌネットナヌザヌは、動的なフォヌム怜蚌、怜玢バヌでのク゚リの自動補完、ポップアップコンテキストメニュヌ、その他の最近の突発的なWeb資金によるむンタラクティブな喜び、および最新のJavaScriptフレヌムワヌクに驚かされなくなりたしたこのようなスクリプトの開発は、プログラマヌにずっお桁違いに速く、効率的で、快適です。 しかし、なぜこれたでのずころ、開発䞭のWebサむトの倧郚分が、コンテンツをダりンロヌドするための暙準モデルに準拠しおおり、AJAXプラットフォヌムに完党に切り替えおいないのでしょうか コンテンツブロック、JavaScriptファむル、CSS、およびほずんどのHTMLマヌクアップのみを曎新する必芁がある堎合、内郚リンクをクリックするたびにペヌゞ党䜓をリロヌドするのはなぜですか





いく぀かの理由がありたす。



-AJAXブラりザヌでリ゜ヌスを開くたびに、ナヌザヌは「開始点」から䜜業を開始したす。 ほずんどの堎合、そのようなアプリケヌションの状態はブラりザのアドレスバヌに衚瀺されたせん

-動的にロヌドされたコンテンツは怜玢ロボットによっお凊理されたせん

-非同期Webアプリケヌションの開発は、静的モデルを䜿甚するよりもはるかに耇雑で時間がかかりたす

-AJAXアプリケヌションず暙準ブラりザツヌルの統合の欠劂。 ブラりザのボタンを䜿甚しおこのようなリ゜ヌスをナビゲヌトしたり、動的にロヌドされたサむトペヌゞをブックマヌクしたり、新しいブラりザタブで動的コンテンツぞのリンクを開いたりするこずはできたせん

-「シック」クラむアントを䜿甚するず、ナヌザヌのコンピュヌタヌのプロセッサの負荷ず必芁なRAMが倧幅に増加したす。

-ナヌザヌのブラりザでJavaScriptが無効になっおいる堎合、AJAXアプリケヌションは倱敗したす



䞊蚘の問題を克服するには、たったく新しいコンセプトが必芁になりたす。これをActionWebず呌びたす 。 基本的に、ActionWeb圓時のAJAXなどは新しいテクノロゞヌを提䟛せず、既知のテクノロゞヌの䜿甚原理を倉曎するだけです。 抂念の䞻な論文を提出したす。



1.同じデヌタが特別な必芁なしに耇数回ロヌドされるこずはありたせん。ペヌゞ党䜓のリロヌドは䟋倖的な堎合にのみ発生したす

2.ナヌザヌず怜玢゚ンゞンの芳点から芋たActionWebアプリケヌションは、通垞のWebサむトず倉わりたせん

3.アプリケヌションのクラむアント郚分のプレれンテヌション局ずビゞネスロゞック局の分離

4.ビゞネスロゞック局はプレれンテヌション局から芋えたせん。開発者はプレれンテヌションコンポヌネントのみをプロゞェクトからプロゞェクトに倉曎したす



䞊蚘で定矩したAJAXアプリケヌションの問題ず、 nikitaeremin.com Webサむトを䜜成するずきに実装される、ActionWebコンセプトの䜿甚を考慮に入れた、それらを解決するメカニズムを考えおみたしょう。



問題ナヌザヌが「開始点」から䜜業を開始するたびに、AJAXリ゜ヌスの珟圚の状態がブラりザヌのアドレスバヌに衚瀺されたせん。

解決策ブラりザヌのアドレスバヌのURLを倉曎するず、ペヌゞがリロヌドされたす。 この芏則には1぀だけ䟋倖がありたす。再起動せずに、アドレスバヌlocation.hashのハッシュを倉曎できたす。぀たり、蚘号ずその埌ろにあるすべおの蚘号を削陀したす。 アドレスバヌにはnikitaeremin.com/#projects/persik/のようなものがあり、ActionWebアプリケヌションは初期化時にハッシュを抜出し、それに応じお状態を圢成したす。



問題動的にロヌドされたコンテンツが怜玢゚ンゞンで凊理されない

解決策 Webリ゜ヌスを参照するずき、怜玢ボットはJavaScriptを受け入れたせん。 ペヌゞの゜ヌスHTMLコヌドをスキャンするず、内郚リンクに移動し、それらのアドレスnikitaeremin.com/#projects/persik/はメむンペヌゞぞの移行を意味したす。 解決策は、リンクを゜ヌスコヌドにそのたた残し、内郚リンクず倖郚リンクに分割するこずです。 たずえば、リンクにcssクラスを远加するこずで分割できたす。 ActionWebアプリケヌションが初期化されるず、むベントハンドラヌが指定されたクラスのリンクにアタッチされたす。これにより、コンテンツが動的に読み蟌たれ、ブラりザヌのアドレスバヌのハッシュが倉曎されたす。 しかし、ナヌザヌが ActionWebアプリケヌションの゜ヌスコヌドでむンデックス化された怜玢リンクnikitaeremin.com/projects/persik/をクリックするずどうなりたすか nikitaeremin.com/#projects/persik/ぞのリダむレクトが察応するペヌゞに配眮され、メむンペヌゞぞの遷移が発生し、アプリケヌションはアドレスバヌのハッシュに基づいおその状態を圢成したす。



問題 AJAXアプリケヌションず暙準ブラりザツヌルの統合の欠劂

解決策アドレスバヌを倉曎する䞊蚘の手法を䜿甚するず、ブックマヌクに远加する問題は自動的に解決されたす。 新しいブラりザタブでアプリケヌションの内郚AJAXリンクを開くこずができないずいう問題も解決されたす。 ActionWebアプリケヌションで、内郚リンクを右クリックし、ナヌザヌが通垞のリンクをクリックするず、ブラりザヌは静的なサむトで操䜜するのず同じように動䜜したす。 ブラりザヌ機胜を前埌に埩元するには、2぀の方法がありたす。 最初の方法は、これらの目的のためだけに蚘述されたjQueryの履歎プラグむンを䜿甚するこずですが、このスクリプトはブラりザ間の互換性がなく、䞻にInternet Explorerで正しく動䜜したせん。 2番目の方法は、アドレスバヌぞのすべおの倉曎をJavaScript配列に保存し、簡単な操䜜を䜿甚しお、アプリケヌションペヌゞに盎接戻るボタンず進むボタンを実装するこずです。



問題 AJAXアプリケヌションの開発は、静的モデルを䜿甚するよりも桁違いに耇雑です

解決策アプリケヌションのクラむアント郚分のプレれンテヌション局ずロゞック局の分離。 このアプロヌチでは、プレれンテヌションコンポヌネントのみがプロゞェクトごずに倉化し、サヌバヌずの察話、情報の受信および凊理のすべおの機胜ぱンゞン内で「保護」され、十分なレベルの抜象化を提䟛し、開発者はそれらに぀いお考える必芁はありたせん。 ロヌドされたコンテンツペヌゞのキャッシュ、内郚リ゜ヌスリンクのクラス名など、アプリケヌションのビゞネスモデルに関連するいく぀かの機胜 初期化䞭に゚ンゞンに枡されるJSONオブゞェクトで構成できたす。



ロゞック局ずプレれンテヌション局の分離



問題 RIAを䜿甚するず、クラむアントコンピュヌタヌのプロセッサの負荷が倧幅に増加する

解決策 JavaScriptを䜿甚する堎合、プロセッサの負荷は䞻にプレれンテヌションレむダヌの飜和によるものです。特に、耇数のアニメヌション機胜が盞互に同時に、たたは非ロゞックのレむダヌの機胜で同時に実行される堎合、負荷が過剰な堎合、ブラりザヌは単玔に「ハング」したす。 出力は、アプリケヌションの重芁なセクションでのチェヌン関数呌び出しの実装です。 チェヌンコヌルずは、耇数の機胜を同時に実行できないようにしお、ナヌザヌのコンピュヌタヌに過剰な負荷がかかるのを防ぐこずです。 ただし、このメカニズムをJavaScriptに実装するには、単に関数呌び出しを1぀䞋に眮くだけでは十分ではありたせん。このような順次呌び出しリストに少なくずも1぀のアニメヌション関数がある堎合は機胜したせん。 JavaScriptむンタヌプリタヌが時間遅延操䜜぀たり、タむムアりトに遭遇した堎合、JavaScriptむンタヌプリタヌはその完了を埅぀こずを止めず、コヌドをさらに進めたす。 jQueryで蚘述された簡単な䟋を次に瀺したす。 アニメヌション関数ずロゞック関数があり、アニメヌション関数が䜜業を完了した埌にのみロゞック関数を実行する必芁があるずしたす。



関数アニメヌション{ 	
     $ "elem"。animate{"width" "300px"}、200、 "linear"、function{ 
        アラヌト「アニメヌションを最初に」; 
     } 
 }  

関数ロゞック{ 
    アラヌト「ロゞックファヌスト」; 
 }  

アニメヌション; 
ロゞック;




䞊蚘のコヌドを実行するず、最初のアラヌトは「ロゞックが最初に」になりたす。 アニメヌションの完了が遅れたす。 そしお、目暙を達成するには、コヌドを次のように曞き換える必芁がありたす。



関数アニメヌション{ 	
     $ "elem"。animate{"width" "300px"}、200、 "linear"、function{ 
        アラヌト「アニメヌションを最初に」;  
        ロゞック;     	
     } 
 } 

関数ロゞック{ 	
    アラヌト「ロゞックファヌスト」; 
 }  

アニメヌション;




しかし、このアプロヌチでは、ActionWebコンセプトの4番目の論文は満たされたせん。 Persik゚ンゞンでビゞネスロゞック関数の匿名呌び出しを実装するには、ビゞネスモデルのコンポヌネントずプレれンテヌションレむダヌを接続するチェヌンメ゜ッドを蚘述する必芁がありたした。 ビゞネスロゞックレむダヌでのチェヌンメ゜ッドの䜿甚は次のずおりです。



 engine.chainfunc1、[vars1]。chainfunc2、[vars2]。chainfunc3、[vars3]。start;




さらに、チェヌンの各機胜では、出口点を明瀺的に定矩する必芁がありたす。



関数アニメヌション{ 	
     $ "elem"。animate{"width" "300px"}、200、 "linear"、function{ 		
        アラヌト「アニメヌションを最初に」;         		
         animation.next;     	
     } 
 }

関数ロゞック{ 	
    アラヌト「ロゞックファヌスト」; 	
     logic.next;
 } 

 persik.chainアニメヌション.chainロゞック.start;




この䟋からわかるように、チェヌン関数は、どこから呌び出されたのか、制埡を転送する関数を知りたせん。 このアプロヌチには2぀の䞻な利点がありたす。

1.開発者は、前のチェヌン関数が完了した埌にのみチェヌン関数の実行が開始されるず確信しおいたす。 同時に、圌は関数の実行の䞀貫性を決定し、アニメヌション関数のどこにでも次の呌び出しを配眮できたす。

2.匿名関数呌び出しの原則が実装され、プレれンテヌションモデルからビゞネスモデルを最倧限に分離したす。



問題 JavaScriptがナヌザヌのブラりザヌで無効になっおいる堎合、AJAXアプリケヌションは倱敗したす

解決策本質的に、ActionWebリ゜ヌスずは䜕ですか これは、非同期デヌタ読み蟌みメ゜ッドを䜿甚するむンタラクティブなWebアプリケヌションであり、その状態はほずんどの堎合、URLによっお䞀意に決定されたす。 JavaScriptをオフにするず䜕が倉わりたすか アプリケヌションの状態はクラむアント偎で圢成されず、デヌタを非同期的にダりンロヌドする機胜が利甚できなくなり、アニメヌション機胜は実行されたせん。 この堎合、サヌバヌ偎でアプリケヌション状態を䜜成し、アニメヌション関数からオブゞェクトの最終状態オヌプン/クロヌズを抜出し、それらを個別のクラスで遞択し、クラスを䜿甚しおDOMオブゞェクトの状態を圢成できたす最も単玔な䟋は珟圚のメニュヌ項目を匷調衚瀺したす、コンテンツの非同期読み蟌み埓来のものに眮き換えられ、その結果、アヌキテクチャの芳点から最も䞀般的なWebリ゜ヌスを取埗したす。 サヌバヌでは、ナヌザヌのブラりザヌでjsが有効になっおいるかどうかを刀断する必芁があり、この問題に基づいお、サむトのActionWebバヌゞョンたたは通垞の静的バヌゞョンのいずれかを決定したす。 もちろん、このアプロヌチの実装はすべおのAJAXアプリケヌションで可胜ずいうわけではなく、静的バヌゞョンではコンテンツをロヌドおよび衚瀺するための機胜のみが䜿甚可胜になりたすが、最終的に開発者は、ナヌザヌのブラりザヌの蚭定に関係なく、ナヌザヌが最小限のWebサむト機胜を確実に受け取るこずを保蚌したす。



jsがオフの堎合の私のサむトの動䜜



その結果、䜜成されたリ゜ヌスは怜玢ロボットによっお認識され、ナヌザヌのブラりザヌでJavaScriptがオフになっおも機胜が倱われるこずはありたせん。AJAXにより高速に動䜜し、JavaScriptアニメヌションを䜿甚するこずでプレれンテヌションの魅力が高くなりたす。



All Articles