Load the js dependency module according to the configuration file, and configure the file js dependency

Source: Internet
Author: User

Load the js dependency module according to the configuration file, and configure the file js dependency

Requirements:

According to the following configuration file
Copy codeThe Code is as follows:
Module = [
{'Name': 'jquery ', 'src':'/js/lib/jquery-1.8.3.js '},
{'Name': 'swfobobject', 'src': '/js/utils/swfobject. js '},
{'Name': 'fancybox', 'src': '/js/jquery. fancybox. js', 'require': ['jquery ']},
{'Name': 'uploadify ', 'src':'/js/utils/uploadify. js', 'require ': ['swfobobject']},
{'Name': 'jqform', 'src': '/js/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)

Returns the list of js files to be loaded for loading the page specified by a name. If there is a dependency, load the page first.

Food Solution

This rough question looks very simple, but it is actually not.

The difficulty lies in the loading time of dependent modules. If there is such dependency: A-B & C, B-C, A module depends on B module and C Module, at the same time B module and dependent on C module, the total cannot let C load twice!

This solution provided by the side dish is just a thought. There must be better algorithms than this. The side dish thinks it can be solved using algorithms such as binary trees, but the side dish doesn't ~~~

This algorithm does not consider loop dependencies.

The Code is as follows:

Copy codeThe Code is as follows:
/**
* Do not consider circular dependency
* @ Type {Function}
*/
Var loadModule = (function (){
/**
* Business logic Encapsulation
* @ Type {chainHead :{}, chainCurrent :{}, srcCache :{}, main: main, load: load, findModule: findModule }}
*/
Var logics = {
ChainHead :{}, // linked list Header
ChainCurrent: {}, // current node of the linked list
SrcCache: {}, // module src Cache
/**
* External interface
* @ Param modules configuration object
* @ Param name: Module name
* @ Returns {Array} List of dependent modules, sorted by Loading Order
*/
Main: function (modules, name ){
Var nameArray = [], // list of module names
SrcArray = [], // list of dependent modules
NameStr = "", // Module name string set
RepeatRegex =/(^ |) ([\ w] +). * \ 2/, // The Module name deduplication regular
I = 0;
// Roughly load all dependent modules
This. load (modules, name)
// Construct the 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 standard. Add a space at the end.
// Dependency module deduplication
While(repeatRegex.exe c (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 unnecessary Spaces
// Convert the dependency Module name to the module path
NameArray = nameStr. split ("");
For (I = 0; I <nameArray. length; I ++ ){
SrcArray. push (this. srcCache [nameArray [I]);
}
Return srcArray;
},
/**
* Recursive 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;
// Determine whether a module exists
If (! Module ){
Throw Error ("dependency module" + name + "not found ");
}
// Construct the module dependency linked 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 a module based on the specified attribute name and attribute value
* @ Param name: attribute name
* @ Param value Attribute value
* @ Returns {*}
*/
FindModule: function (name, value ){
Var array = this,
Item = {},
I = 0;
// Traverse the module
For (I = 0; I <array. length; I ++ ){
Item = array [I];
// Obtain the specified Module
If (item & item [name] === value ){
Return item;
}
}
// If no value is found, null is returned.
Return null;
}
};
// Expose External Interfaces
Return function (){
Return logics. main. apply (logics, arguments );
};
}());
/**
* Test Usecase
* @ Type {* []}
*/
Var modules = [
{'Name': 'jquery ', 'src':'/js/lib/jquery-1.8.3.js '},
{'Name': 'swfobobject', 'src': '/js/utils/swfobject. js '},
{'Name': 'fancybox', 'src': '/js/jquery. fancybox. js', 'require': ['jquery ']},
{'Name': 'uploadify ', 'src':'/js/utils/uploadify. js', 'require ': ['swfobobject']},
{'Name': 'jqform', 'src': '/js/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 "));

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.