flash的跨浏览器缓存与swf文件瘦身

flash player 9.0.115.0已完美支持客户端缓存。称她完美,有两点:
其一,跨浏览器。在IE中缓存了,在firefox便无需缓存。
其二,跨站点。在站A缓存了,在站B便无需缓存。


flash player cache的产生,与flex builder有着不可分割的关系。flex builder 3的类库已经做相当完善,但是用它做出来的swf,文件太大。这也是无法避免的。对于.net,因其在服务器端运行,用户不需要其库类库环境,所以无需加载什么。但是flash不同,swf是在客户端运行,若使用flex的控件,则必须把用到的类库加载到客户端。

对于用flex做的两个不同的swf文件,可能他们含有相同的类库代码。这些类库代码,adobe称为RSL,即Runtime Shared Liabrary。adobe认为,RSL没有必要每次都让用户加载,完全可以缓存在客户端。flash player 9.0.115也是这么做的。RSL以swz的格式存在。对于9.0.115之前的flash player,adobe提供swf格式的rsl,这种swf格式的rsl只能依赖于客户端浏览器的缓存,上述那两个完美的优点便不具备。
为了与9.0.115之前的flash player兼容,在flex中设置rsl选项时,第一个要设置swz文件,第二个为swf。flash player将按照上下顺序试着加载。如果安装的是flex builder 3正式版,那么对于framework.swc的rsl设置如图:

[img]http://blog.sban.com.cn/download/2008/04/flex3-framework-rsl-design.png[/img]
第一个为framework_3.0.0.477.swz,第二个为framework_3.0.0.477.swf。
一般倡导的rSL优化,大多指对framework.swc的RSL设置。这是因为,framework.swc是flex中主要类库,也是最大的一个。对于其它的swc,如rpc.swc也可以使用同样的方法优化。

在使用RSL优化时,一定要选择Degists,这也是adobe推荐的。Degists是给RSL验证用的,flash player必须保证加载的RSL是其swf文件所需要的。在swf文件内存有一个Degist,用于与swz文件中的degist比对。

对于自已开发的类库,发布为swc文件,在引用时,也推荐使用rSL优点,并且要选择Degists。关于Degist,adobe是使用SHA-256 hash计算的,保证了RSL的唯一性。对于swz或者swf的命名,可以参考adobe的做法。前面用版本号,后面可以添加日期或者其它。比如,pawnshop类库的swz文件命名有pawnshop_0.2.080402.swz。对swz文件用什么名字与degist无关。

如果在项目中用了flex自带的swc,同时也有第三方的swc,一般把第三方swc置于最下方。这影响flash player对rsl的加载顺序,设置不当,可能抛出error.

sban 2008年4月4日于北京朝阳园
原文链接:http://blog.sban.com.cn/2008/04/04/about-cross-browser-cache-and-reduce-swf-filesize.html

你可能感兴趣的:(FLEX)