Require:
According to the configuration file below
The code copy is as follows:
module=[
{'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']}
]
Write a function
def getfiles(name)
Return to the page specified by a certain name, the list of js files to be loaded, and those with dependencies must first be loaded
Side dishes solution
This question seems simple at first glance, but it is not.
The difficulty lies in the loading timing of the dependency module. If there is such a dependency: AB&C, BC, module A depends on module B and module C, and module B depends on module C, you can't get C loaded twice!
The solution given by Xiaocai is just an idea, and there must be a better algorithm than this. Xiaocai thinks it can be solved using algorithms such as binary trees, but Xiaocai doesn't know how to do it~~~
This algorithm does not consider circular dependency scenarios.
The code is as follows:
The code copy is as follows:
/**
* No circular dependencies are considered
* @type {Function}
*/
var loadModule = (function(){
/**
* Business logic encapsulation
* @type {{chainHead: {}, chainCurrent: {}, srcCache: {}, main: main, load: load, findModule: findModule}}
*/
var logics = {
chainHead: {}, //Link list header
chainCurrent: {}, //The current node of the linked list
srcCache: {}, //module src cache
/**
* External interface
* @param modules configuration object
* @param name module name
* @returns {Array} Dependency module list, sorted in order of loading
*/
main: function(modules, name){
var nameArray = [], //Module name list
srcArray = [], //Dependency module list
nameStr = "", //Module name string set
repeatRegex = /(^| )([/w]+ ).*/2/, //Module name deduplication regular
i = 0;
//Coarse load all dependency modules
this.load(modules, name)
//Constructing module name string set
this.chainCurrent = this.chainHead;
while(this.chainCurrent.next){
nameArray.push(this.chainCurrent.name);
this.chainCurrent = this.chainCurrent.next;
}
nameStr = nameArray.join(" ") + " "; //Unified standards, fill in a space at the end
//Depend on module to deduplicate
while(repeatRegex.exec(nameStr)){
nameStr = nameStr.replace(repeatRegex, function(g0, g1, g2){
return g0.substring(0, (g0.length - g2.length));
});
}
nameStr = nameStr.substring(0, (nameStr.length - 1)); //Remove additional extra spaces
//Convert the dependency module name to module path
nameArray = nameStr.split(" ");
for(i = 0; i < nameArray.length; i++){
srcArray.push(this.srcCache[nameArray[i]]);
}
return srcArray;
},
/**
* Recursively loading module
* @param modules configuration object
* @param name module name
*/
load: function(modules, name){
var node = {},
module = this.findModule.call(modules, "name", name),
i = 0;
//Judge whether the module exists
if(!module){
throw Error("Depend on module" + name + "Not Found");
}
//Constructing module dependency link list
node.name = name;
// node.src = module.src;
this.srcCache[name] = module.src;
node.next = this.chainHead;
this.chainHead = node;
//Recursive dependency
if(module.require && module.require.length){
for(i = 0;i < module.require.length; i++){
this.load(modules, module.require[i]);
}
}
},
/**
* Find modules based on specified attribute names and attribute values
* @param name attribute name
* @param value attribute value
* @returns {*}
*/
findModule: function(name, value){
var array = this,
item = {},
i = 0;
//Transfer module
for(i = 0; i < array.length; i++){
item = array[i];
//Get the specified module
if(item && item[name] === value){
return item;
}
}
//Return null cannot be found
return null;
}
};
//Expose external interface
return function(){
return logics.main.apply(logics, arguments);
};
}());
/**
* Test Usecase
* @type {*[]}
*/
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(modules, "upload"));