flex 编译优化
22.12.1.问题
我想减小文件大小和模块的后续下载时间。
22.12.2.解决办法
当编译应用程序时使用mxmlc工具的link-report命令行参数生成一个连接报告文件,然后在编译模块时把报告文件作为load-externs命令行参数值,确保只有模块需要的类被编译进来。
22.12.3.讨论
当你编译模块时,所有模块依赖的自定义或框架代码都被编译进生成的SWF文件中。在这些代码中,特别是框架代码很多都是和主程序和模块所共有的。你可以根据一个连接报告文件删除模块中多余的代码以减小文件大小。
连接报告文件列出了主程序依赖的类,当编译主程序时使用link-report命令行参数生成连接报告文件。下面的命令生成连接报告文件report.xml:
>mxmlc-link-report=report.xmlMyApplication.mxml
生成的连接报告文件供编译模块时用,要删除多余的代码,减小模块文件大小,编译模块时使用link-externs命令行参数值设置为刚才生成的连接报告文件:
>mxmlc-load-externs=report.xmlMyModule.mxml
生成的模块SWF文件不包含任何主程序和模块依赖代码。当你的主程序和模块都有框架代码时这是一个很好的优化工具。根据连接报告文件排除的代码和主程序和模块有一定关系的,也就是说如果主程序代码发生改变,你就需要重新生成连接报告文件并重新编译模块。
如果主程序使用多个模块,这项技术也可被用来编译那些在主程序中多余,而多个模块都需要的代码。实际上,这是通用的规则去编译任何管理类,比如mx.managers.DragManager和mx.managers.PopUpManager,模块可能依赖于主程序。这是因为模块不能访问另一模块的资源,否则就会抛出运行时异常,例如一个模块试图引用其他模块的DragManager。
要确保模块都是引用主程序中的同一个管理器,你需要在主程序中导入和申明一个类本地变量:
-ActionScript
importmx.managers.PopUpManager;
varpopUpManager:PopUpManager;
用生成的连接报告文件去编译模块,确保模块都是使用同一个管理器引用,以减少代码冗余和模块大小。
F:\ProgramFiles\Adobe\FlashBuilder4\AdobeFlashBuilder4\sdks\3.5.0\bin
mxmlc-link-report=report.xmlaquForYwhs.mxml-target-player=10.0.0
-load-externs=D:/aquaqu/aquForYwhs/aquForYwhs/flex_src/report.xml
mxmlc-services"D:/aquaqu/aquForYwhs/aquForYwhs/WebRoot/WEB-INF/flex/services-config.xml"-localeen_USabc.mxml
FlexBuilder3把release版本的编译独立出来做了一个功能:File-Export-ReleaseBuild…另外还有一个打包的功能。不过在使用之前,先需要指定默认的主文件(如下图)。
最近使用PuerMVC和Module机制构建了一个界面和操作类似WINDOW7的系统框架,将flex的module好好研究了一番,关于module的性能优化和开发中相关注意事项就不多说了,我博客里面有2篇文章讲解非常详细了,这次主要说一说module体积的相关情况。
一个应用程序包含多个module,首先看看最简单的测试结果,我拿2个module进行测试,这两个module使用到了第三方组件MDIWindows和Datagrid,Tree等flex组件。
1.debug编译,模块编译不使用链接报告优化,结果如下
应用程序主swf文件大小:450KB模块A:250KB,模块B:240KB
2.debug编译,模块编译使用链接报告优化,结果如下
应用程序主swf文件大小:670KB模块A:475KB,模块B:467KB
3.release编译,模块编译不使用链接报告优化,结果如下
应用程序主swf文件大小:300KB模块A:160KB,模块B:150KB
4.release编译,模块编译使用链接报告优化,结果如下
应用程序主swf文件大小:440KB模块A:35KB,模块B:30KB
首先使用链接报告优化简单module体积,将主应用和模块都使用的资源或者各个module公用的资源编译到主应用swf,通过链接报告来编译模块swf,这样模块编译时将主应用已经编译的资源不再编译,从而减少了module的大小,加快了模块的加载速度。
例如A,B两个模块和主应用都用到了Music类,则使用链接报告优化后A,B连个模块则不将Music类编译进自己的模块。
例如A,B连个模块都使用到了Player类,而主应用没有适用到Player类,则主应用SWF中不包含Player类的信息,A,B模块的SWF中都包含Player类的信息,因此在开发中为了减少模块大小,将各个模块公用而主应用不使用的资源,如Player类引入到主应用中,比如在Application的script标签中使用下面的代码
importa.b.c.Player;Player;
或者仅仅定义一个Player类型的变量
importa.b.c.Player;
privatevarplayer:Player;
这些是链接报告优化模块大小的相关知识。但是通过上面的数据看出情况并非如此,这是因为debug环境下编译的文件包含各种调试信息,编译出来的swf是用于开发人员开发调试使用,真正的链接报告优化是针对release编译结果来说的,可以看到在主应用中将A.B模块公用的代码应用到主应用中的时候,主应用增加了140KB,而A.B模块分别减少了130KB和120KB。