转自:http://kevincao.com/2009/12/master-flash-cs4-compile/
Compiled Clip和SWC File
Compiled Clip和SWC File都包含经过编译后的Flash内容,区别在于:一个是“Clip”,存在于库中;另一个是“File”,是独立的文件。
如上图所示,在为ActionScript导出的元件上点击右键,可以看到生成Compiled Clip和导出SWC File的选项。这里常见的误解是以为这个操作只会编译当前选择的元件,实际的情况是除此之外还会把库中所有第一帧导出的元件也一同编译进来。要确认Compiled Clip或者SWC File中包含了些什么类,可以用闪客精灵等破解软件或者Flash Develop自带的SWC浏览工具来分析。
Flash CS4编译时获取类定义的顺序
Flash CS4中关于ActionScript类的路径设置共有三处,分别是:
- Source path,就是放.as文件的地方。
- Library path,包含SWC文件的路径。
- External library path,也是SWC文件的路径,不过这个SWC中包含的类定义不会被编译到最终swf文件中。
发布swf文件的时候,Flash编译器优先在Source Path中寻找是否有类定义。其次是Compiled Clip,最后是SWC和外部SWC。
如果源文件中包含有Compiled Clip,则编译器还可以在Compiled Clip中寻找类定义。Flash自带的组件就是用了这种方式。
如果源文件绑定了文档类,则该类必须能在Source Path或Compiled Clip中找到。SWC或外部SWC文件中即使包含了该类,也是无效的,编译器会自动生成默认的类定义来代替。
外部SWC文件的进阶用法
在进行模块化ActionScript/Flex项目开发的时候,灵活应用RSL(运行时共享库)来减少文件大小是非常重要的手段。这里面就要用到使用外部SWC文件编译的技术。比如我们制作了一个module.fla文件,在发布选项里面勾选“Export SWC”,就会在发布module.swf文件的同时还生成module.swc。
接下来在其他模块中如何调用module.swf中的类定义呢?
通常我们采用默认的加载方式,module.swf是被加载到当前应用程序域下的子域中。然后通过ApplicationDomain.getDefinition()方法来得到module里的类定义。
RSL的做法是把module.swf加载到当前应用程序域中,这样一来其他任意模块可以直接用类名访问到module.swf中的类定义。
loader.load(new URLRequest("module.swf"), new LoaderContext(false, ApplicationDomain.currentDomain));
但是直接引用的类,必须是编译器找得到的。在满足我们不增加文件大小前提下的选择就只有使用外部SWC文件的方式。把module.swc加进外部SWC路径中,编译正常通过,最终的swf文件中不包含module中的类定义。
这里要特别注意区分运行时和编译时两种情境。编译时的类是通过外部SWC得到的。运行时的类则是从当前应用程序域中获取的。
至此我们可以看到ActionScript 3和以前的加载方式有很大的不同,特别要熟练领会应用程序域的概念,让文件的划分更为合理,这在模块化开发中是十分重要的。
优化编译速度
因为Compiled Clip和SWC File是编译过的,在最终发布的时候无需再次编译,所以能够加快编译的时间,这在类的数量非常大的时候很有用。在使用第三方类库的时候,也尽量使用SWC File,还可以避免非程序员意外修改了源代码的情况。
此外如果你使用外部编辑器,如Flex/FDT/Flash Develop等,它们已经提供了很好的代码检查功能。我们可以在ActionScript设置对话框里面取消下面两个选项的勾选,这样也可以加快一点编译速度。