精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-09-02
最后修改:2009-09-02
减肥总是要付出一定代价的,我们的目的是如何在付出最小代价的情况下,轻松减去一身赘肉。 本文不是讨论如何设置编译参数进行优化,来达到减肥的目的,如果您是减肥人士,相信一些基础知识都应该具备了。 创建一个最简单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 首先创建一个Flex组件(不是模块),该组件可以继承任何Flex组件,但就是不能继承Module(标准的Module写法是继承Module,但这样编译出来的swf会很大),该组件可称为MyModule 然后创建一个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}; } } } 最后设置项目属性,添加模块,将MyModuleFactory设为模块(注意不是MyModule) 注意事项: 1 Module要想最小,一定要把其他依赖的Lib库设置成运行时共享库 2 编译主应用程序的时候,设置编译选项-keep-all-type-selectors=true,否则加载出来的模块,里面的部分组件会丢失样式,甚至报空指针错误 实际应用中没有出现过大问题,原来一个80k的模块,减肥后变成30k,减掉50k之多。 不当之处,请大家指正。若有更好的思路,欢迎大家一起探讨。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-09-03
这也是我一直不采用flex的原因,看看component的代码就能吓死人,这么臃肿.
曾经也想过这种办法减肥,都不理想,迫不得已,自己重新写框架,自己用as来实现所有组件. 自己实现的datagrid,编译后10k都不到. |
|
返回顶楼 | |
发表时间:2009-09-04
最后修改:2009-09-04
znjq 写道 这也是我一直不采用flex的原因,看看component的代码就能吓死人,这么臃肿.
曾经也想过这种办法减肥,都不理想,迫不得已,自己重新写框架,自己用as来实现所有组件. 自己实现的datagrid,编译后10k都不到. component除了臃肿,组件的创建速度也不快。一旦多了,界面要白屏一会。虽然有各种优化措施,但这些都是治表不治本,快才是硬道理。对于性能比较苛刻的场景,自己也是单独用as3来写,坚决不用uicomponent。其实Flash还是很快的,一般自己写的组件创建速度都很快。感觉Flex除了功能越来越复杂,把Flash小巧和快速的优点都丧失了。 mxml的编译速度也是慢的要命,如果纯写as3,编译速度就很快,快出好几个数量级。 模块机制还是比较有用的,对于比较大的项目,是一种比较不错的解决方式。 |
|
返回顶楼 | |
发表时间:2009-09-06
最后修改:2009-09-06
znjq 写道 这也是我一直不采用flex的原因,看看component的代码就能吓死人,这么臃肿.
曾经也想过这种办法减肥,都不理想,迫不得已,自己重新写框架,自己用as来实现所有组件. 自己实现的datagrid,编译后10k都不到. 你这样搞完后还能所见即所得和拖拽吗?俺就是觉得拖拽多省事啊。 如果拖拽和简单的设定参数就能搞定界面,就能普及开来前台mm都能给你帮忙做啊。 否则不符合能推就推的原则 |
|
返回顶楼 | |
发表时间:2009-09-06
最后修改:2009-09-06
多谢楼主给出减肥方法,有机会一定要试一试,我最近的项目在这个上面搞的好遭,
差不多70个模块,小的100k,大的...1M出头 -_-b 不知道那些个1M出头的能压缩到多少, 这些模块基本上就没用到Module甚至是container里的东西,按照你的说法,我都可以继承UIComponent了,如果可视化没啥问题的话,我直接像上上楼的兄弟连uicomponet都不用继承而可以继承sprite,o(∩_∩)o...哈哈 于是,弱人如我就有另外一个问题:比如说我有10来个50k的module,有没有办法把他直接打包成一个swf一下子直接下载到客户端而不是一个一个的load?如果这个能解决,就进一步:flex库项目里能不能包含module? 多谢 |
|
返回顶楼 | |
发表时间:2009-09-06
最后修改:2009-09-06
timshaw9791 写道 比如说我有10来个50k的module,有没有办法把他直接打包成一个swf一下子直接下载到客户端而不是一个一个的load?如果这个能解决,就进一步:flex库项目里能不能包含module?
多谢 那你把它们做成lib库不就行了吗,做为lib库一起加载,这种方式就不需要Module了,而且编译后也是很小的。 或者把10个swf作为资源嵌入到一个单独的swf文件中,然后在客户端直接用ModuleLoader的loadModule方法加载二进制数据。 不明白你的应用场景是什么,一下子加载会很慢。分开加载,可以利用浏览器多线程下载的机制,反而会快些。 你写的一个模块有1M,我觉得不太可能,可能你里面内嵌了很大的图片资源,也可能你把依赖的第三方库都合并进去了, Flex的库才500多k,逻辑就很复杂了。你写的模块逻辑很复杂吗? |
|
返回顶楼 | |
发表时间:2009-09-06
1M这个大小是真的,哈哈,是我debug构建并且没优化代码的情况下折腾出来,我想优化一下500k应该是没问题的,就是希望你这个方法能让他更小点。 至于捆绑下载,初衷是不想让用户访问一个Module界面,客户端首先跑去服务器端下一个swf,回来后有跑一趟服务器端去取数据,不过想想也就是首次加载才会这样。 |
|
返回顶楼 | |
发表时间:2009-09-06
最后修改:2009-09-06
500k也减不了多少了,估计最多也就50k吧,本身体积就很大了,减掉这点我觉得意义已经不大了。
我现在加载一个比较大的东西,比如500k,都会把它们按80k拆成很多小文件,同时下载,最后在客户端合并,这样速度会快点。 如果试过了,告知一声,我也想了解一下实际的效果。 |
|
返回顶楼 | |
发表时间:2009-09-06
一个空白的app,rsl下release编译就有60多k, 还不包括sdk的550k体积.对于有些应用来说这个体积实在是太大了.
各位,能否帮忙做个测试. 看看拖拽效果如何. 3Q! http://znjq.iteye.com/blog/463459 |
|
返回顶楼 | |
发表时间:2009-09-09
用楼主的方式尝试了一下,同时在MyModule里面加上一个combobox。跑出来的combobox显示有问题。selectioncolor会变成黑色,而且设置style也不生效。我用的是flex3.2。
|
|
返回顶楼 | |