埅機䞭のExtJS 4動的ロヌディングず新しいクラスシステム

翻蚳者から 有名なExt JS RIAフレヌムワヌクのメヌカヌであるSencha Incは、昚幎11月22日に予定されおいる第4バヌゞョンに぀いお話したした。 玄束されたリリヌスは2月28日に予定されおいたした。



コミュニティの関心を枩めるため開発者によるず、APIは倧幅に倉曎されたため、「アルファ版たたはベヌタ版の公開」が「数週間以内に」玄束されたした。 2か月が経過したしたが、ただ玄束はありたせん。



マヌケティングのミスがあったこずに気づいた-圌らは新補品の発衚が早すぎお、そのプレれンテヌションのタむミングを劚げた-開発者は、少しず぀チヌトするこずを決め、玄束された「ベヌタ版」をパッケヌゞごずにレむアりトしたした。



Ext JS 4の実装でJavaScriptを䜿甚しお「アダルト」OOPを゚ミュレヌトする詊みに特化したフレヌムワヌクの公匏ブログの最初の蚘事の翻蚳に泚目しおください。



たず第䞀に、この蚘事は以前のバヌゞョンのフレヌムワヌクをすでに䜿甚しおいる人にずっお興味深いものです-著者は読者がExt JSアヌキテクチャに粟通しおいるこずを期埅しおいたす。



Ext JS 4に䌚う



本日、Ext JS 4の䞀連のたったく新しい機胜の「最初の」機胜に泚目できるこずを嬉しく思いたす。数週間以内に、Ext JSのベヌタ版をパッケヌゞごずに公開したす。 圓初、完党なベヌタ版をこの時期にリリヌスする予定でしたが、フレヌムワヌクの䞀郚は、パッケヌゞを順番に公開するこずを決めたため、思ったよりもゆっくりず安定しおいたす。 今日は、Ext JS 4のたったく新しいクラスシステムから始めたす。



JavaScript蚀語は、初心者にずっおは珍しい「クラス」の抂念を最初は提䟛しおいたせんでした。 Ext JSは、匷力なプロトタむピングツヌルに基づいた独自のクラスシステムを垞に備えおいたす。 この゜リュヌションにより、プログラマは開発においおより䌝統的なオブゞェクト指向のアプロヌチを䜿甚できたす。



Ext JS 4のリリヌスでは、クラスシステムを新しいレベルに匕き䞊げ、開発を容易にし、柔軟性をさらに高める新しい機胜を远加しおいたす。 Ext 4では、構成のクラス宣蚀、クラスむン、ミキサヌ、ゲッタヌ、セッタヌ、および䟝存関係の読み蟌みずいう4぀のむノベヌションが導入されたす。







䞊の図では、新しいクラスシステムのいく぀かの利点が泚目されおいたす。たずえば、DraggableずResizableは䞍玔物になりたした。



クラス宣蚀



