必要とする:
以下の構成ファイルに従って
コードコピーは次のとおりです。
モジュール= [
{'name': 'jquery'、 'src': '/js/lib/jquery-1.8.3.js}、
{'name': 'swfobject'、 'src': '/js/utils/swfobject.js}、
{'name': 'fancebox'、 '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':['fancebox'、 'jqform']}、
{'name': 'upload'、 'src': '/js/page/upload.js'、 'require':['fancebox'、 'jqform'、 'uploadify']}
]
関数を書きます
def getFiles(名前)
特定の名前で指定されたページ、ロードされるJSファイルのリスト、および依存関係のあるページに戻り、最初にロードする必要があります
サイドディッシュソリューション
この質問は一見単純に思えますが、そうではありません。
難易度は、依存関係モジュールの読み込みタイミングにあります。このような依存関係がある場合:AB&C、BC、モジュールAはモジュールBとモジュールCに依存し、モジュールBがモジュールCに依存する場合、Cを2回ロードすることはできません!
Xiaocaiによって与えられるソリューションは単なるアイデアであり、これよりも良いアルゴリズムがあるに違いありません。 Xiaocaiは、バイナリツリーなどのアルゴリズムを使用して解決できると考えていますが、Xiaocaiはそれを行う方法を知りません~~~
このアルゴリズムでは、循環依存性シナリオを考慮しません。
コードは次のとおりです。
コードコピーは次のとおりです。
/**
*循環依存関係は考慮されません
* @type {function}
*/
var loadmodule =(function(){
/**
*ビジネスロジックカプセル化
* @Type {{Chainhead:{}、ChainCurrent:{}、srccache:{}、main:main、load:load、findmodule}}}
*/
var Logics = {
チェーンヘッド:{}、//リンクリストヘッダー
ChainCurrent:{}、//リンクリストの現在のノード
srccache:{}、//モジュールsrcキャッシュ
/**
*外部インターフェイス
* @paramモジュール構成オブジェクト
* @param名モジュール名
* @returns {array}依存関係モジュールリスト、ロードの順にソートされました
*/
メイン:function(modules、name){
var namearray = []、//モジュール名リスト
srcarray = []、//依存関係モジュールリスト
namestr = ""、//モジュール名文字列セット
Repeatregex =/(^|)([/w]+)。*/2/、//モジュール名deduplicationレギュラー
i = 0;
//すべての依存性モジュールを粗にロードします
this.load(モジュール、名前)
//モジュール名文字列セットの構築
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){
returg.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]]);
}
srcarrayを返します。
}、
/**
*再帰的にロードモジュール
* @paramモジュール構成オブジェクト
* @param名モジュール名
*/
load:function(modules、name){
var node = {}、
モジュール= this.findmodule.call(modules、 "name"、name)、
i = 0;
//モジュールが存在するかどうかを判断します
if(!module){
スローエラー( "モジュールに依存" + name + "not not ingod");
}
//モジュール依存関係リンクリストの構築
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(module、module.require [i]);
}
}
}、
/**
*指定された属性名と属性値に基づいてモジュールを見つける
* @param名属性名
* @param値属性値
* @returns {*}
*/
FindModule:function(name、value){
var array =これ、
item = {}、
i = 0;
//モジュールを転送します
for(i = 0; i <array.length; i ++){
item = array [i];
//指定されたモジュールを取得します
if(item && item [name] === value){
返品アイテム。
}
}
// nullが見つかりません
nullを返します。
}
};
//外部インターフェイスを公開します
return function(){
Return Logics.main.Apply(Logics、arguments);
};
}());
/**
* usecaseをテストします
* @タイプ {*[]}
*/
varモジュール= [
{'name': 'jquery'、 'src': '/js/lib/jquery-1.8.3.js}、
{'name': 'swfobject'、 'src': '/js/utils/swfobject.js}、
{'name': 'fancebox'、 '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':['fancebox'、 'jqform']}、
{'name': 'upload'、 'src': '/js/page/upload.js'、 'require':['fancebox'、 'jqform'、 'login'、 'uploadify']}
];
console.log(loadmodule(modules、 "upload"));