Динамическая загрузка модульного приложения Extjs

Я занимаюсь разработкой большого клиентского приложения с очень сложными представлениями для каждого модуля с использованием Extjs5. Я разрабатывал приложения в Extjs, но все они компилируются в один файл app.js. Таким образом, исходя из сложности представлений во всех макетах приложений, я оцениваю размер приложения в пределах от 20 до 25 МБ даже после компиляции. Я думал разделить модули на отдельные приложения и создать главное приложение с вкладками или чем-то еще, что будет запускать загрузку отдельных приложений в iFrame в главном приложении. Но я сомневаюсь, что если поведение iframe будет изменено в разных браузерах или объявлено устаревшим в будущих версиях браузера, это станет еще одной большой проблемой. Так есть ли способ в sencha cmd, который компилирует приложение в отдельные файлы на основе модулей и загружает их по запросу из коробки? Если нет, то какое решение я должен использовать.


person leninmon    schedule 21.04.2015    source источник
comment
stackoverflow.com /вопросы/13939305/   -  person Yellen    schedule 21.04.2015
comment
@yellen Я уже прочитал пост. Но там подход мне пока неясен. Это одно приложение или плагины представляют собой отдельные приложения extjs, такие как операции, авторизация и т. Д.? Что делают метаданные в объекте плагинов? Я не видел, чтобы они вызывались или использовались где-либо в демонстрационных утилитах. Если это одно приложение, будут ли плагины компилироваться как отдельные файлы и загружаться по запросу? Я вижу, что функция discoveryPlugins использует реализацию Ext.each для итеративной загрузки всех модулей при начальной загрузке, верно?   -  person leninmon    schedule 21.04.2015
comment
Вы можете добиться чего-то подобного, создав многостраничное приложение. В конечном итоге это представляет собой серию приложений в одном рабочем пространстве, каждое со своим собственным файлом app.js. Используя эту стратегию, вы можете разделить свое приложение на логические разделы, каждый из которых будет одной из страниц или приложений в рабочей области.   -  person Yellen    schedule 01.05.2015
comment
@Yellen, у меня есть аналогичное требование, когда мне нужно сгенерировать несколько файлов js (минимизированных файлов) с помощью sencha CMD 4.2.2. stackoverflow.com/ вопросов/64102523/ Можете ли вы предположить, что это возможно или нет?   -  person SUJU FE    schedule 29.09.2020


Ответы (1)


Начиная с Sencha Cmd 6.5, вы можете разделить свой код на несколько файлов. Для этого вам нужно разбить свой код на пакеты exjts, если это еще не сделано:

В итоге у вас должна получиться похожая структура папок:

workspaceDir
|
+->appA
+->appB
+->packages
 |
 +-> local
  |
  +->CoreComponents
  +->ProcurementModule
  +->ForumModule
  +->BOMModule
  +->ReportModule

В вашем файле app.json вы можете добавлять/перемещать свои пакеты из requires в uses. В качестве последнего шага вы должны добавить новый package-loader в массив requires в app.json. У вас получится что-то вроде этого:

{
    // [...]

    "uses": [
        "ProcurementModule",
        "ForumModule",
        "BOMModule",
        "ReportModule"
    ],

    "requires": [
        "CoreComponents",
        "package-loader"
    ]

    // [...]
}

Далее вам нужно запустить сборку Sencha Cmd с дополнительным флагом -uses. Если вы сделаете это, Sencha Cmd сначала создаст ваши необязательные пакеты и добавит их в папку ресурсов в выходном каталоге вашей сборки.

sencha app build -uses production

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

Поскольку ваши необязательные пакеты не загружаются автоматически при запуске страницы, вам необходимо запустить процесс загрузки вручную. Обычно я делаю это в процессе маршрутизации моих AppController. Вот пример:

Ext.define('MyApp.view.main.MainController', {
    extend: 'Ext.app.ViewController',

    requires: [
        'Ext.Package'
    ],

    routes: {
        'forum': {
            before: 'loadForum',
            action: 'showView'
        }
    },

    loadForum(action) {
        if (Ext.Package.isLoaded('ForumModule')) {
            action.resume();
        } else {
            //Loading mask code here [...]
            Ext.defer(() => {  // it needs some time to show up the loading mask
                Ext.Package.load('ForumModule').then(() => {
                    //Remove loading mask code here [...]
                    action.resume();  //proceed router process; all package files loaded
                });
            }, 500);
        }
    },

    showView() {
        this.getView().add({xclass: 'ForumModule.view.MainView'});
    }
});

Дополнительная информация по этой теме: http://docs.sencha.com/cmd/guides/whats_new_cmd65.html#whats_new_cmd65_-_dynamic_package_loading

person Artem Stepin    schedule 10.06.2017
comment
У меня есть аналогичное требование, когда мне нужно создать несколько файлов js (минимизированные файлы) с помощью sencha CMD 4.2.2. stackoverflow.com/ вопросов/64102523/ Можете ли вы предположить, что это возможно или нет? - person SUJU FE; 29.09.2020