- Notifications
You must be signed in to change notification settings - Fork8
WebModulePattern
uupaa edited this pageJun 5, 2015 ·69 revisions
このエントリでは、WebModule に使われている 実装パターン(WebModulePattern) について紹介しています。
WebModulePattern は、どこでも動作し、I/Fと実装が分離された見通しの良いモジュールを記述するためのコードパターンです。以下のように記述すると、Browser, Node.js, Worker, NW.js で動作するモジュールを構築できます。
以下は MyExample モジュールをGLOBAL
.WebModule.MyExample に export するコードです。
GLOBAL["WebModule"]["exports"]("MyExample",function(global){"use strict";functionMyExample(){ ...}returnMyExample;// return entity});
entity に対して何か行いたい場合や、GLOBAL.WebModule に依存したくない場合は、クロージャ関数(この例では moduleExporter と moduleClosure) を使用し、以下のように記述します。
(functionmoduleExporter(moduleName,moduleClosure){// http://git.io/WebModule"use strict";varentity=GLOBAL["WebModule"] ?GLOBAL["WebModule"]["exports"](name,closure) :closure(GLOBAL);// entity に対する操作returnentity;})("MyExample",functionmoduleClosure(global){functionMyExample(){ ...}returnMyExample;// return entity});
GLOBAL
を導き出すコード やGLOBAL.WebModule.exports
関数などの共通コードは、別ファイル(WebModule.js)に記述し、MyExample.js より先にロードしておきます。
// --- global variables ------------------------------------// http://git.io/WebModule// --- global variables ------------------------------------// https://github.com/uupaa/WebModule/wiki/WebModuleIdiomvarGLOBAL=GLOBAL||(this||0).self||global;// --- environment detection -------------------------------GLOBAL.IN_NODE_OR_NW=!!GLOBAL.global;GLOBAL.IN_BROWSER=!GLOBAL.IN_NODE_OR_NW&&"document"inGLOBAL;GLOBAL.IN_WORKER=!GLOBAL.IN_NODE_OR_NW&&"WorkerLocation"inGLOBAL;GLOBAL.IN_NODE=GLOBAL.IN_NODE_OR_NW&&!/native/.test(setTimeout);GLOBAL.IN_NW=GLOBAL.IN_NODE_OR_NW&&/native/.test(setTimeout);// --- validate and assert functions -----------------------//{@dev https://github.com/uupaa/WebModule/wiki/ValidateGLOBAL["$type"]=function(value,types){returnGLOBAL["Valid"] ?GLOBAL["Valid"].type(value,types) :true;};GLOBAL["$keys"]=function(value,keys){returnGLOBAL["Valid"] ?GLOBAL["Valid"].keys(value,keys) :true;};GLOBAL["$some"]=function(value,candidate,ignoreCase){returnGLOBAL["Valid"] ?GLOBAL["Valid"].some(value,candidate,ignoreCase) :true;};GLOBAL["$args"]=function(api,args){if(GLOBAL["Valid"]){GLOBAL["Valid"].args(api,args);}};GLOBAL["$valid"]=function(value,api,highlihgt){if(GLOBAL["Valid"]){GLOBAL["Valid"](value,api,highlihgt);}};//}@dev// --- WebModule ------------------------------------------GLOBAL.WebModule={exports:function(name,closure){varalias=nameinGLOBAL ?(name+"_") :name;varentity=aliasinthis ?this[alias] :this[alias]=closure(GLOBAL);if(typeofexports!=="undefined"){module["exports"]=entity;}returnentity;}};
古いスタイルで書かれたコードを WebModulePattern に書き直す方法 についても参照してください。
TBD: このセクションは推敲や検証が終わっていません。
WebModulePattern で書かれたコードを ES6::Modules の export に対応させるには先頭に1行追加します。
export// この行を追加GLOBAL["WebModule"]["exports"]("MyExample",function(global){"use strict";functionMyExample(){ ...}returnMyExample;});