필요하다:
아래 구성 파일에 따르면
코드 사본은 다음과 같습니다.
모듈 = [
{ 'name': 'jquery', 'src': '/js/lib/jquery-1.8.3s'},
{ 'name': 'swfobject', 'src': '/js/utils/swfobject.js'},
{ 'name': 'fancybox', 'src': '/js/jquery/jquery.fancybox.js', 'require': [ 'jQuery']},
{ 'name': 'uplodify', 'src': '/js/utils/uploadify.js', 'dreire': [ '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', 'dreire': [ 'fancybox', 'jqform']},
{ 'name': 'upload', 'src': '/js/page/upload.js', 'dreire': [ '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 : main, load : load, findmodule : findModule}}
*/
var logics = {
체인 헤드 : {}, // 링크 목록 헤더
Chaincurrent : {}, // 링크 된 목록의 현재 노드
srccache : {}, // 모듈 SRC 캐시
/**
* 외부 인터페이스
* @param 모듈 구성 객체
* @param 이름 모듈 이름
* @returns {array} 종속성 모듈 목록, 로딩 순서대로 정렬
*/
메인 : 함수 (모듈, 이름) {
var namearray = [], // 모듈 이름 목록
srcarray = [], // 종속성 모듈 목록
namest = "", // 모듈 이름 문자열 세트
Repeatregex =/(^|) ([/w]+).*/2/, // module nextuplication 정기
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 (repeatregex.exec (namest)) {
namest = namest.replace (repeatregex, function (g0, g1, g2) {
return 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 이름 모듈 이름
*/
로드 : 함수 (모듈, 이름) {
var 노드 = {},
module = this.findModule.call (모듈, "이름", 이름),
i = 0;
// 모듈이 존재하는지 판단합니다
if (! module) {
던지기 오류 ( "모듈" + 이름 + "찾기 없음");
}
// 모듈 종속성 구성 링크 목록
node.name = 이름;
// node.src = module.src;
this.srccache [name] = module.src;
node.next = this.chainhead;
this.chainhead = 노드;
// 재귀 종속성
if (module.require && module.require.length) {
for (i = 0; i <module.require.length; i ++) {
this.load (modules, module.require [i]);
}
}
},
/**
* 지정된 속성 이름 및 속성 값을 기반으로 모듈 찾기
* @param 이름 속성 이름
* @param 값 속성 값
* @returns {*}
*/
findModule : 함수 (이름, 값) {
var array = this,
항목 = {},
i = 0;
// 전송 모듈
for (i = 0; i <array.length; i ++) {
항목 = 배열 [i];
// 지정된 모듈을 가져옵니다
if (item && item [name] === value) {
반품 항목;
}
}
// return null을 찾을 수 없습니다
널 리턴;
}
};
// 외부 인터페이스를 노출시킵니다
return function () {
return logics.main.apply (논리, 인수);
};
} ());
/**
* usecase를 테스트하십시오
* @유형 {*[]}
*/
var 모듈 = [
{ 'name': 'jquery', 'src': '/js/lib/jquery-1.8.3s'},
{ 'name': 'swfobject', 'src': '/js/utils/swfobject.js'},
{ 'name': 'fancybox', 'src': '/js/jquery/jquery.fancybox.js', 'require': [ 'jQuery']},
{ 'name': 'uplodify', 'src': '/js/utils/uploadify.js', 'dreire': [ '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', 'dreire': [ 'fancybox', 'jqform']},
{ 'name': 'upload', 'src': '/js/page/upload.js', 'dreire': [ 'fancybox', 'jqform', 'login', 'uploadify']}
];
console.log (loadModule (모듈, "업로드");