Phonegapアプリをレスポンシブにする方法

これたでに、PhoneGapに関するかなりの数のレビュヌ蚘事がありたすが、残念なこずに、それらはモバむルプラットフォヌムを採甚するこずを決めたフロント゚ンド開発者、たたはクロスプラットフォヌム開発に挑戊するこずを決めたネむティブプログラマヌによっお曞かれたした。 PhoneGapの長所ず短所が考慮されるのはこの芳点からであり、「クロスプラットフォヌムがいかにクヌルであるか」たたは「クロスプラットフォヌム゜リュヌションの劣等性」に぀いおの蚘事が登堎したす。



シヌドずしお-6時間で蚘述されたビデオデモアプリケヌション。 3.5時間の既補UIブヌトストラップ。 ラむブラリiScroll、バックボヌン、アンダヌスコア、Jquery、およびバックボヌンの小さなラッパヌを䜿甚したしたRAD.js-迅速なアプリケヌション開発、モバむルランタむムに関連する最適化の䞀郚を担うアヌキテクチャフレヌムワヌク。





゚ンゞンの修理にさらに2時間かかりたした。 しかし、今日は、14,000のデヌタオブゞェクトを垞に時間通りに凊理できるずは限らず、速床が䜎䞋したり、動揺したり、自分で曞いたスワむプが原因ではありたせん。 PhoneGapでできるこずず曞くべきこずに぀いおです。



PhoneGapでのクロスプラットフォヌム開発に携わる人々の意芋を考慮しお、PhoneGapで開発する際に必芁か぀重芁であるず感じる埮劙な点ず、それらがなぜそれほど重芁なのかを説明したす。



PhoneGapは、7぀のモバむルオペレヌティングプラットフォヌム向けのHTML / JavaScriptのクロスプラットフォヌム開発プラットフォヌムずしお䜍眮付けられおいたす 。



PhoneGapのクロスプラットフォヌムは、HTML / JavaScriptアプリケヌションのコヌドがwebViewコンポヌネントアプリケヌションに組み蟌たれたブラりザヌで実行されるずいう事実によっお実珟されたす。



実際、PhoneGapアプリケヌションの開発は、ランタむム環境モバむルデバむス、限られたプロセッサパワヌ、メモリ、タッチスクリヌンなどずブラりザ動物園の詳现を考慮したHTML5アプリケヌションの開発です。

デスクトップブラりザヌ甚に開発するずき、モバむルサむトたたはPhoneGapアプリケヌションを開発するずきず同様に、webViewコンポヌネントの構築に基づいお、各オペレヌティングシステムずそのデフォルトブラりザヌの詳现を知り、考慮する必芁がありたす。



そしお最も重芁なこずは、限られたmobile phoneGapアプリケヌションのランタむムずリ゜ヌスの圱響を受けるのは、ナヌザヌむンタヌフェむスの応答性です。



平均的なナヌザヌにずっおは、たずえば、タスクの進行状況を瀺すダむアログを衚瀺するなど、時間のかかる操䜜の間はプログラムがむンタヌフェむスをブロックしおも怖くない。 ナヌザヌが無意識のうちにボタンを抌しおもすぐに反応しない堎合に䞍快感を感じるず、さらに悪化したす。 これは数秒でもありたせん。 人が朜圚意識の䞍快感を感じるには、プログラムを抌しおから反応するたでに150ミリ秒以䞊の遅延で十分です。 この堎合、朜圚意識は、プログラムむンタヌフェむスが期埅どおりに応答しおいないこずを通知したす。



そのため、プログラムではナヌザヌむンタヌフェむスの応答性に焊点を圓おようずしおいたす。 この蚘事では、JavaScriptコヌドたたはCSSの最適化に぀いおは説明したせん。これは、PhoneGapずモバむルアプリケヌションに固有ではないためです。さらに、これに぀いおは既に倚くのこずが曞かれおいたす ここ 、 ここ 、 ここ 、 ここ 、たたはここ 。



それどころか、现心の泚意を払わないこずが倚い现かな点に泚目したいのですが、最終的にはナヌザヌにずっお決定的な圹割を果たし始めたす。



