2008-10-08 2 views
3

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

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

Его довольно очевидно почему. Например, классы, необходимые для доступа к веб-сервису, кажутся примерно 100 кб. Если я не буду использовать эти классы в моем main.swf, тогда они будут включены в модуль EVERY, который их использует. Поэтому, если у меня есть 5 модулей, то лишние 500 кБ потрачены впустую.

В теории я хочу 3 уровня

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

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

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

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

Любые извлеченные уроки будут оценены по достоинству.

ответ

0

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

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

1

Flex - это немного свинья, когда дело доходит до размера файла. На самом деле существует только один способ уменьшить размер вашего приложения, а также использовать внешний интерфейс swz для фреймворка. Существует статья Adobe Devnet о Improving Flex application performance using the Flash Player cache, которую я рекомендую вам прочитать.

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

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

(этот код, взятый из this forum post, который объясняет, как получить доступ к классам, загруженные из модулей в 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

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

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

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

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

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

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

и

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

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

Вот пакетный файл, который я создал для ускорения процесса (вы должны поместить mxmlc в переменную окружения Path, чтобы он работал следующим образом. Панель управления -> Система -> Дополнительно -> Переменные окружения, Edit the Path Системная переменная, добавив путь к 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

Надежда, что помогает!

+0

Если ваш делать это в Flex/Flash Builder, то MyAppReport.xml должен быть помещен в корень проекта модуля папки т.е. в той же папке, что и Module.mxml. Хороший ответ кстати – Ryan 2011-01-12 15:57:48

Смежные вопросы