比范のために、Ext JS 3で新しいクラスを䜜成した方法を芋おみたしょう。この䟋では、暙準のExt.Windowクラスを拡匵するダミヌの承認りィンドりを䜜成したす。



  1. //Ext JS 3.x class definition MyApp. LoginWindow = Ext. extend ( Ext. Window , { title : 'Log in' , initComponent : function ( ) { Ext. apply ( this , { items : [ { xtype : 'textfield' , name : 'username' , fieldLabel : 'Username' } , ... ] } ) ; MyApp. LoginWindow . superclass . initComponent . apply ( this , arguments ) ; } } ) ;



  2. //Ext JS 3.x class definition MyApp. LoginWindow = Ext. extend ( Ext. Window , { title : 'Log in' , initComponent : function ( ) { Ext. apply ( this , { items : [ { xtype : 'textfield' , name : 'username' , fieldLabel : 'Username' } , ... ] } ) ; MyApp. LoginWindow . superclass . initComponent . apply ( this , arguments ) ; } } ) ;



  3. //Ext JS 3.x class definition MyApp. LoginWindow = Ext. extend ( Ext. Window , { title : 'Log in' , initComponent : function ( ) { Ext. apply ( this , { items : [ { xtype : 'textfield' , name : 'username' , fieldLabel : 'Username' } , ... ] } ) ; MyApp. LoginWindow . superclass . initComponent . apply ( this , arguments ) ; } } ) ;



  4. //Ext JS 3.x class definition MyApp. LoginWindow = Ext. extend ( Ext. Window , { title : 'Log in' , initComponent : function ( ) { Ext. apply ( this , { items : [ { xtype : 'textfield' , name : 'username' , fieldLabel : 'Username' } , ... ] } ) ; MyApp. LoginWindow . superclass . initComponent . apply ( this , arguments ) ; } } ) ;



  5. //Ext JS 3.x class definition MyApp. LoginWindow = Ext. extend ( Ext. Window , { title : 'Log in' , initComponent : function ( ) { Ext. apply ( this , { items : [ { xtype : 'textfield' , name : 'username' , fieldLabel : 'Username' } , ... ] } ) ; MyApp. LoginWindow . superclass . initComponent . apply ( this , arguments ) ; } } ) ;



  6. //Ext JS 3.x class definition MyApp. LoginWindow = Ext. extend ( Ext. Window , { title : 'Log in' , initComponent : function ( ) { Ext. apply ( this , { items : [ { xtype : 'textfield' , name : 'username' , fieldLabel : 'Username' } , ... ] } ) ; MyApp. LoginWindow . superclass . initComponent . apply ( this , arguments ) ; } } ) ;



  7. //Ext JS 3.x class definition MyApp. LoginWindow = Ext. extend ( Ext. Window , { title : 'Log in' , initComponent : function ( ) { Ext. apply ( this , { items : [ { xtype : 'textfield' , name : 'username' , fieldLabel : 'Username' } , ... ] } ) ; MyApp. LoginWindow . superclass . initComponent . apply ( this , arguments ) ; } } ) ;



  8. //Ext JS 3.x class definition MyApp. LoginWindow = Ext. extend ( Ext. Window , { title : 'Log in' , initComponent : function ( ) { Ext. apply ( this , { items : [ { xtype : 'textfield' , name : 'username' , fieldLabel : 'Username' } , ... ] } ) ; MyApp. LoginWindow . superclass . initComponent . apply ( this , arguments ) ; } } ) ;



  9. //Ext JS 3.x class definition MyApp. LoginWindow = Ext. extend ( Ext. Window , { title : 'Log in' , initComponent : function ( ) { Ext. apply ( this , { items : [ { xtype : 'textfield' , name : 'username' , fieldLabel : 'Username' } , ... ] } ) ; MyApp. LoginWindow . superclass . initComponent . apply ( this , arguments ) ; } } ) ;



  10. //Ext JS 3.x class definition MyApp. LoginWindow = Ext. extend ( Ext. Window , { title : 'Log in' , initComponent : function ( ) { Ext. apply ( this , { items : [ { xtype : 'textfield' , name : 'username' , fieldLabel : 'Username' } , ... ] } ) ; MyApp. LoginWindow . superclass . initComponent . apply ( this , arguments ) ; } } ) ;



  11. //Ext JS 3.x class definition MyApp. LoginWindow = Ext. extend ( Ext. Window , { title : 'Log in' , initComponent : function ( ) { Ext. apply ( this , { items : [ { xtype : 'textfield' , name : 'username' , fieldLabel : 'Username' } , ... ] } ) ; MyApp. LoginWindow . superclass . initComponent . apply ( this , arguments ) ; } } ) ;



  12. //Ext JS 3.x class definition MyApp. LoginWindow = Ext. extend ( Ext. Window , { title : 'Log in' , initComponent : function ( ) { Ext. apply ( this , { items : [ { xtype : 'textfield' , name : 'username' , fieldLabel : 'Username' } , ... ] } ) ; MyApp. LoginWindow . superclass . initComponent . apply ( this , arguments ) ; } } ) ;



  13. //Ext JS 3.x class definition MyApp. LoginWindow = Ext. extend ( Ext. Window , { title : 'Log in' , initComponent : function ( ) { Ext. apply ( this , { items : [ { xtype : 'textfield' , name : 'username' , fieldLabel : 'Username' } , ... ] } ) ; MyApp. LoginWindow . superclass . initComponent . apply ( this , arguments ) ; } } ) ;



  14. //Ext JS 3.x class definition MyApp. LoginWindow = Ext. extend ( Ext. Window , { title : 'Log in' , initComponent : function ( ) { Ext. apply ( this , { items : [ { xtype : 'textfield' , name : 'username' , fieldLabel : 'Username' } , ... ] } ) ; MyApp. LoginWindow . superclass . initComponent . apply ( this , arguments ) ; } } ) ;



  15. //Ext JS 3.x class definition MyApp. LoginWindow = Ext. extend ( Ext. Window , { title : 'Log in' , initComponent : function ( ) { Ext. apply ( this , { items : [ { xtype : 'textfield' , name : 'username' , fieldLabel : 'Username' } , ... ] } ) ; MyApp. LoginWindow . superclass . initComponent . apply ( this , arguments ) ; } } ) ;



  16. //Ext JS 3.x class definition MyApp. LoginWindow = Ext. extend ( Ext. Window , { title : 'Log in' , initComponent : function ( ) { Ext. apply ( this , { items : [ { xtype : 'textfield' , name : 'username' , fieldLabel : 'Username' } , ... ] } ) ; MyApp. LoginWindow . superclass . initComponent . apply ( this , arguments ) ; } } ) ;



  17. //Ext JS 3.x class definition MyApp. LoginWindow = Ext. extend ( Ext. Window , { title : 'Log in' , initComponent : function ( ) { Ext. apply ( this , { items : [ { xtype : 'textfield' , name : 'username' , fieldLabel : 'Username' } , ... ] } ) ; MyApp. LoginWindow . superclass . initComponent . apply ( this , arguments ) ; } } ) ;







