يتطلب:
وفقا لملف التكوين أدناه
نسخة الكود كما يلي:
الوحدة = [
{'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': 'Record' ، 'SRC': '/JS/page/reg.js' ، 'require': ['jqform']} ،
{'name': 'login' ، 'src': '/js/page/login.js' ، 'require': ['fancybox' ، 'jqform']} ،
{'name': 'Upload' ، 'SRC': '/JS/page/epload.js' ، 'require': ['Fancybox' ، 'JQform' ، 'Uploadify']}
]
اكتب وظيفة
def getFiles (الاسم)
ارجع إلى الصفحة المحددة باسم معين ، وقائمة ملفات JS المراد تحميلها ، ويجب أولاً تحميل تلك التي لديها تبعيات
محلول الأطباق الجانبية
يبدو هذا السؤال بسيطًا للوهلة الأولى ، لكنه ليس كذلك.
تكمن الصعوبة في توقيت تحميل وحدة التبعية. إذا كان هناك مثل هذا الاعتماد: يعتمد AB&C و BC و MODULE A على الوحدة B والوحدة C ، والوحدة B تعتمد على الوحدة C ، لا يمكنك تحميل C مرتين!
الحل الذي قدمه Xiaocai مجرد فكرة ، ويجب أن يكون هناك خوارزمية أفضل من هذا. يعتقد Xiaocai أنه يمكن حلها باستخدام خوارزميات مثل الأشجار الثنائية ، لكن Xiaocai لا يعرف كيفية القيام بذلك ~~~
لا تعتبر هذه الخوارزمية سيناريوهات التبعية الدائرية.
الرمز كما يلي:
نسخة الكود كما يلي:
/**
* لا يتم النظر في أي تبعيات دائرية
* type {function}
*/
var loadmodule = (function () {
/**
* تغليف منطق الأعمال
* type {{chainhead: {} ، chaincurrent: {} ، srccache: {} ، main: main ، load: findModule: findModule}}
*/
VAR LAGICS = {
Chainhead: {} ، // Link List header
chaincurrent: {} ، // العقدة الحالية للقائمة المرتبطة
srccache: {} ، // module src cache
/**
* واجهة خارجية
* كائن تكوين الوحدات النمطية param
* اسم الوحدة النمطية اسم param
* @returns {array} قائمة وحدة التبعية ، مرتبة بترتيب التحميل
*/
الرئيسي: الوظيفة (الوحدات النمطية ، الاسم) {
var namearray = [] ، // قائمة اسم الوحدة النمطية
srcarray = [] ، // قائمة وحدة التبعية
namestr = "" ، // module name set set set
Repeatregex =/(^|) ([/w]+).*/2/، // اسم الوحدة النمطية العادية
أنا = 0 ؛
// الحمل الخشن جميع وحدات التبعية
this.load (الوحدات ، الاسم)
// إنشاء سلسلة اسم الوحدة النمطية
this.chaincurrent = this.chainhead ؛
بينما (this.chaincurrent.next) {
namearray.push (this.chaincurrent.name) ؛
this.chaincurrent = this.chaincurrent.next ؛
}
namestr = namearray.join ("") + "" ؛ // معايير موحدة ، املأ مساحة في النهاية
// تعتمد على الوحدة النمطية لتكريس
بينما (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 ("") ؛
لـ (i = 0 ؛ i <namearray.length ؛ i ++) {
srcarray.push (this.srccache [namearray [i]]) ؛
}
إرجاع Srcarray ؛
} ،
/**
* وحدة التحميل بشكل متكرر
* كائن تكوين الوحدات النمطية param
* اسم الوحدة النمطية اسم param
*/
تحميل: وظيفة (الوحدات ، الاسم) {
var node = {} ،
الوحدة النمطية = this.findmodule.call (الوحدات النمطية ، "الاسم" ، الاسم) ،
أنا = 0 ؛
// احكم على ما إذا كانت الوحدة موجودة
إذا (! الوحدة) {
رمي خطأ ("تعتمد على الوحدة النمطية" + name + "غير موجود") ؛
}
// إنشاء قائمة ارتباط تبعية الوحدة النمطية
node.name = name ؛
// node.src = module.src ؛
this.srccache [name] = module.src ؛
node.next = this.chainhead ؛
this.chainhead = العقدة ؛
// التبعية العودية
if (module.require && module.require.length) {
لـ (i = 0 ؛ i <module.require.length ؛ i ++) {
this.load (الوحدات النمطية ، module.require [i]) ؛
}
}
} ،
/**
* ابحث عن وحدات بناءً على أسماء السمات المحددة وقيم السمات
* اسم السمة اسم param
* قيمة سمة القيمة param
* returns {*}
*/
FindModule: Function (name ، value) {
var array = هذا ،
العنصر = {} ،
أنا = 0 ؛
// وحدة النقل
لـ (i = 0 ؛ i <array.length ؛ i ++) {
عنصر = صفيف [i] ؛
// احصل على الوحدة المحددة
if (item && item [name] === value) {
عنصر الإرجاع ؛
}
}
// لا يمكن العثور على NULL
العودة لاغية.
}
} ؛
// فضح الواجهة الخارجية
وظيفة الإرجاع () {
return logics.main.apply (المنطق ، الحجج) ؛
} ؛
} ()) ؛
/**
* اختبار usecase
* @يكتب {*[]}
*/
وحدات 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' ، 'require': ['jQuery']} ،
{'name': 'Uploadify' ، 'SRC': '/JS/UTILS/Uploadify.js' ، 'require': ['swfobject']} ،
{'name': 'jqform' ، 'src': '/js/jquery/jquery.form.js' ، 'require': ['jQuery']} ،
{'name': 'Record' ، 'SRC': '/JS/page/reg.js' ، 'require': ['jqform']} ،
{'name': 'login' ، 'src': '/js/page/login.js' ، 'require': ['fancybox' ، 'jqform']} ،
{'name': 'Upload' ، 'SRC': '/JS/page/epload.js' ، 'require': ['Fancybox' ، 'JQform' ، 'Login' ، 'Uploadify']}
] ؛
console.log (loadModule (الوحدات النمطية ، "التحميل")) ؛