Требовать:
В соответствии с файлом конфигурации ниже
Кода -копия выглядит следующим образом:
модуль = [
{'name': 'jquery', 'src': '/js/lib/jquery-1.8.3.js'},
{'name': 'swfobject', 'src': '/js/utils/swfobject.js'},
{'name': 'fancybox', 'src': '/js/jquery/jquery.fancybox.js', 'require': ['jquery']},
{'name': 'uploadify', 'src': '/js/utils/uploadify.js', 'require': ['swfobject']},
{'name': 'jqform', 'src': '/js/jquery/jquery.form.js', 'require': ['jquery']},
{'name': 'register', 'src': '/js/page/reg.js', 'require': ['jqform']},
{'name': 'login', 'src': '/js/page/login.js', 'require': ['fancybox', 'jqform']},
{'name': 'upload', 'src': '/js/page/upload.js', 'require': ['fancybox', 'jqform', 'uploadify']}
]
Напишите функцию
def GetFiles (имя)
Вернитесь на страницу, указанную определенным именем, список файлов JS для загрузки, и сначала должны быть загружены те, которые с зависимостями
Боковые блюда раствор
Этот вопрос кажется простым на первый взгляд, но это не так.
Сложность заключается в сроках нагрузки модуля зависимости. Если есть такая зависимость: AB & C, BC, модуль A зависит от модуля B и модуля C, а модуль B зависит от модуля C, вы не можете загрузить C дважды!
Решение, данное Xiaocai, является просто идеей, и должен быть лучший алгоритм, чем этот. Xiaocai считает, что его можно решить с помощью алгоритмов, таких как бинарные деревья, но Xiaocai не знает, как это сделать ~~~
Этот алгоритм не учитывает сценарии круговой зависимости.
Код заключается в следующем:
Кода -копия выглядит следующим образом:
/**
* Кругковые зависимости не рассматриваются
* @type {function}
*/
var LoadModule = (function () {
/**
* Инкапсуляция бизнес -логики
* @type {{chainhead: {}, chaincurrent: {}, srccache: {}, main: main, load: load, findmodule: findmodule}}
*/
var logics = {
Chainhead: {}, // заголовок списка ссылок
CheanCurrent: {}, // текущий узел связанного списка
srccache: {}, // модуль src cache
/**
* Внешний интерфейс
* @param модули объект конфигурации
* @param name Имя модуля
* @returns {Array} Список модулей зависимости, отсортированный в порядке загрузки
*/
Main: function (модули, имя) {
var namearray = [], // Список имен модуля
srcarray = [], // Список модулей зависимости
namestr = "", // Набор имени модуля строка
repeatregex =/(^|) ([/w]+).*/2/, // имя модуля дедупликация регулярно
i = 0;
// грубая нагрузка все модули зависимости
this.load (модули, имя)
// создание имени модуля набор строки
this.chaincurrent = this.chainhead;
while (this.chaincurrent.next) {
namearray.push (this.chaincurrent.name);
this.chaincurrent = this.chaincurrent.next;
}
namest = namearray.join ("") + ""; // единые стандарты, заполните пространство в конце
// зависеть от модуля для дедупликации
while (repreategex.exec (namest)) {
namestr = namest.replace (RepaTregex, функция (G0, G1, G2) {
вернуть g0.substring (0, (g0.length - g2.length));
});
}
namest = namest.substring (0, (namest.length - 1)); // Удалить дополнительные дополнительные места
// конвертировать имя модуля зависимости в путь модуля
namearray = namest.split ("");
for (i = 0; i <namearray.length; i ++) {
srcarray.push (this.srccache [namearray [i]]);
}
вернуть Srcarray;
},
/**
* Модуль рекурсивной загрузки
* @param модули объект конфигурации
* @param name Имя модуля
*/
загрузка: функция (модули, имя) {
var node = {},
module = this.findmodule.call (модули, "имя", имя),
i = 0;
// судить, существует ли модуль
if (! Модуль) {
ошибка бросает («зависит от модуля» + name + «не найдено»);
}
// Список ссылок на зависимость модуля модуля
node.name = name;
// node.src = module.src;
this.srccache [name] = module.src;
node.next = this.chainhead;
this.chainhead = node;
// рекурсивная зависимость
if (module.require && module.require.length) {
for (i = 0; i <module.require.length; i ++) {
this.load (modules, module.require [i]);
}
}
},
/**
* Найти модули на основе указанных имен атрибутов и значений атрибутов
* @param name Имя атрибута
* @param значения значения атрибута
* @returns {*}
*/
findModule: function (name, value) {
var array = это,
item = {},
i = 0;
// передача модуля
for (i = 0; i <array.length; i ++) {
item = array [i];
// Получить указанный модуль
if (item && item [name] === value) {
вернуть элемент;
}
}
// возврат нулевой
вернуть ноль;
}
};
// обнажают внешний интерфейс
return function () {
return logics.main.apply (логика, аргументы);
};
} ());
/**
* Проверьте использование
* @тип {*[]}
*/
var modules = [
{'name': 'jquery', 'src': '/js/lib/jquery-1.8.3.js'},
{'name': 'swfobject', 'src': '/js/utils/swfobject.js'},
{'name': 'fancybox', 'src': '/js/jquery/jquery.fancybox.js', 'require': ['jquery']},
{'name': 'uploadify', 'src': '/js/utils/uploadify.js', 'require': ['swfobject']},
{'name': 'jqform', 'src': '/js/jquery/jquery.form.js', 'require': ['jquery']},
{'name': 'register', 'src': '/js/page/reg.js', 'require': ['jqform']},
{'name': 'login', 'src': '/js/page/login.js', 'require': ['fancybox', 'jqform']},
{'name': 'upload', 'src': '/js/page/upload.js', 'require': ['fancybox', 'jqform', 'login', 'uploadify']}
];
console.log (LoadModule (модули, "загрузка"));