Memerlukan:
Menurut file konfigurasi di bawah ini
Salinan kode adalah sebagai berikut:
modul = [
{'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', 'membutuhkan': ['jQuery']},
{'name': 'unggah', 'src': '/js/utils/unggahan.js', 'membutuhkan': ['swfobject']},
{'name': 'jqform', 'src': '/js/jQuery/jQuery.Form.js', 'membutuhkan': ['jQuery']},
{'name': 'register', 'src': '/js/page/reg.js', 'membutuhkan': ['jqform']},
{'name': 'Login', 'src': '/js/page/login.js', 'membutuhkan': ['fancybox', 'jqform']},
{'name': 'unggah', 'src': '/js/page/unggah.
]
Tulis fungsi
def getFiles (nama)
Kembali ke halaman yang ditentukan oleh nama tertentu, daftar file JS yang akan dimuat, dan yang dengan dependensi harus dimuat terlebih dahulu
Solusi lauk
Pertanyaan ini tampaknya sederhana pada pandangan pertama, tetapi tidak.
Kesulitannya terletak pada waktu pemuatan modul ketergantungan. Jika ada ketergantungan seperti itu: AB&C, BC, modul A tergantung pada Modul B dan Modul C, dan Modul B tergantung pada Modul C, Anda tidak bisa mendapatkan C dimuat dua kali!
Solusi yang diberikan oleh Xiaocai hanyalah sebuah ide, dan harus ada algoritma yang lebih baik dari ini. Xiaocai berpikir itu dapat diselesaikan dengan menggunakan algoritma seperti pohon biner, tetapi Xiaocai tidak tahu bagaimana melakukannya ~~~
Algoritma ini tidak mempertimbangkan skenario ketergantungan melingkar.
Kodenya adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
/**
* Tidak ada dependensi melingkar yang dipertimbangkan
* @type {function}
*/
var loadModule = (function () {
/**
* Enkapsulasi Logika Bisnis
* @type {{chainhead: {}, chaincurrent: {}, srccache: {}, main: main, muat: load, findModule: findModule}}
*/
VAR LOGICS = {
Chainhead: {}, // tautan tautan header
ChainCurrent: {}, // Node saat ini dari daftar yang ditautkan
srccache: {}, // modul src cache
/**
* Antarmuka eksternal
* Objek konfigurasi modul @param
* @param nama modul nama
* @returns {array} Daftar modul dependensi, diurutkan dalam urutan pemuatan
*/
utama: fungsi (modul, nama) {
var nameArray = [], // Daftar Nama Modul
SRCArray = [], // Daftar Modul Ketergantungan
namestr = "", // Modul Name String Set
REPEARTEGEX =/(^|) ([/w]+).*/2/, // Modul Nama Deduplikasi Reguler
i = 0;
// beban kasar semua modul ketergantungan
this.load (modul, nama)
// Membangun Modul Nama String Set
this.chainCurrent = this.chainhead;
while (this.chaincurrent.next) {
namearray.push (this.chaincurrent.name);
this.chainCurrent = this.chaincurrent.next;
}
namestr = nameArray.join ("") + ""; // standar terpadu, isi ruang di akhir
// bergantung pada modul untuk deduplikat
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)); // Lepaskan ruang tambahan tambahan
// Konversi nama modul dependensi ke jalur modul
nameArray = namestr.split ("");
untuk (i = 0; i <nameArray.length; i ++) {
srcarray.push (this.srccache [nameArray [i]]);
}
return srcarray;
},
/**
* Modul Memuat Rekursif
* Objek konfigurasi modul @param
* @param nama modul nama
*/
Load: function (modul, nama) {
var node = {},
modul = this.findmodule.call (modul, "name", name),
i = 0;
// menilai apakah modul itu ada
if (! Module) {
Throw Error ("Bergantung pada Modul" + Nama + "Tidak Ditemukan");
}
// Membangun Daftar Tautan Ketergantungan Modul
node.name = name;
// node.src = module.src;
this.srccache [name] = module.src;
node.next = this.chainhead;
this.chainhead = node;
// ketergantungan rekursif
if (module.require && module.require.length) {
untuk (i = 0; i <module.require.length; i ++) {
this.load (modul, module.require [i]);
}
}
},
/**
* Temukan modul berdasarkan nama atribut yang ditentukan dan nilai atribut
* Nama atribut nama @param
* nilai atribut nilai @param
* @returns {*}
*/
findModule: function (name, value) {
var array = ini,
item = {},
i = 0;
// Modul transfer
untuk (i = 0; i <array.length; i ++) {
item = array [i];
// Dapatkan modul yang ditentukan
if (item && item [name] === nilai) {
item pengembalian;
}
}
// return null tidak dapat ditemukan
kembali nol;
}
};
// Ekspos antarmuka eksternal
return function () {
return logics.main.apply (logika, argumen);
};
} ());
/**
* Uji Usecase
* @jenis {*[]}
*/
Modul var = [
{'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', 'membutuhkan': ['jQuery']},
{'name': 'unggah', 'src': '/js/utils/unggahan.js', 'membutuhkan': ['swfobject']},
{'name': 'jqform', 'src': '/js/jQuery/jQuery.Form.js', 'membutuhkan': ['jQuery']},
{'name': 'register', 'src': '/js/page/reg.js', 'membutuhkan': ['jqform']},
{'name': 'Login', 'src': '/js/page/login.js', 'membutuhkan': ['fancybox', 'jqform']},
{'name': 'unggah', 'src': '/js/page/unggah.
];
console.log (loadModule (modul, "unggah"));