擬似継続ベースの名前空間ライブラリ
http://github.com/hirokidaichi/namespace-js
そんなわけでgithubに上げました。まだgitのことよくわかっていませんw
ドキュメントをなんとなくまとめる
名前空間の定義(define)
Namepsace('org.yabooo.dom').define(function(ns){ // ここにライブラリの実装を書く var SomeModule = function(){}; ns.provide({ SomeModule : SomeModule // exportしたいモジュールを記述 }); }); Namepsace('org.yabooo.net').define(function(ns){ // ここにライブラリの実装を書く var HTTPRequest = function(){}; ns.provide({ HTTPRequest : HTTPRequest // exportしたいモジュールを記述 }); }); // この時点では、実装部分は実行されない。必要になるまで名前空間のデプロイは遅延される。
名前空間の利用(use)
名前空間に存在するコード片を利用したい場合
// exportして使う Namespace('org.yabooo.jsonrpc') .use('org.yabooo.net HTTPRequest') .define(function(ns){ var req = new ns.HTTPRequest; // ns.provide({ JSONRPC : JSONRPC }); }); // fqnで使う Namespace('org.yabooo.jsonrpc') .use('org.yabooo.net') .define(function(ns){ var req = new ns.org.yabooo.net.HTTPRequest; // ns.provide({ JSONRPC : JSONRPC }); }); // withを伴って利用する Namespace('org.yabooo.jsonrpc') .use('org.yabooo.net') .use('org.yabooo.net *') .define(function(ns){with(ns){ var req = new org.yabooo.net.HTTPRequest; var req = new HTTPRequest; // provide({ JSONRPC : JSONRPC }); }}); // この時点では未だどのライブラリも利用の必要性が無いため実行されていない。
名前空間の適応(apply)
Namespace().use('org.yabooo.jsonrpc *').apply(function(ns){ var jsonrpc = js.JSONRPC.createService(); // 実行コード }); //この時点ではじめて必要なライブラリ定義が実行される。
ns.provideで遅延適応させる
ns.provideはdefineの中に必ず存在しなければなりません。
逆に言えば、どれだけあとに実行されても正しく動作します。
Namespace('something.defferred').define(function(ns){ // call 2 setTimeout(function(){ // call 3 ns.provide({ Exports : [] }); },100); }); // call 1 Namespace().use('something.defferred').apply(function(ns){ // call 4 });
そのため、あるイベントが発生してからはじめて有効になるライブラリやそれを用いた処理が簡単に記述できます。
Namespace('something.defferred').define(function(ns){ // call 2 document.addEventListener('DOMContentLoaded',function(){ // call 3 ns.provide({ allAnchors : $$('a') }) }); }); // call 1 Namespace().use('something.defferred').apply(function(ns){ // call 4 });
XHRで外部ライブラリを読み込む
ライブラリを非同期にエクスポートする機能を一番利用するケースは、
必要になるまで読み込まないようなライブラリを利用するケースではないでしょうか。
そんなときのためにサポートユーティリティを用意しています。
Namespace('something.external').define(Namespace.GET('/static/something/external.js')); Namespace().use('something.external').apply(function(ns){ // external.jsを利用するコード });
something/external.jsは次のような感じ
(function(){ var SomeModule = function(){}; return { SomeModule : SomeModule } })();
XHRで読み込んでevalした結果をprovideの中身として扱ってくれます。
ではenjoy!名前空間ライフ