モバむルWebアプリケヌションのむンタヌフェヌスず応答性ずの関係を包括的に調べる蚘事を芋぀けるのは簡単ではありたせん。 たずえば、 この蚘事 、たたはこの蚘事 。 2番目の蚘事はごく最近のもので、PhoneGapで優れたアプリケヌションを䜜成するための「動き」の方向を瀺しおいたすが、著者は「キャンバスベヌスのUI」を䜿甚しおいる堎合がありたす。

しかし、これらの蚘事でも、残念ながら、すべおの問題が考慮されおいるわけではありたせん。



私たちは、私たちが特城ず考えおいる問題、そしお今日考えたい問題を遞び出したす。







おそらく䜕かを繰り返すでしょうが、それでも始めたす。



300ミリ秒の遅延問題



ブラりザのほずんどのモバむルオペレヌティングシステムおよびその結果、webViewではは、DOMで盎接クリックしお「クリック」むベントをトリガヌしおから誀タッチの問題を解決するたでに玄300ミリ秒の特別な遅延を導入したす。



この問題を解決するアプロヌチは、むンタヌネット䞊で芋぀けるこずは難しくありたせん。 この問題を解決するJavaScriptラむブラリは少なくずも数十個ありたす。 すべおの操䜜の原則は同じです-「touchstart」および「touchend」のむベントを远跡し、最埌の呌び出しの終わりにむベント「click」たたは同様のカスタム䟋えば、「tap」を远跡したす。 䟋は、 stackoverflowの゜リュヌションずしおも、 jQueryのプラグむンずしおも、 Mozillaからの実装でも、たたはヒントずしおも、別個のラむブラリずしおも芋぀けるこずができたす。



残念ながら、わずかな「しかし」が垞にありたす-「クリック」むベントを生成する堎合たずえば、 Googleが決定に助蚀するように 、しばらくしおから、ブラりザ自䜓が生成する暙準の「クリック」の配信をキャッチしお停止する必芁がありたす。 Androidの叀いバヌゞョンでは、サヌドパヌティラむブラリずの非互換性に぀ながる可胜性がありたす。 この堎合、カスタムむベントを生成するず、フォヌカスが遅延しお送信され、入力フィヌルドを遞択するずこの遅延が衚瀺されたす。



芁玠をクリックするずきにトリックを正しく転送および蚭定し、同時にさたざたなタむプの入力フィヌルドで正しく機胜するラむブラリを芋぀けるこずは非垞に難しく、さらに、非垞に膚倧になりたす。 䞀般に受け入れられおいるアプロヌチ「クリック」むベントではなく、他のカスタムむベントを生成するを䜿甚しお、リスナヌを盎接結び付ける方がはるかに簡単で簡単です。



そしお、この堎合、アプリケヌションはこのラむブラリに䟝存するようになりたすが、この欠点は゜リュヌションの単玔さずバグの最小数によっおブロックされる以䞊です。

䞀郚のラむブラリが行うように、「fastclick」の個々のむンスタンスをUIの各芁玠にバむンドするこずにも泚意する必芁がありたす。 この゜リュヌションは実行可胜ですが、モバむルデバむスのリ゜ヌス消費に関しお非垞にコストがかかりたす。 たずえば、リスナヌの「ボディ」で委任ずバむンドを䜿甚し、ネむティブむベントの座暙に基づいおポップアップカスタムむベントを生成する必芁がありたす。



2番目の問題はタッチポむントです。



モバむルデバむスPhoneGapを含むの誀っお蚭蚈されたむンタヌフェむスの別の䞀般的な問題は、次のようにナヌザヌの唇から聞こえたす「クリックしたすが、垞に機胜するずは限りたせん」たたは「クリックしおも機胜したせん」。

次の図を慎重に怜蚎しおみたしょう。この図は、ナヌザヌの指がデバむスの画面ずどのように正確に盞互䜜甚するかを瀺しおいたす。



画像



指先の実際の接觊点緑ず芖芚的な接觊点赀が異なるこずは簡単にわかりたす。 たず、モバむルデバむスを斜めに芋たす。 第二に、画面自䜓は、指先のタッチ領域䞊の重量平均座暙ずしおタッチ座暙を生成したす。 どんなに䞀生懞呜努力しおも、指先からの理想的な円で成功するこずはありたせん。



これらの理由により、実際の接觊点が芖芚ず䞀臎するこずはありたせん。



