使用多个模块时优化Flex

时间:2008-10-08 22:55:43

标签: flex optimization module flash

我有一个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。

任何经验教训都会受到赞赏。

5 个答案:

答案 0 :(得分:3)

我知道这是在一段时间之前,但我想我会发布另一个回复以防有人仍在寻找答案。

我一直在寻求优化Flex应用程序,并在进行一些检查后决定使用模块。主要是因为他们有很好的优化选择。

您需要的两个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

希望有所帮助!

答案 1 :(得分: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);  
   }
}

答案 2 :(得分:1)

命令行编译器上有一个选项可以排除已经编译成另一个swf的类定义。它的工作原理如下:

  1. 编译主应用程序(包含加载程序)并选择生成报告。
  2. 编译模块并选择在上述报告中排除类。

答案 3 :(得分:1)

这可能对你有帮助,一篇关于flex文件大小优化的文章 http://askmeflash.com/article_m.php?p=article&id=9

答案 4 :(得分:0)

您可以查看ModuleLoader类,也许您可​​以在前200kbs中加载核心内容,然后在需要时加载其余内容。

另外值得注意的是,您使用的任何SWC都是在编译时嵌入的,而任何SWF都是在运行时加载的。