论坛首页 编程语言技术论坛

Flex Module 终极减肥篇之去掉最后哪一点赘肉

浏览 13041 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-09-02   最后修改:2009-09-02
首先声明,如果您不是一个狂热的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

首先创建一个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之多。


不当之处,请大家指正。若有更好的思路,欢迎大家一起探讨。
   发表时间:2009-09-03  
这也是我一直不采用flex的原因,看看component的代码就能吓死人,这么臃肿.
曾经也想过这种办法减肥,都不理想,迫不得已,自己重新写框架,自己用as来实现所有组件.
自己实现的datagrid,编译后10k都不到.
0 请登录后投票
   发表时间:2009-09-04   最后修改:2009-09-04
znjq 写道
这也是我一直不采用flex的原因,看看component的代码就能吓死人,这么臃肿.
曾经也想过这种办法减肥,都不理想,迫不得已,自己重新写框架,自己用as来实现所有组件.
自己实现的datagrid,编译后10k都不到.

component除了臃肿,组件的创建速度也不快。一旦多了,界面要白屏一会。虽然有各种优化措施,但这些都是治表不治本,快才是硬道理。对于性能比较苛刻的场景,自己也是单独用as3来写,坚决不用uicomponent。其实Flash还是很快的,一般自己写的组件创建速度都很快。感觉Flex除了功能越来越复杂,把Flash小巧和快速的优点都丧失了。

mxml的编译速度也是慢的要命,如果纯写as3,编译速度就很快,快出好几个数量级。

模块机制还是比较有用的,对于比较大的项目,是一种比较不错的解决方式。

0 请登录后投票
   发表时间:2009-09-06   最后修改:2009-09-06
znjq 写道
这也是我一直不采用flex的原因,看看component的代码就能吓死人,这么臃肿.
曾经也想过这种办法减肥,都不理想,迫不得已,自己重新写框架,自己用as来实现所有组件.
自己实现的datagrid,编译后10k都不到.

你这样搞完后还能所见即所得和拖拽吗?俺就是觉得拖拽多省事啊。
如果拖拽和简单的设定参数就能搞定界面,就能普及开来前台mm都能给你帮忙做啊。
否则不符合能推就推的原则
0 请登录后投票
   发表时间: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?


多谢
0 请登录后投票
   发表时间: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,逻辑就很复杂了。你写的模块逻辑很复杂吗?
0 请登录后投票
   发表时间:2009-09-06  

1M这个大小是真的,哈哈,是我debug构建并且没优化代码的情况下折腾出来,我想优化一下500k应该是没问题的,就是希望你这个方法能让他更小点。

至于捆绑下载,初衷是不想让用户访问一个Module界面,客户端首先跑去服务器端下一个swf,回来后有跑一趟服务器端去取数据,不过想想也就是首次加载才会这样。

0 请登录后投票
   发表时间:2009-09-06   最后修改:2009-09-06
500k也减不了多少了,估计最多也就50k吧,本身体积就很大了,减掉这点我觉得意义已经不大了。

我现在加载一个比较大的东西,比如500k,都会把它们按80k拆成很多小文件,同时下载,最后在客户端合并,这样速度会快点。

如果试过了,告知一声,我也想了解一下实际的效果。
0 请登录后投票
   发表时间:2009-09-06  
一个空白的app,rsl下release编译就有60多k, 还不包括sdk的550k体积.对于有些应用来说这个体积实在是太大了.

各位,能否帮忙做个测试. 看看拖拽效果如何. 3Q!
http://znjq.iteye.com/blog/463459
0 请登录后投票
   发表时间:2009-09-09  
用楼主的方式尝试了一下,同时在MyModule里面加上一个combobox。跑出来的combobox显示有问题。selectioncolor会变成黑色,而且设置style也不生效。我用的是flex3.2。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics