有关Flex和Air中如何使用RSL网上教程很多,google一下即可,这里不多做叙述了
而这次遇到的问题是这样的:
发布时只发布一个主程序(Web或者Air方式),而不发布所需要的module及其依赖的swc,只在运行时根据需要加载module及其依赖的swc
1. 建立一个实验用的module工程:
先准备一个module工程,普通的Flex Project(web)即可,主程序名无所谓,因为这个工程只是为了编译module对象用的
在Properties->Flex Build Path中引入所要依赖的swc,这个例子中使用了TweenLite.swc
注意AIR project的默认Link Type是Merge into code,改成RSL。如图:

新建一个包modules并新建一个module程序:MyModule1.mxml
到Properties->Flex Modules中修改该module的optimize属性为none,如下图

点击Edit按钮,弹出下图

选择Do not optimize(…)
在MyModule1.xml中使用TweenLite做一个简单的动画:
TweenLite.to(<strong>this</strong>.goed,4,{x:500});
编译工程,
此时MyModule1.mxml被编译生成为MyModule1.swf
TweenLite.swc会被编译成TweenLite.swf
复制到要被加载的目录下,我的是
http://127.0.0.1/testflex/TweenLite.swf
http://127.0.0.1/testflex/modules/MyModule1.swf
2. 建立主工程(Flex Web):
新建一个Flex Project(web),不要使用引入TweenLite.swc
新建一个用来控制加载TweenLite的类:
tasks/TaskLoadRSL.as
在这个类中,使用URLLoader将TweenLite.swc从http://127.0.0.1/testflex/TweenLite.swf上加载下来,主要代码如下:
var loader:Loader = new Loader();
var context:LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;//必须有这一句,RSL必须和主程序在同一个域中
loader.load(new URLRequest(this.web),context);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,localLoadCompleteHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,localLoadIoErrorHandler);
加载完TweenLite后不需要任何操作,直接开始加载module即可
使用IModuleInfo或ModuleLoader加载module都可以,详见源代码
3. 建立主工程 (AIR):
Air中比Flex要麻烦,因为发布时只发布主程序,所以运行时需要先检测本地是否有swc和
module
如果有就直接加载运行(同Web)
如果没有就从网站上下载到本地,然后再加载
主要代码如下:
从网络地址上加载:
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, loadFromWebCompleteHandler);
loader.addEventListener(IOErrorEvent.IO_ERROR, loadFromWebErrorHandler);
loader.load(new URLRequest(web))
加载完,保存到本地:
var loader:URLLoader = URLLoader($e.target);
var data:ByteArray = ByteArray(loader.data);
var file:File = new File(File.applicationDirectory.resolvePath(this.local).nativePath);
trace('save file to' + file.nativePath);
var fileStream:FileStream = new FileStream();
fileStream.open(file, FileMode.WRITE);
fileStream.writeBytes(data);
fileStream.close();
this.loadFromLocalFile();
本地加载过程同Flex Web
更多内容参加源代码:DynamicTestLoadModuleAndRSL