Оптимизация Flex при использовании нескольких модулей - PullRequest
3 голосов
/ 09 октября 2008

У меня есть приложение Flex, где время загрузки чрезвычайно важно (сайт потребителя). я хочу иметь возможность выводить что-то на экран, а затем разрешать загрузку дополнительных модулей по мере необходимости.

Проблема, с которой я сталкиваюсь, заключается в том, что общая сумма всех модулей намного больше, чем если бы я включил все компоненты в один файл .swf.

Довольно очевидно, почему. Например, классы, необходимые для доступа к веб-сервису, занимают около 100 КБ. Если я не буду использовать эти классы в моем main.swf, то они будут включены в КАЖДЫЙ модуль, который их использует. Так что, если у меня есть 5 модулей, то это лишние 500 кБ, потраченные впустую.

Теоретически я хочу 3 уровня

main.swf - минимально возможный материал макета / стиля / шрифта / фреймворка common.swf - дополнительные классы, необходимые для модуля 1 + модуль 2 (например, веб-сервисы) module1.swf - модуль 1 на сайте module2.swf - модуль 2 на сайте

Я не знаю, возможно ли это вообще.

Мне интересно, могу ли я загружать файлы swz / swf для частей платформы вместо всей платформы.

Мне действительно нужно уменьшить размер основного приложения до 200 КБ. Он увеличивается до 450 КБ, когда я добавляю веб-сервисы и базовую функциональность сетки данных.

Буду признателен за любые извлеченные уроки.

Ответы [ 5 ]

3 голосов
/ 24 марта 2009

Я знаю, что это было некоторое время назад, но я решил опубликовать еще один ответ на случай, если кто-то все еще ищет ответ на этот вопрос.

Я занимался оптимизацией приложений Flex и после некоторой проверки решил использовать модули. Прежде всего потому, что у них есть такие хорошие варианты для оптимизации.

Вам нужны две команды mxmlc:

mxmlc -link-report=MyAppReport.xml MyApp.mxml

и

mxmlc -load-externs=MyAppReport.xml MyModule.mxml

Мой внешний SWF (с использованием Flex Framework) теперь только 21k. Он делает много (пока), но даже если он делает все больше и больше, он будет продолжать использовать ресурсы из основного кода приложения.

Вот пакетный файл, который я создал, чтобы ускорить процесс (вы должны поместить mxmlc в переменную среды, чтобы она работала так. Переменная, добавляющая путь к вашему mxmlc (требуется перезагрузка)):

cd C:\Projects\MyProject\Develop\Modules
mxmlc -link-report=MyAppReport.xml C:\Projects\MyProject\Develop\Source\Main.mxml
mxmlc -load-externs=MyAppReport.xml MyModule.mxml
move /Y MyModule.swf ..\Runtime\Modules

Больше информации здесь: http://livedocs.adobe.com/flex/3/html/help.html?content=modular_4.html

Надеюсь, это поможет!

1 голос
/ 06 мая 2009

это может вам помочь, статья об оптимизации размера файла flex
http://askmeflash.com/article_m.php?p=article&id=9

1 голос
/ 12 октября 2008

Flex немного сложен, когда дело доходит до размера файла. На самом деле есть только один способ уменьшить размеры вашего приложения, это использовать внешнюю SWZ для фреймворка. Есть статья Adobe Devnet на тему Повышение производительности приложений Flex с помощью кэша Flash Player , которую я рекомендую прочитать.

В проекте, над которым я работал, у нас были проблемы с загрузкой нашего модуля предварительной загрузки классов, которые нам не нужны. Нам нужно было создать интерфейсы для классов, которые находятся в других модулях, и ссылаться на них таким образом. Когда модуль загружен, мы просто назначаем ссылку на IApplicationModule для вызова нашего кода инициализации.

Также обратите внимание на помещение ваших классов в отдельный SWF-файл, а затем используйте ApplicationDomain для получения доступа к классам

(этот код взят из этого сообщения на форуме , в котором объясняется, как получить доступ к классам, загруженным из модулей во Flex)


private function loadContent(path:String):void 
{
   var contentLoader:Loader = new Loader();
   contentLoader.contentLoaderInfo.addEventListener(
      Event.COMPLETE,
      loadContent_onComplete);
   contentLoader.load(new URLRequest(path));
}


private function loadContent_onComplete (event:Event):void
{  
   var content:DisplayObject = event.target.content;

   if(content is IFlexModuleFactory) 
   {
      var content_onReady:Function = function (event:Event):void 
      {   
         var factory:IFlexModuleFactory = content as IFlexModuleFactory;
         var info:Object = factory.info();
         var instanceClass:Class = info.currentDomain.getDefinition(
            info.mainClassName) as Class;

         addChild (new instanceClass ());
      }

      content.addEventListener ("ready", content_onReady);

   } 
   else
   {
      addChild (content);  
   }
}
1 голос
/ 30 декабря 2008

В компиляторе командной строки есть опция для исключения определений классов, которые уже скомпилированы в другой swf. Это работает так:

  1. Скомпилируйте главное приложение (которое содержит загрузчик) и выберите генерацию отчета.
  2. Скомпилируйте модуль и включите исключение классов в приведенном выше отчете.
0 голосов
/ 09 октября 2008

Вы можете заглянуть в класс ModuleLoader , возможно, вы сможете загрузить свои основные компоненты в первые 200 КБ, а затем загрузить остальные, когда и если это необходимо.

Также стоит иметь в виду, что любые SWC, которые вы используете, встроены во время компиляции, тогда как любые SWF загружаются во время выполнения.

...