今日の午後ずっと書いた新鮮なもの
boot.js がコア ファイルの圧縮
パッケージ
である例では
test.html は
ad.js のすべての js ファイルを参照しており、次のような関係があります。
ad.js->ae.js
ad.js->abc.js
ae.js->abc.js
xnamespace は、js ファイルの同期ロードを実装します。js ファイルが仕様に従って記述されている限り、using_xnamespace を使用して、依存するライブラリがその前にロードされるようにすることができます。
js ファイルに対する xnamespace の唯一の要件は、ファイルが名前のない関数クロージャー (function(){ })() で囲まれている必要があることです。xnamespace が使用されない場合でも、これは多くの高品質コードでも行われています。テスト済みブラウザ IE6 IE7 FF NetScape Safari
テストに失敗したブラウザ Opera Swift の
boot.js の内容です。
[コピー]コード:
(function(){
var X={};
window.using_xnamespace=using_xnamespace;
window.regist_xnamespace=regist_xnamespace;
window.check_xnamespace=window.get_xnamespace=check_xnamespace;
window.import_xnamespace=import_xnamespace;
window.export_xnamespace=export_xnamespace;
var isIE=(window.navigator.appName=="Microsoft Internet Explorer");
function getFilePath(namespace)// 名前空間に基づいてファイル パスをプライベートに取得します。
{
namespace=namespace.split(".");
var file_path=X.file_path;
変数i=0;
while((ファイルパスの種類)=="オブジェクト")
{
file_path=file_path[名前空間[i++]];
}
戻り値 (ファイルパス);
}
function check_xnamespace(namespace)//ネームスペースが存在するかどうかを確認し、存在する場合はネームスペースを取得します
{
namespace=namespace.split(".");
var xnamespace=X;
変数i=0;
while(i<名前空間.長さ)
{
if(!xnamespace[namespace[i]])return;
xnamespace=xnamespace[名前空間[i++]];
}
xnamespace を返します。
}
function regist_xnamespace(namespace)//ネームスペースを登録
{
namespace=namespace.split(".");
var xnamespace=X;
変数i=0;
while(i<名前空間.長さ)
{
if(!(xnamespace[namespace[i]]))xnamespace[namespace[i]]={};
//if(typeof xnamespace[namespace[i]]!="object")throw "名前の競合";
xnamespace=xnamespace[名前空間[i++]];
}
xnamespace を返します。
}
function using_xnamespace(namespace)//ネームスペースを確認してロードします
{
//alert();
if(check_xnamespace(namespace))return;
var file_path=getFilePath(名前空間);
//アラート(ファイルパス);
var scriptElement=document.createElement("スクリプト");
scriptElement.src=ファイルパス;
if(isIE)
{
scriptElement.document;
}
それ以外
{
//alert(document.getElementsByTagName("head")[0]);
scriptElement.onload=関数()
{
X.library_queue.run();
}
document.getElementsByTagName("head")[0].appendChild(scriptElement);
if(X.library_queue.push(arguments.callee.caller))
「ライブラリがロードされていません」をスローします。
}
}
関数 import_xnamespace(名前空間)
{
var xnamespace=get_xnamespace(名前空間);
for(xnamespace の var p)
{
if(ウィンドウ[p]==xnamespace[p])続行;
if(window[p]) throw "名前の競合";
window[p]=xnamespace[p];
}
関数
export_xnamespace(名前空間)
{
var xnamespace=get_xnamespace(名前空間);
for(xnamespace の var p)
{
if(window[p]==xnamespace[p])window[p]=未定義;
}
}
X.ファイルパス={
a:{
b:{
c:「./abc.js」
}、
d:"./ad.js",
e:「./ae.js」
}
}
X.library_queue=新しい配列();
X.library_queue.run=function(){
while(this.length)
{
(this.pop())();
}
}
X.library_queue.push=関数(f)
{
for(var i=0;i<this.length;i++)
{
if(this[i].toString()==f.toString())return false;
}
this[i]=f;
true を返します。
}
})();
2007 年 10 月 21 日静かに更新: Exception ファイルと FilePath ファイルを分離しました。