3

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

任何经验教训将不胜感激。

4

4 回答 4

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

希望有帮助!

于 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 回答