3

ロード時間が非常に重要なFlexアプリケーションがあります(コンシューマーサイト)。画面に何かを表示して、必要に応じて追加のモジュールをロードできるようにしたい。

私が直面している問題は、すべてのモジュールの合計が、すべてのコンポーネントを単一の.swfファイルに含める場合よりもはるかに大きいことです。

その理由はかなり明白です。たとえば、Webサービスへのアクセスに必要なクラスは約100kbかかるようです。main.swfでこれらのクラスを使用しない場合、それらを使用するすべてのモジュールに含まれます。したがって、5つのモジュールがある場合、余分な500kBが無駄になります。

理論的には3つのレベルが欲しい

main.swf-可能な最小のレイアウト/スタイル/フォント/フレームワークタイプのものcommon.swf-モジュール1+モジュール2(Webサービスなど)に必要な追加クラスmodule1.swf-サイト内のモジュール1module2.swf-サイト内のモジュール2

これが可能かどうかはわかりません。

フレームワーク全体ではなく、フレームワークの一部にswz/swfファイルをロードできるかどうか疑問に思っています。

メインのアプリのサイズを200Kbに下げる必要があります。Webサービスと基本的なデータグリッド機能を追加すると、450kbになります。

学んだ教訓をいただければ幸いです。

4

4 に答える 4

3

これは少し前のことだと思いますが、誰かがまだこれに関する回答を探している場合に備えて、別の回答を投稿すると思いました.

私は Flex アプリの最適化を検討しており、いくつかチェックした後、モジュールを使用することにしました。主な理由は、最適化のための優れたオプションがあるからです。

必要な 2 つの mxmlc コマンドは次のとおりです。

mxmlc -link-report=MyAppReport.xml MyApp.mxml

mxmlc -load-externs=MyAppReport.xml MyModule.mxml

私の外部 SWF (Flex Framework を使用) は現在 21k しかありません。(まだ) 多くのことを行っていますが、ますます多くのことを行っていても、メインのアプリ コードからのリソースを引き続き使用します。

プロセスを高速化するために作成したバッチ ファイルを次に示します (このように機能させるには、mxmlc を環境パス変数に入れる必要があります。[コントロール パネル] -> [システム] -> [詳細設定] -> [環境変数]、[パス システム変数] を編集し、追加します)。 mxmlc へのパス (再起動が必要):

cd C:\Projects\MyProject\Develop\Modules
mxmlc -link-report=MyAppReport.xml C:\Projects\MyProject\Develop\Source\Main.mxml
mxmlc -load-externs=MyAppReport.xml MyModule.mxml
move /Y MyModule.swf ..\Runtime\Modules

詳細はこちら: http://livedocs.adobe.com/flex/3/html/help.html?content=modular_4.html

それが役立つことを願っています!

于 2009-03-24T02:29:29.493 に答える
1

ファイルサイズに関しては、Flex は少しばかりです。アプリのサイズを小さくする唯一の方法は、フレームワークに外部 swz を使用することです。Flash Player キャッシュを使用した Flex アプリケーションのパフォーマンスの改善に関するAdob​​e Devnet の記事があります。この記事を読むことをお勧めします。

私が取り組んだプロジェクトでは、プリロード モジュールが不要なクラスを吸い込んでしまうという問題がありました。私たちがしなければならなかったのは、他のモジュールに存在するクラスへのインターフェースを作成し、それらをそのように参照することでした。モジュールが読み込まれると、初期化コードを呼び出すために IApplicationModule への参照を割り当てるだけです。

クラスを別の SWF ファイルに入れることも検討し、ApplicationDomain を使用してクラスにアクセスします。

(このコードは、Flex でモジュールからロードされたクラスにアクセスする方法を説明するこのフォーラムの投稿から取得したものです)


private function loadContent(path:String):void 
{
   var contentLoader:Loader = new Loader();
   contentLoader.contentLoaderInfo.addEventListener(
      Event.COMPLETE,
      loadContent_onComplete);
   contentLoader.load(new URLRequest(path));
}


private function loadContent_onComplete (event:Event):void
{  
   var content:DisplayObject = event.target.content;

   if(content is IFlexModuleFactory) 
   {
      var content_onReady:Function = function (event:Event):void 
      {   
         var factory:IFlexModuleFactory = content as IFlexModuleFactory;
         var info:Object = factory.info();
         var instanceClass:Class = info.currentDomain.getDefinition(
            info.mainClassName) as Class;

         addChild (new instanceClass ());
      }

      content.addEventListener ("ready", content_onReady);

   } 
   else
   {
      addChild (content);  
   }
}
于 2008-10-11T20:43:58.503 に答える
1

コマンドライン コンパイラには、既に別の swf にコンパイルされているクラス定義を除外するオプションがあります。それはこのように動作します:

  1. メイン アプリケーション (ローダーを含む) をコンパイルし、レポートの生成を選択します。
  2. モジュールをコンパイルし、上記のレポートでクラスを除外することを選択します。
于 2008-12-30T00:04:31.647 に答える
0

ModuleLoaderクラスを調べることができます。おそらく、最初の200kbsでコアのものをロードし、必要に応じて残りをロードすることができます。

また、使用するSWCはコンパイル時に埋め込まれますが、SWFは実行時にロードされることにも注意してください。

于 2008-10-09T16:35:39.483 に答える