Как автоматически упорядочить скрипты, используемые пользовательскими компонентами Facelets?

#javascript #include #facelets #serverside-javascript

#javascript #включить #facelets #серверная часть-javascript

Вопрос:

Например, я создал несколько пользовательских компонентов пользовательского интерфейса, некоторые зависят от jquery-min.js , некоторые зависят от jQuery UI , некоторые зависят от jsTree , некоторые зависят от Dojo и т.д.

Я могу импортировать необходимые библиотеки в каждый файл xhtml:

 file1.xhtml
<script src="jquery-min.js"></script>
<script src="jquery-ui.js"></script>
<script src="jsTree.js"></script>
<my:tree> ... </my:tree>

file2.xhtml
<script src="jquery-min.js"></script>
<script src="jquery-ui.js"></script>
<script src="jquery-ui-dialog.js"></script>
<script src="jquery-ui-autocompletion.js"></script>
<my:autodialog> ... </my:autodialog>

file3.xhtml
<script src="jquery-min.js"></script>
<script src="dojo.js"></script>
<my:dojostuff> ... </my:dojostuff>
  

Это очень неудобно, я должен знать, какой компонент зависит от какой библиотеки, и зависимости зависимостей.

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

Итак, есть ли что-то вроде «UIAutoOrganizedScriptsComponent»?

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

 static ThreadLocal<HashSet> requestScopedDependencies;
static Map<String, URL> libraryURLs;

MyTreeComponent extends UIOutput {
    // ...
    dependencies = requestScopeDependencies.get();
    dependencies.add("jstree");
}
  

Или, может быть, мне следует выполнить поиск в компоненте DOM, чтобы узнать, куда я могу внедрить <script>? вот так:

 MyTreeComponent extends UIOutput {
    // ...
    UIComponent scriptsContainer = getParent().getParent().getChildren()[2].getChildren()[3];

    // search if scriptsContainer already included the script...
    if (! included) {
        scriptsContainer.addElement("<script>...");
    }
}
  

Ну, очень неуклюже. Есть ли какое-нибудь элегантное решение для этого?

Ответ №1:

Похоже, вам нужно что-то вроде RequireJS для динамической загрузки зависимостей на страницу.