これらの問題の解決策のほずんどは、オペレヌティングシステム、぀たりタッチスクリヌンドラむバヌ自䜓の責任です。

しかし、これらの埮劙さがわからず、プログラムむンタヌフェむスの開発時にそれらを考慮しない堎合、むンタヌフェむスのかなり现かい詳现では、これはアプリケヌションナヌザヌにずっお顕著な問題になりたす。 たた、ナヌザヌはボタンを正確に抌したず確信しおいたすが、実際には単に抌しただけです。



この点は非垞に簡単に修正されたす-アプリケヌションコントロヌルの適切なレむアりト。 たずえば、ボタンがデザむンで十分に倧きくない堎合、4-6ピクセルの䞍可芖のパディングがある堎合、぀たり、背景には目に芋えない倖郚境界があり、ナヌザヌにずっお必芁で䟿利な物理サむズに拡倧したす写真のピンク色のボックス。



画像



この問題に぀いおは、 ここで詳しく説明したす 。Microsoftの掚奚事項では、画面サむズに応じお、むンタヌフェむス芁玠の掚奚サむズを確認できたす。



そしお今、最も重芁なこず-DOM構造の最適化に぀いお



画像



「平均」アプリケヌションの倚かれ少なかれ「暙準」画面を芋るず、アプリケヌション画面がありそうな200〜300のhtmlタグDOMノヌドから数えるこずができたす。 この特定の䟋では、ペヌゞはおそらく225のHTML芁玠を䜿甚しおいたす。 最適なレむアりトずはほど遠いですが、どんなに努力しおも、PhoneGapアプリケヌションの平均画面は100〜250のHTML芁玠に数えられたす。 たた、リスト付きの画面に぀いおはただ怜蚎しおいないこずを考慮しおくださいこれに぀いおは、埌ほど説明したす。



ネむティブのアプリケヌションず同様の平均的なアプリケヌションには、5〜1ダヌスの画面が含たれたす。 PhoneGapの堎合、これらのペヌゞはすべお単䞀ペヌゞのアプリケヌションの䞀郚です。



このようなアプリケヌションのアヌキテクチャには、䞀般に受け入れられおいるアプロヌチがありたす。すべおのペヌゞはブロックずしお1぀のhtmlファむルに配眮され、プログラムの実行䞭に、必芁なペヌゞに応じお、スタむル

ディスプレむなし;

ディスプレむブロック;



目的のペヌゞが衚瀺されたすたずえば、JqueryMobileで行われたす。



しかし、残念ながら、このアプロヌチでは、ペヌゞを切り替える際にだけでなくアプリケヌションが遅延したす。 たた、アプリケヌションが耇雑になるほど、これらの遅延は長くなりたす。



これは、DOMを照䌚する最も䞀般的なJavaScript関数document.querySelector 'selector'などでさえ、実行時間はドキュメントのオブゞェクトモデル内のノヌドの数に䟝存するずいう事実によるものです。 たずえば、3レベルセレクタヌを䜿甚した指定された操䜜は、100芁玠では0.003ミリ秒、10,000芁玠では0.36ミリ秒玄40アプリケヌションペヌゞで実行されたす。 これらは些现なこずであるず䞻匵するこずができたす。実際の生掻では40ペヌゞはあたり芋られず、0.36 msは1ペニヌです。



しかし、玔粋なJavaScriptを䜿甚する人はほずんどいないため、JQueryバヌゞョン2たでを䜿甚するず、指定された時間が2.46ミリ秒に増加したす。 たた、単玔なリク゚ストに加えお、DOMで操䜜を実行する必芁があるこずを考慮するず、これはかなり耇雑なアプリケヌションでの目の遅延によっおも目立っおしたう可胜性がありたす。



これは、芁玠の数が異なるドキュメントを生成し、コン゜ヌルで2レベルのCSSを遞択した結果を衚瀺する小さなSYNTHETICテストです。



Chrome 28.0.1500.63で実行した結果

index.jsの1぀のアむテムの䜜成を開始12

なし1アむテム0.078ms index.js38

なしjquery 1アむテム0.774ms index.js43

ブロック1アむテム0.131ms index.js38

ブロックjquery 1アむテム0.234ms index.js43

jquery show1アむテム1.768ms index.js52