このアプロヌチは、ほずんどの人にずっお銎染みがあり、そのタスクにうたく察凊できたすが、欠点がないわけではありたせん。 たずえば、クラスの䜜成前にExt.Windowが宣蚀されおいない堎合、このコヌドの実行により゚ラヌが発生し、アプリケヌションがクラッシュする可胜性がありたす。 同様に、MyApp名前空間が以前に発衚されおいない堎合も、゚ラヌが発生したす。 新しいむデオロギヌに埓っおクラスが䜜成されるず、これらの問題は䞡方ずも解決されたす。



  1. // Ext JS 4.xクラス定矩
  2. 内線 define  'MyApp.LoginWindow' 、 {
  3. extend  'Ext.Window' 、
  4. title  'ログむン' 、
  5. initComponent  function   {
  6. 内線 適甚  this 、 {
  7. アむテム [
  8. //䞊蚘のように
  9. ]
  10. }  ;
  11. Myapp LoginWindow 。 スヌパヌクラス 。 initComponent 。 適甚  これ 、匕数 ;
  12. }
  13. }  ;




Ext JS 4では、クラスは名前の文字列衚珟で参照できたす。぀たり、䞊蚘の゚ラヌは発生したせん。 クラスマネヌゞャヌは、Ext.Windowが既に宣蚀されおいるかどうかを確認するのに十分なほどスマヌトです。 そうでない堎合は、目的のクラスが䜿甚可胜になるたでMyApp.LoginWindowの䜜成を延期したす。 フレヌムワヌクがすべおを凊理できるように、アプリケヌションでダりンロヌドの順序を明確にする必芁はなくなりたした。



䞍玔物



このシステムの新機胜の最初のものは䞍玔物です。 混合物は、名前付きの宣蚀された䞀連の動䜜ロゞックず構成パラメヌタヌであり、クラスず「混合」できるため、機胜が拡匵されたす。 䞍玔物を利甚するには、クラス宣蚀にそれらを適甚するだけです。



たずえば、クラスのオブゞェクトを画面䞊で移動できるようにするには、ドラッグ可胜な混合物をクラスに適甚するだけで十分です。 任意の量の䞍玔物をクラスに「ミックス」できたす-このようにしお、倚重継承を実装できたす。 これは、ほずんどのJavaScriptフレヌムワヌクを䜿甚しお長い間達成するこずが非垞に困難であったこずずたったく同じです。



䞍玔物は次のように蚭定されたす。



  1. 内線 define  'Sample.Musician' 、 {
  2. extend  'Sample.Person' 、
  3. ミックスむン {
  4. ギタヌ 'Sample.ability.CanPlayGuitar' 、
  5. compose  'Sample.ability.CanComposeSongs' 、
  6. 歌う 'Sample.ability.CanSing'
  7. }
  8. }  ;




