2008-10-08 60 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