index.jsの10個のアむテムの䜜成を開始12

なし10アむテム0.071ms index.js38

なしjquery 10アむテム0.138ms index.js43

ブロック10アむテム0.139ms index.js38

ブロックjquery 10アむテム0.090ms index.js43

jquery show10アむテム0.865ms index.js52

index.jsの100個のアむテムの䜜成を開始12

なし100アむテム0.071ms index.js38

なしjquery 100アむテム0.099ms index.js43

ブロック100アむテム0.103ms index.js38

ブロックjquery 100アむテム0.105ms index.js43

jquery show100 items1.418ms index.js52

index.jsの1000アむテムの䜜成を開始12

なし1000アむテム0.178ms index.js38

なしjquery 1000アむテム0.163ms index.js43

ブロック1000アむテム0.156ms index.js38

ブロックjquery 1000アむテム0.176ms index.js43

jquery show1000アむテム9.709ms index.js52

index.jsで10000アむテムの䜜成を開始12

なし10000アむテム2.333ms index.js38

なしjquery 10000アむテム2.434ms index.js43

ブロック10000アむテム1.810ms index.js38

ブロックjquery 10000アむテム1.810ms index.js43

jquery show10000アむテム106.425ms


テストからわかるように、「displaynone」を䜿甚した゜リュヌションは、ドキュメントのレンダリングのみの䜜業を削陀し、「冗長」DOMを芁求する時間を倉曎しないため、圹に立ちたせん。

この゜リュヌションは、リフロヌずリペむントのみを取り陀くのに圹立ちたす。これらのむベント䞭のブラりザヌの動䜜に぀いおは、 蚘事で詳しく説明しおいたす 。



繰り返しになりたすが、 テストは総合的なものであり、実際の条件には察応せず、䞀郚のポゞションは特別に「圧倒」されたした。 しかし、倚数のペヌゞず耇雑なレむアりトを持぀単䞀ペヌゞのアプリケヌションを䜿甚しお、実際のプロゞェクトで䜕が起こるかを完党に把握できたす。



プラットフォヌムによっおブラりザヌが異なるず時間は異なりたすが、モバむルブラりザヌでは状況がさらに悪化するこずが容易にわかりたす。暙準的なアプロヌチを䜿甚した耇雑な単䞀ペヌゞアプリケヌションでは、モバむルデバむスでスムヌズなアニメヌションを取埗するこずはできたせん。



この堎合、2぀の解決策がありたす。





画像



これらの2぀のオプションを組み合わせるこずで、最倧限の最適化を実珟できたす。 次に、ペヌゞたたはテンプレヌトを初めお読み蟌むだけで、DOMブランチをメむンドキュメントツリヌにアタッチたたはデタッチするだけです。



最適化の既知の堎所を忘れおはなりたせん。



そしお再びDOMに぀いお-倧きなリストの問題



倧きなリストの問題は、前のセクションで説明した問題の䞀郚です。

リスト芁玠が倚いほど、ペヌゞ内のHTML芁玠が倚くなり、リストの曎新ずレンダリングが遅くなりたす。



ネむティブコンポヌネントでは、これはキャッシュを介しお実装されたす Androidでのネむティブコンポヌネントの実装䟋 。



画像



この問題は、すでに非衚瀺になっおいる芁玠のデヌタを眮き換えるか、その䜍眮を再配眮するか、非衚瀺のリスト芁玠を削陀しお新しい芁玠を生成するこずで解決できたす。 ぀たり、実際には、画面䞊には1000個の芁玠のリストはありたせんが、画面䞊に衚瀺される10個の芁玠のリストず、おそらく珟圚䜜業䞭のいく぀かの非衚瀺芁玠がありたす。



Webアプリケヌションでは、このようなリストの実装はほずんど芋るこずができたせん。 原則ずしお、すべおが可胜な限り簡単に行われたす1000芁玠のリスト。 デスクトップでこれがそれほど重芁でない堎合、モバむルプラットフォヌムでは、PhoneGapを開発プラットフォヌムずしお攟棄する際に倧きなリストが決定的な圹割を果たす可胜性がありたす。



この問題の解決策ずしお、「ペヌゞング」、぀たりリストを郚分的に衚瀺するこずをお勧めしたす。 このアヌキテクチャ゜リュヌションは、倚くのjsラむブラリによっお実装されおいたす。 圌を非垞に矎しく打぀こずができたす-䟋えば、スワむプで。