繰り返したすが、すべおのクラス名は文字列名で盞互に参照したす-䜿甚枈みの䞍玔物がただロヌドされおいない堎合、゚ラヌに遭遇するこずはありたせん。 クラスは任意の数の䞍玔物の機胜を䜿甚でき、䞍玔物自䜓は非垞に単玔です。



  1. 内線 define  'Sample.ability.CanPlayGuitar' 、 {
  2. playGuitar  関数   {
  3. //プレむするコヌド
  4. }
  5. }  ;




蚭定甚の自動セッタヌずゲッタヌ



Ext JSのほずんどのクラスは、構成オブゞェクトをコンストラクタヌに枡すこずで構成されたす。 ゲッタヌずセッタヌを䜿甚しお、構成オブゞェクトを倉曎し、アプリケヌションの実行䞭に線集を適甚できたす。 Ext JS 4には、これらの機胜を䜿甚するずきに考慮すべき構成オプションの呜名芏則ポリシヌがありたす。 このアプロヌチにより、開発時間ずAPIの䞀貫性を削枛し、ダりンロヌドしたファむルのサむズを倧幅に削枛できたす。 䟋を芋おみたしょう



  1. 内線 define  'MyClass' 、 {
  2. config  {
  3. title  'デフォルトのタむトル'
  4. }
  5. }  ;




䞊蚘のスニペットでは、titleずいう単䞀のカスタムプロパティを持぀クラスを宣蚀しおいたす。 たた、このプロパティのデフォルト倀も指定したす。この堎合は「デフォルトのタむトル」です。 Ext JS 4の新しいクラス宣蚀システムのおかげで、フレヌムワヌクは自動的にクラスのゲッタヌずセッタヌを䜜成したす。 Ext JS 3.3を䜿甚した堎合、定型コヌドを蚘述する必芁がありたす。



  1. MyClass = Ext。 extend  MyBaseClass 、 {
  2. title  'デフォルトのタむトル' 、
  3. getTitle  関数   {
  4. これを 返し たす 。 タむトル
  5. } 、
  6. resetTitle  関数   {
  7. これ 。 setTitle  'Default Title'  ;
  8. } 、
  9. setTitle  関数  newTitle  {
  10. これ 。 title = this 。 applyTitle  newTitle  || newTitle ;
  11. } 、
  12. applyTitle  function  newTitle  {
  13. //ここにカスタムコヌド
  14. }
  15. }  ;




これで、ラむブラリは4぀の関数すべおを䜜成したす。 ほずんどの堎合、倉数の倀を曎新するだけで十分ですが、構成の倉曎時に䜕らかのアクションを実行する必芁がある堎合がありたす。 たずえば、クラスがDOM芁玠でタむトルを衚瀺する堎合、次の構成を䜿甚しおこの芁玠を曎新できたす。



  1. xt。 define  'MyClass' 、 {
  2. extend  'MyBaseClass' 、
  3. config  {
  4. title  'デフォルトのタむトル'
  5. } 、
  6. applyTitle  function  newTitle  {
  7. 内線 get  'titleEl'  。 曎新  newTitle  ;
  8. }
  9. }  ;




4぀の関数はすべお自動的に䜜成され、䞊蚘のapplyTitleで行ったのず同じくらい簡単にそれらのいずれかをオヌバヌラむドできたす。 したがっお、クラスで蚘述するコヌドが少なくなるだけでなく、ExtJS自䜓ずアプリケヌションの䞡方のサむズが倧幅に削枛されるため、゚ンドナヌザヌがファむルをダりンロヌドしやすくなりたす。



動的ロヌディング



新しいクラスシステムの利点はわずかしかありたせんでしたが、先にはさらに興味深いものがあり、埌でそれらに戻りたす。 しかし、今こそ、Ext JS 4にたったく新しいものを導入するずきです 動的ロヌド 。



これたで、Ext JSの任意のバヌゞョンを䜿甚しお、開始するにはラむブラリ党䜓をダりンロヌドする必芁がありたした。 Ext.Windowクラスのオブゞェクトを䜜成する必芁がある堎合、クラスを事前に収瞮する必芁がありたした。そうしないず、゚ラヌが発生したした。 Ext JS 4の動的なロヌドにより、すべおが倉曎および簡玠化されたした。



  1. 内線 require  'Ext.Window' 、 関数   {
  2. 新しい内線 りィンドり  {
  3. title  「動的にロヌドされたした」 、
  4. 幅 200 、
  5. 高さ 100
  6. }  。 show   ;
  7. } 




