2008-10-08 57 views
3

我有一個Flex應用程序,其中加載時間非常重要(用戶站點)。我希望能夠在屏幕上顯示某些內容,然後根據需要添加其他模塊。使用多個模塊時優化Flex

我面臨的問題是,所有模塊的總和比我將所有組件包含在一個.swf文件中的總和要大得多。

它很明顯,爲什麼。例如,Web服務訪問所需的類似乎需要大約100kb。如果我不在main.swf中使用這些類,那麼它們將被包含在每個使用它們的模塊中。所以,如果我有5個模塊,那就浪費了額外的500kB。

在理論上欲3個水平

的main.swf - 最小可能佈局/風格/字體/框架類型的東西 common.swf - 由模塊需要額外的類1 +模塊2(諸如web服務) module1.swf - 現場模塊1 module2.swf - 現場模塊2

我不知道這是否可能。

我想知道如果我可以爲部分框架加載swz/swf文件而不是整個框架。

我真的需要讓我的主應用程序大小降至200Kb。當我添加Web服務和基本數據網格功能時,它增長到450kb。

任何經驗教訓將不勝感激。

回答

0

你可以看看ModuleLoader這個類,也許你可以在第一個200kbs的時候加載你的核心內容,然後在需要的時候加載其餘的內容。

另外值得注意的是,您使用的任何SWC都是在編譯時嵌入的,而任何SWF都是在運行時加載的。

1

當涉及到文件大小時,Flex是一個小豬。實際上只有一種方法可以減小應用程序的大小,也就是使用外部swz作爲框架。有一個關於Improving Flex application performance using the Flash Player cache的Adobe Devnet文章,我建議您閱讀它。

在我工作的項目上,我們的預加載模塊吸入了我們不想要的類的問題。我們需要做的是創建接口到駐留在其他模塊中的類並引用它們。當模塊被加載時,我們只需分配一個對IApplicationModule的引用來調用我們的初始化代碼。

還應考慮把你的類放入一個單獨的SWF文件,然後使用ApplicationDomain中獲得訪問類

(此代碼this forum post採取這也解釋瞭如何訪問的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); 
    } 
} 
1

命令行編譯器有一個選項可以排除已經編譯到另一個swf中的類定義。它的工作原理是這樣的:

  1. 編譯主應用程序(其中包含一個加載程序)並選擇生成報告。
  2. 編譯模塊並選擇排除上述報告中的類。
3

我知道這是一段時間以前,但我想我會張貼另一個反應,以防止任何人仍然在尋找答案。

我一直在尋找優化Flex應用程序,經過一些檢查後,決定使用模塊。主要是因爲他們有這樣的優化選擇。

的mxmlc的命令,你需要兩個分別是:

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

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

我的外部SWF(使用Flex框架)現在只有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

希望幫助!

+0

如果你在的Flex/Flash Builder中這樣做,MyAppReport.xml應放置在模塊項目文件夾即在根與Module.mxml相同的文件夾。很好的答案btw – Ryan 2011-01-12 15:57:48