首先声明,如果您不是一个狂热的Flex Module减肥发烧友,如果您觉得Flex Module体态已经够轻盈了,那么下面的文章您大可不必看了。
减肥总是要付出一定代价的,我们的目的是如何在付出最小代价的情况下,轻松减去一身赘肉。
本文不是讨论如何设置编译参数进行优化,来达到减肥的目的,如果您是减肥人士,相信一些基础知识都应该具备了。
创建一个最简单Flex Module,哪怕里面什么也不放,编译后的swf文件会有37k左右,进行编译优化后,也仅能减小到26k左右,具体大小视Flex SDK的版本而定,本人用的是Flex SDK 3.2。
菜鸟:“天哪!还没开始写,就30多k啦?俺算算,这个30K是压缩后的,两个'prototype'有了,一个'JQuery'也不差多了。老早就听说Flex程序素以体型硕大而著称,后经人指点,教俺把程序拆为Module,可如今一试,乖乖的不得了,光皮重就30K。”
减肥发烧友不屑的说道:“有啥大惊小怪的,肉多了,减掉不就得了嘛。”
菜鸟怯怯的问:“敢问大侠,能减到多小呢?”
"1k以下吧",减肥发烧友淡淡的说道。
"哇!!!",菜鸟吐了吐自己舌头,"这怎么可能!这怎么可能!1比30!!!"
减肥发烧友又是不屑:“你本来就没写什么东西,1k以下当然是正常情况,可偏偏有人把30k的叫做正常。”
菜鸟若有所思:“是啊,你看那帮做js,天天想着就是js怎么压缩,生怕它太大。Flex的世界里,胖好像是天经地义的,胖是正常的,因为我们的最小的Module也没达到过1K。”
言归正传,有感于Flex中生成的Module偏大,可能是考虑到Module要适应不同的复杂场景。可现实中不见得需求就那么复杂,简单的问题应该有简单的解决办法,研究了一下Module减肥的方法,归纳出来两种方式:
//第一种 实现自己的ModuleLoader,该方式因加载出来的Module不太稳定,暂没想到好的解决方式,待完善后再公布出来。
第二种 ModuleLoader还是用Flex自带的,写Module时,实现自己的ModuleFactory ---实际测试对比过。可用
2、然后创建一个AS3类,此处可称为MyModuleFactory,该类主要负责创建MyModule的实例
3、最后设置项目属性,添加模块,将MyModuleFactory设为模块( 注意不是MyModule )
注意事项:
1 Module要想最小,一定要把其他依赖的Lib库设置成运行时共享库
2 编译主应用程序的时候,设置编译参数选项 -keep-all-type-selectors=true ,否则加载出来的模块,里面的部分组件会丢失样式,甚至报空指针错误
实际应用中没有出现过大问题,原来一个80k的模块,减肥后变成30k,减掉50k之多。
减肥总是要付出一定代价的,我们的目的是如何在付出最小代价的情况下,轻松减去一身赘肉。
本文不是讨论如何设置编译参数进行优化,来达到减肥的目的,如果您是减肥人士,相信一些基础知识都应该具备了。
创建一个最简单Flex Module,哪怕里面什么也不放,编译后的swf文件会有37k左右,进行编译优化后,也仅能减小到26k左右,具体大小视Flex SDK的版本而定,本人用的是Flex SDK 3.2。
菜鸟:“天哪!还没开始写,就30多k啦?俺算算,这个30K是压缩后的,两个'prototype'有了,一个'JQuery'也不差多了。老早就听说Flex程序素以体型硕大而著称,后经人指点,教俺把程序拆为Module,可如今一试,乖乖的不得了,光皮重就30K。”
减肥发烧友不屑的说道:“有啥大惊小怪的,肉多了,减掉不就得了嘛。”
菜鸟怯怯的问:“敢问大侠,能减到多小呢?”
"1k以下吧",减肥发烧友淡淡的说道。
"哇!!!",菜鸟吐了吐自己舌头,"这怎么可能!这怎么可能!1比30!!!"
减肥发烧友又是不屑:“你本来就没写什么东西,1k以下当然是正常情况,可偏偏有人把30k的叫做正常。”
菜鸟若有所思:“是啊,你看那帮做js,天天想着就是js怎么压缩,生怕它太大。Flex的世界里,胖好像是天经地义的,胖是正常的,因为我们的最小的Module也没达到过1K。”
言归正传,有感于Flex中生成的Module偏大,可能是考虑到Module要适应不同的复杂场景。可现实中不见得需求就那么复杂,简单的问题应该有简单的解决办法,研究了一下Module减肥的方法,归纳出来两种方式:
//第一种 实现自己的ModuleLoader,该方式因加载出来的Module不太稳定,暂没想到好的解决方式,待完善后再公布出来。
第二种 ModuleLoader还是用Flex自带的,写Module时,实现自己的ModuleFactory ---实际测试对比过。可用
开发步奏:
1、创建一个Flex组件( 不是模块 ),该组件可以继承任何Flex组件,但就是不能继承Module( 标准的Module写法是继承Module,但这样编译出来的swf会很大 ),该组件可称为MyModule2、然后创建一个AS3类,此处可称为MyModuleFactory,该类主要负责创建MyModule的实例
- package
- {
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.system.ApplicationDomain;
- import flash.utils.setTimeout;
- import mx.core.IFlexModuleFactory;
- public class MyModuleFactory extends Sprite implements IFlexModuleFactory
- {
- public function MyModuleFactory()
- {
- super();
- setTimeout(function(){
- dispatchEvent(new Event("ready"));
- },0);
- }
- public function create(...args):Object
- {
- return new MyModule();
- }
- public function info():Object
- {
- return {currentDomain:ApplicationDomain.currentDomain};
- }
- }
- }
3、最后设置项目属性,添加模块,将MyModuleFactory设为模块( 注意不是MyModule )
注意事项:
1 Module要想最小,一定要把其他依赖的Lib库设置成运行时共享库
2 编译主应用程序的时候,设置编译参数选项 -keep-all-type-selectors=true ,否则加载出来的模块,里面的部分组件会丢失样式,甚至报空指针错误
实际应用中没有出现过大问题,原来一个80k的模块,减肥后变成30k,减掉50k之多。