Skip to content
uupaa edited this page Oct 23, 2015 · 23 revisions

このエントリでは WebModule.js について説明します。

Load order

最初に WebModule.js を読み込み、その後に WebModule製のモジュール(例: MyExample.js)を読み込みます。

<script src="../lib/WebModule.js"></script>
<script>
//publish to global. eg: window.WebModule.Class -> window.Class
//WebModule.publish = true;
</script>

<script src="../lib/MyExample.js"></script>
<script>
var myExample = new WebModule.MyExample();
</script>

Publish to GLOBAL

モジュールを GLOBAL 空間以下に直接公開することもできます。

モジュールを読み込む前に、WebModule.publish = true; を設定しておくと、
通常 new WebModule.MyExample() のように記述すべきところを、
new MyExample() と、より短く記述できるようになります。

<script src="../lib/WebModule.js"></script>
<script>
WebModule.publish = true;
</script>
<script src="../lib/MyExample.js"></script>
<script>
var myExample = new WebModule.MyExample();

var myExample = new MyExample(); // published 
</script>

WebModule.js

WebModule version 0.5.33 時点の WebModule.js はこのようになっています。

GLOBAL は ブラウザ上では window と等価です。
Namespaceを参照してください。

// http://git.io/WebModule

// --- global variables ------------------------------------
// https://github.com/uupaa/WebModule/wiki/WebModuleIdiom
var GLOBAL = (this || 0).self || global;

// --- environment detection -------------------------------
// https://github.com/uupaa/WebModule/wiki/EnvironmentDetection
GLOBAL.IN_EL      = !/undefined/.test(typeof __dirname + typeof __filename);
GLOBAL.IN_BROWSER = !GLOBAL.IN_EL &&  !GLOBAL.global && "document" in GLOBAL;
GLOBAL.IN_WORKER  = !GLOBAL.IN_EL &&  !GLOBAL.global && "WorkerLocation" in GLOBAL;
GLOBAL.IN_NODE    = !GLOBAL.IN_EL && !!GLOBAL.global && !/native/.test(setTimeout);
GLOBAL.IN_NW      = !GLOBAL.IN_EL && !!GLOBAL.global &&  /native/.test(setTimeout);

// --- validate and assert functions -----------------------
//{@dev https://github.com/uupaa/WebModule/wiki/Validate
GLOBAL.$type  = function(v, types)   { return GLOBAL.Valid ? GLOBAL.Valid.type(v, types)  : true; };
GLOBAL.$keys  = function(v, keys)    { return GLOBAL.Valid ? GLOBAL.Valid.keys(v, keys)   : true; };
GLOBAL.$some  = function(v, cd, ig)  { return GLOBAL.Valid ? GLOBAL.Valid.some(v, cd, ig) : true; };
GLOBAL.$args  = function(api, args)  { return GLOBAL.Valid ? GLOBAL.Valid.args(api, args) : true; };
GLOBAL.$valid = function(v, api, hl) { return GLOBAL.Valid ? GLOBAL.Valid(v, api, hl)     : true; };
//}@dev

// --- WebModule -------------------------------------------
GLOBAL.WebModule = {
    publish: false, // WebModule based modules publish to global.
    closure: {},    // module script stocker
    exports: function(moduleName, moduleClosure) {
        var wm = this; // GLOBAL.WebModule

        // https://github.com/uupaa/WebModule/wiki/SwitchModulePattern
        var alias = wm[moduleName] ? (moduleName + "_") : moduleName;

        if (!wm[alias]) { // secondary module already exported -> skip
            wm[alias] = moduleClosure(GLOBAL); // evaluate the module entity
            wm.closure[alias] = moduleClosure + ""; // stock

            if (wm.publish && !GLOBAL[alias]) {
                GLOBAL[alias] = wm[alias]; // publish to global
            }
        }
        return wm[alias];
    }
};
Clone this wiki locally