Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

Kumuでの依存解決方法 案1

http://d.hatena.ne.jp/yuki_neko_nyan/20060508/1147074808
に書かれているけどUserScript自身が依存を解決してくれればいい。
そうするとわざわざ使う方は余計になーんて事書かなくていいわけだし。
であれば単純にチェーンすればよいのでは?って話。
user.jsはdependに依存してますよと。

depend.js

depend = {};
depend.add = function(x,y){
  		return x+y;
};

user.js

Kumu.Loader.importLib('depend');

usr = {};
usr.add = depend.add;

そそこーやってuser.js内でdeped.jsをロードしちゃえばいいのよ。

html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>KumuImportTest</title>
<link rel="stylesheet" type="text/css" href="../css/jsUnitStyle.css">
<script language="JavaScript" type="text/javascript" src="../app/jsUnitCore.js"></script>
<script language="JavaScript" type="text/javascript" src="../js/kumu.js"></script>
<script language="JavaScript" type="text/javascript" src="../js/src/import.js"></script>

<script language="JavaScript" type="text/javascript">
Kumu.Loader.importLib('user');
</script>
</head>
<body>

<input type="button" name="test" value="計算" onclick="alert(usr.add(1,2));">
</body>
</html>

depend.add→usr.add→htmlでコールが連鎖している。
また

<script language="JavaScript" type="text/javascript" src="../js/src/depend.js"></script>
<script language="JavaScript" type="text/javascript" src="../js/src/user.js"></script>

なんて一切書いてない。
使用する側はdepend.jsを気にせずusr.addを呼べてます。
うーん、JSANと何がちゃうのかわからん…。

import.js

if (typeof(Kumu.Loader) == 'undefined') {
    Kumu.Loader = {};
};

Kumu.Loader = Kumu.extend(Kumu.Loader, {
    repository:['/teeda-example/js/'],
    
    addRepository : function(o){
        repository.push(o);
    },
    
    importLib : function(lib){
       var axo = new Array(
        "Microsoft.XMLHTTP",
        "Msxml2.XMLHTTP.4.0",
        "Msxml2.XMLHTTP.3.0",
        "Msxml2.XMLHTTP"
      );

	    var loadfile = function (filename){
	    	var xmlHttp = false;
	        /*@cc_on
    		@if (@_jscript_version >= 5)
    		for (var i = 0; !xmlHttp && i < axo.length; i++) {
        		try {
            		xmlHttp = new ActiveXObject(axo[i]);
        		} catch(e) {
        		}
    		}
   	 		@else
        		xmlHttp = false;
    		@end @*/
	    	if (!xmlHttp && typeof XMLHttpRequest != "undefined") {
            	try{
                	// for Firefox, safari
                	xmlHttp = new XMLHttpRequest();
                	//xmlHttp.overrideMimeType("text/xml");
            	} catch(e) {
                	xmlHttp = false;
            	}
        	}
        	
		    xmlHttp.open("GET", filename, false);
		    xmlHttp.send(null);
		    return xmlHttp.responseText;
	    };

	    if(lib){
	        var arry = this.repository;
	        for(var i = 0; i < arry.length; i++){
   		        var libpath = arry[i];
   		        var fullpath = libpath + lib.replace(/\./,"/") + ".js";
    		    eval(loadfile(fullpath));
    		    alert(fullpath);
    		}
	    }
     }
});

うーん、JSANだね、これは。
まさしくJSAN
xmlhttprequestjavascriptをevalしてるだけ。
あとnamespaceを作らないとうまく動かないのでuserscriptに制限がでちゃうってのがちょっと。
一応JSANのEXPORTのように定数アノテーションチックにロードしてもよかったけど1行

Kumu.Loader.importLib('<ライブラリ名>');

だけなのでこれでもいいかなあと。
まーあとはdocument.write版があればドメイン超えできますよって感じですなあ。
JSANを超えるのは結構大変だね。
一応これには応用が聞くのでこれはこれでいいかも。
例えば

Kumu.Container.get('<ユーザライブラリ名>', <設定JSON>);

のようにDIコンテナ風に読み込み時にごにょごにょできたりします。
(設定にはXMLでなくJSON使うのがjavascript流だそうです。)
肝心のごにょごにょって所のニーズがあるかわかりませんが。
うくく。