Rendere la compilazione di Flex Builder più veloce

Flex oscar Commenta l'articolo

Apparentemente le immagini, i files swf e i documenti "embedded" il progetto provocano un rallentamento della fase di compilazione di Flex Builder. Quindi le operazioni di "refresh" o "launch" richiedono diversi minuti prima di esssere conclusi.

In altri termini se il tuo progretto contiene molti <mx:Button icon=”@Embed(…)” /> allora aspettati di avere una fase di compilazione lenta.

Una semplice soluzione è quella di spostare tutte le chiamate "embed" dentro uno style scheet e compilare il tutto come un modulo. Procedi come i passi seguenti per creare un modulo style sheet:

  1. crea un nuovo modulo (file->new->flex->MXML module);
  2. aggiungi dento questo modulo i riferimenti dello style sheet.

<?xml version="1.0" encoding="utf-8"?>
<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="0" height="0" creationComplete="trace(‘iconsloaded’)">
<mx:Style source="style.css" />
</mx:Module>
  1. rimuovi tutti gli attributi embed nel tuo progetto;

  2. carica nella pagina iniziale il modulo style sheet appena creato.

protected var styleLoader:ModuleLoader;
protected function init() : void{    
	styleLoader = new ModuleLoader();    
    styleLoader.addEventListener(ModuleEvent.READY, onModuleLoad );
    styleLoader.addEventListener(ModuleEvent.ERROR, onModuleError );
    styleLoader.url = "IconsModule.swf";
    styleLoader.loadModule();
}
protected function onModuleLoad( e:ModuleEvent ) : void{
    maximize();
    var mainApp:MainApplication = new MainApplication();
    mainApp.percentHeight = 100;
    mainApp.percentWidth = 100;
    addChild(mainApp);
}
protected function onModuleError(e : ModuleEvent ) : void{
    Alert.show("Could not load module IconsModule.swf","Error",Alert.OK );
}

Dal codice è facile intuire che inizializzo la main application dopo che il modulo è stato caricato.

Con questi accorgimenti il compilatore non deve caricare all’interno del file swf finale tutte le immagini (o file generici embed), ma le immagini saranno caricate in run-time, di conseguenza il processo di compilazione avrà meno lavoro da svolgere.

Una seconda opzione è consigliata quando non è possibile mettere tutte le immagini in un file di style sheet. In questo caso:

  1. crea una interfaccia che elenca tutte le immagini "embed"
      public interface MyGraphicsModule{
      			// Bindable tags are there purely to suppress warnings,
                // these properties never change after startup.
                [Bindable(event="moduleChanged")] function get addIcon() : Class;...
                }
      

 

  1. Fai una classe che implementa questa interfaccia ed estende ModuleBase.
      public class MyGraphics extends ModuleBase implements MyGraphicsModule{
      	[Embed(source="/art/toolbars/add.png")]
        protected var _addIcon:Class;public 
        function get addIcon() : Class { return _addIcon; }
    	...
       }
    
      

Una cosa importante è quella di non importare questa classe nell’applicazione, perché l’obbiettivo è quello di tenere le cose separate.

  1. Crea un modulo manger
    public class MyModules{
          [Bindable] public static var graphics:MyGraphicsModule;
    }
  1. Addiziona nelle proprietà del progetto il modulo MyGraphics, Project->Properties->Flex Modules settings.
  2. Carica il modulo nello start up
      public function loadModules() : void{
      	graphicsModuleLoader = new ModuleLoader();
        graphicsModuleLoader.addEventListener(ModuleEvent.READY, onModuleLoaded );
        graphicsModuleLoader.addEventListener(ModuleEvent.ERROR, onModuleLoadFailure );
        graphicsModuleLoader.url = "MyGraphics.swf";
        graphicsModuleLoader.loadModule();
       }
    
    	protected function onModuleLoaded( event:ModuleEvent ) : void{
        	if( event.target == graphicsModuleLoader ){
            	var o:Object = event.module.factory.create();
                MyModules.graphics = event.module.factory.create() as MyGraphicsModule;
             }
         }
    
      
  1. Nel punto dove si trova l’immagine scrivi al posto del codice
     [Embed(source="/art/icons/addIcon.png")] public var addIcon:Class;
     

    il codice:

     public var addIcon:Class = MyModules.graphics.addIcon;
     

Scrivi un Commento

Home | Graffiti e Disegni | Educazione | Chi siamo | Blog | Progetti | Contatti
RSS Feed Comments RSS Accedi