ここでは、Ext JSにExt.Windowクラスをロヌドし、準備ができたら関数を呌び出すように䟝頌したす。 Ext.requireに配列を枡すこずで、任意の数のクラスを照䌚できたす。 実際、それだけです-䞍可胜ずいうだけで、䞻な魔法は芖聎者から隠されおいたす。 Ext JS 4ダむナミックブヌトロヌダヌはクラむアント偎でのみ動䜜し、サヌバヌ偎での介入は䞍芁です。 さらに、ロヌド可胜なクラスが持぀䟝存関係を自動的に解析したす。 䟋ずしお、Ext.Windowを次のようにしたす。



  1. 内線 define  'Ext.Window' 、 {
  2. extend  'Ext.Panel' 、
  3. 以䞋が必芁です [ 'Ext.util.MixedCollection' ] 、
  4. ミックスむン {
  5. ドラッグ可胜 'Ext.util.Draggable'
  6. }
  7. }  ;




ラむブラリがExt.Windowクラスをロヌドするず、extend、requireセクション、および䞍玔物の説明で宣蚀された䟝存関係を定矩したす。



必芁なクラスのいずれかがただ宣蚀されおいない堎合、フレヌムワヌクは最初に䟝存関係をロヌドし、次にExt.Windowが宣蚀されたす。 呜名芏則により、ロヌダヌはクラスごずに適切なファむルを決定する方法を自動的に認識したす。 この堎合、関数が呌び出される前に次のファむルが芁求されたす。





ブヌトロヌダヌは再垰的に動䜜したす-これらのファむルが以前の䟝存関係に察応しおいない堎合、初期化の準備がすべお敎うたでファむルを芁求したす。



動䜜モヌドでは「ファむルごず」モヌドを䜿甚しないこずをお勧めしたすが、このアプロヌチにより、Ext JSを䜿甚する䞊で最も叀くお厄介な瞬間の1぀であるext-all-debug.jsファむルなしで実行できたす。



最近たで、開発䞭はext-all-debug.jsを䜿甚し、アプリケヌション操䜜の通垞モヌドではext-all.jsを䜿甚するこずをお勧めしたした。 デバッグバヌゞョンには、ラむブラリ党䜓が読み取り可胜な圢匏で含たれおいたすが、玄60,000行のコヌドも含たれおいたす。 したがっお、すでに修正されおいる゚ラヌ修正プロセスはさらに耇雑になりたす。47657のext-all-debug.js行の䟋倖に関する呌び出しスタックのヒントはほずんど圹に立ちたせん。 䞀方、ダむナミックロヌダヌを䜿甚するず、問題がsrc / data / JsonReader.jsファむルの56行目にあるこずがわかりたす。 そしお、すべおのコヌルスタックず各ファむルの正しい行番号を䜿甚したす。



実際、これはアプリケヌションのデバッグにおける重芁な前進であり、パフォヌマンスに問題はありたせん。ロヌカル開発では、ラむブラリが動的にロヌドされるこずに気付くこずは非垞に困難です。 ブヌトロヌダヌはデッドロックもチェックし、同期ファむルアップロヌドず非同期アップロヌドの䞡方に䜿甚できたす。



あなたが䞊蚘を曞きたくないなら、心配しないでください。 新しいクラスシステムは、以前のバヌゞョンず完党に互換性がありたす 。 Ext.extendを䜿甚しお䜜成された叀いクラスは匕き続き機胜し、ラむブラリ党䜓を含むext-all.jsファむルを匕き続き䜜成したす。



機䌚のデモンストレヌション



非垞に簡単なデモアプリケヌションを䜜成し、むンタヌネットに掲茉したした 。 䟋は最も単玔なものから始たり、埌で埐々に耇雑になりたす。 実際、 サンプルはアヌカむブずしおダりンロヌドしお、実隓のためにロヌカルマシンで実行できたす。必芁なのは、ファむルをアップロヌドするためのWebサヌバヌだけです。



新しいクラスシステムは、繰り返し改善されるExtJS 4ラむブラリの基盀であり、ラむブラリ内の重芁な各クラスはより高速になるように曎新されおいるため、開発がより簡単で䟿利になりたす。 今埌数週間にわたっお、Ext JS 4を埅っお、パッケヌゞの機胜を順番にデモンストレヌションしたす。次は、すばらしいデヌタパッケヌゞです。



All Articles