프로필에 따라 js 의존 모듈 불러오기
아래 프로필에 따라
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']}
]
함수를 쓰다
def getfiles(name)
모name에서 지정한 페이지를 불러옵니다. 불러올 js 파일 목록을 불러옵니다. 의존할 것이 있으면 먼저 불러옵니다.
간단한 해법
이 문제는 보기에는 매우 간단해 보이지만 실제로는 그렇지 않다.
어려운 점은 모듈의 적재 시기에 의존하는 데 있다.만약에 이런 의존 관계가 있다면 A-B&C, B-C, A모듈은 B모듈과 C모듈에 의존한다. 이 동시에 B모듈은 C모듈에 의존한다. C를 두 번 불러올 수 없잖아!
반찬이 제시한 이 해법은 단지 하나의 사고방식일 뿐이다. 이보다 더 좋은 알고리즘이 있을 것이다. 반찬은 두 갈래 나무 같은 알고리즘으로 해결할 수 있다고 생각하지만 반찬은 그럴 수 없다.
이 알고리즘은 순환 의존의 상황을 고려하지 않았다.
코드는 다음과 같습니다.
/**
*
* @type {Function}
*/
var loadModule = (function(){
/**
*
* @type {{chainHead: {}, chainCurrent: {}, srcCache: {}, main: main, load: load, findModule: findModule}}
*/
var logics = {
chainHead: {}, //
chainCurrent: {}, //
srcCache: {}, //module src
/**
*
* @param modules
* @param name
* @returns {Array} ,
*/
main: function(modules, name){
var nameArray = [], //
srcArray = [], //
nameStr = "", //
repeatRegex = /(^| )([\w]+ ).*\2/, //
i = 0;
//
this.load(modules, name)
//
this.chainCurrent = this.chainHead;
while(this.chainCurrent.next){
nameArray.push(this.chainCurrent.name);
this.chainCurrent = this.chainCurrent.next;
}
nameStr = nameArray.join(" ") + " "; // ,
//
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)); //
//
nameArray = nameStr.split(" ");
for(i = 0; i < nameArray.length; i++){
srcArray.push(this.srcCache[nameArray[i]]);
}
return srcArray;
},
/**
*
* @param modules
* @param name
*/
load: function(modules, name){
var node = {},
module = this.findModule.call(modules, "name", name),
i = 0;
//
if(!module){
throw Error(" " + 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 value
* @returns {*}
*/
findModule: function(name, value){
var array = this,
item = {},
i = 0;
//
for(i = 0; i < array.length; i++){
item = array[i];
//
if(item && item[name] === value){
return item;
}
}
// null
return null;
}
};
//
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"));
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.