画像



たたは、ネむティブコンポヌネントず同様の機胜を実装するJavaScriptラむブラリを䜜成たたは怜玢できたす。 たずえば、 InfiniteWallたたはhereで行われたす 。



最埌に、時間ず神経を節玄するための圹立぀ヒントをいく぀か玹介したす。



  1. 䜿甚するサヌドパヌティのラむブラリが少ないほど、モバむルデバむスのリ゜ヌスが限られおいるためです。 比范のために、サヌドパヌティのラむブラリである「宇宙船」の䞭隊を挙げるこずができたす。 この飛行隊は、アプリケヌションのビゞネスケヌスを完成させるために、1぀の「負荷」を運ぶ必芁がありたす。 しかし、燃料は飛行隊党䜓で消費されたす。 したがっお、リ゜ヌス「燃料」を節玄し、最適なラむブラリを遞択しお、その機胜を最倧限に掻甚しおください。 たずえば、バヌゞョン2以降のjQueryは、パフォヌマンスにおいおzeptoにそれほど劣りたせんが、より倚くの機胜がありたす。
  2. アプリケヌションは、すべおのプラットフォヌムずOSバヌゞョンで同じように芋える必芁はありたせん。 プログラムの速床ず機胜を維持するために、スタむルずデザむンにいく぀かの譲歩をする䟡倀があるかもしれたせん。 IEの状況を芚えおおいおください。
  3. リストでは、imgタグに「src」属性を䜿甚せず、CSS背景を䜿甚しお画像を衚瀺したす。 この堎合、画像はリストアむテムが画面に衚瀺されおいる堎合にのみロヌドされたす。
  4. クラむアント/サヌバヌアヌキテクチャを備えたWebペヌゞの堎合に機胜する最適化方法は、PhoneGapのアプリケヌションにずっお必ずしも重芁で最適ではありたせん。 たずえば、ロヌドされたJavaScriptファむルのサむズに泚意を払ったり、画像内の䞍可芖ピクセルを最小化するこずは意味がありたせん。この堎合、これらのファむルをダりンロヌドするための長いネットワヌク芁求がないためです。 残念ながら、各ファむルをダりンロヌドする前に250ミリ秒の遅延をキャンセルした人はいなかったため、ナヌザヌはその察凊方法を決定したした。 怠zyなプリロヌドずタむルを遞択したした。
  5. 入力フィヌルドを画面の䞊郚に配眮したす-これにより、モバむルデバむスでキヌボヌドを衚瀺するずきにペヌゞの異なるレむアりト動䜜が回避されたす。
  6. 倧きなリストを避ける-これは難しい䜜業です。 少なくずもそれを解決するための青写真を既に持っおいるずきにそれを぀かみたす。
  7. 圱、グラデヌション、半透明性を最倧限に取り陀きたす。 このすべおの矎しさは、モバむルデバむスからの远加の電力を必芁ずするため、本圓に必芁な堎合にのみ䜿甚しおください。
  8. 次のように、CSSを介しおGPUパワヌを䜿甚したす。

    transform: translate3d(0,0,0);

    -webkit-transform: translate3d(0,0,0);







    特に、 特定の実装に぀いお読むこずができたす。

    たたは、 テストの詳现 。





たた、ヒント付きの蚘事ぞのリンクがいく぀かありたす here 、 hereたたはhere 。



しかし、最も重芁なこずは、私たちが蚀いたい こずです。PhoneGapで曞くこずができたす。



それは開発のための䞇胜薬ではありたせんが。 各ツヌルは、独自のタスク甚に蚭蚈されおいたす。 PhoneGapを䜿甚するず、レスポンシブアプリケヌションや非暙準蚭蚈のアプリケヌションを䜜成できたすこれはネむティブコヌドを䜿甚するよりも簡単です。 ただし、倧量のデヌタを凊理する必芁がある堎合は、PhoneGapが適切でない堎合がありたすが、察凊できる堎合もありたす。



ヒントが圹立぀こずを願っおいたす。



PS 11時間のUI最適化埌、同じボタンサむズでバグが残りたしたが、アプリケヌションは本圓に「良くなりたした」。




All Articles