我有一个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 :(得分: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的类定义。它的工作原理如下:
答案 3 :(得分:1)
这可能对你有帮助,一篇关于flex文件大小优化的文章 http://askmeflash.com/article_m.php?p=article&id=9
答案 4 :(得分:0)
您可以查看ModuleLoader类,也许您可以在前200kbs中加载核心内容,然后在需要时加载其余内容。
另外值得注意的是,您使用的任何SWC都是在编译时嵌入的,而任何SWF都是在运行时加载的。