seajs的简化版sea-me.js,自己改的

完整代码

(function(global) {

    if(global.seajs) {

        return;

    }

    var seajs = global.seajs = {};

    var data = seajs.data = {};

    data.paths = {};

    data.vars = {};

    var DIRNAME_RE = /.*\//;

    function dirname(path) {

        return path.match(DIRNAME_RE)[0];

    }

    function isType(type) {

        return function(obj) {

            return {}.toString.call(obj) == "[object " + type + "]";

        }

    }

    var isObject = isType("Object");

    var isString = isType("String");

    var isArray = Array.isArray || isType("Array");

    var isFunction = isType("Function");

    var scripts = document.scripts;

    var loaderScript = scripts[scripts.length - 1];

    var seajsDir = dirname(loaderScript.src); //sea.js路径

    var supportOnload = "onload" in loaderScript;

    var cwd = dirname(location.href); //当前工作目录

    var DOT_RE = /\/\.\//g;

    var MULTI_SLASH_RE = /([^:/])\/+\//g;

    var DOUBLE_DOT_RE = /\/[^/]+\/\.\.\//;

    function realpath(path) {

        // /a/b/./c/./d ==> /a/b/c/d

        path = path.replace(DOT_RE, "/");

        // a///b/////c ==> a/b/c

        path = path.replace(MULTI_SLASH_RE, "$1/");

        // a/b/c/../../d  ==>  a/b/../d  ==>  a/d

        while(path.match(DOUBLE_DOT_RE)) {

            path = path.replace(DOUBLE_DOT_RE, "/");

        }

        return path;

    }

    var PATHS_RE = /^([^/:]+)(\/.+)$/;

    var VARS_RE = /{([^{]+)}/g;

    function parsePaths(uri) {

        var m, paths = data.paths;

        if(paths && (m = uri.match(PATHS_RE)) && isString(paths[m[1]])) {

            uri = paths[m[1]] + m[2];

        }

        return uri;

    }

    function parseVars(uri) {

        var vars = data.vars;

        if(vars && uri.indexOf("{") > -1) {

            uri = uri.replace(VARS_RE, function(m, key) {

                return isString(vars[key]) ? vars[key] : m;

            });

        }

        return uri;

    }

    // normalize("path/to/a") ==> "path/to/a.js"

    function normalize(path) {

        var last = path.length - 1;

        return path.substring(last - 2) === ".js" ? path : path + ".js";

    }

    var HOST_RE = /^\/\/.|^[https?|file]:\/\/./;

    var ROOT_DIR_RE = /^.*?\/\/.*?\//;

    function addBase(uri, refUri) {

        var ret, first = uri.charCodeAt(0);

        // Host

        if(HOST_RE.test(uri)) {

            ret = uri.indexOf("//") === 0 ? location.protocol + uri : uri;

        }

        // Absolute

        else if(first === 47 /* "/" */ ) {

            var m = cwd.match(ROOT_DIR_RE);

            ret = m[0] + uri.substring(1);

        }

        // Relative

        else if(first === 46 /* "." */ ) {

            ret = (refUri ? dirname(refUri) : cwd) + uri;

        }

        // default

        else {

            ret = seajsDir + uri;

        }

        return realpath(ret);

    }

    var head = document.getElementsByTagName("head")[0] || document.documentElement;

    var currentlyAddingScript = null;

    function request(url) {

        var node = document.createElement("script");

        addOnload(node, url);

        node.async = true;

        node.src = url;

        currentlyAddingScript = node;

        head.appendChild(node);

        currentlyAddingScript = null;

    }

    function addOnload(node, url) {

        if(supportOnload) {

            node.onload = onload;

        } else {

            node.onreadystatechange = function() {

                if(/loaded|complete/.test(node.readyState)) {

                    onload();

                }

            }

        }

        function onload() {

            node.onload = node.onreadystatechange = null;

            var mod = cachedMods[node.src];

            if(supportOnload) {

                mod.dependencies = anonymousMeta.deps;

                mod.callback = anonymousMeta.callback;

            }

            mod.load();

            head.removeChild(node);

            node = null;

            anonymousMeta = null;

            mod.callback && mod.callback();

        }

    }

    function getCurrentScript() {

        if(currentlyAddingScript) {

            return currentlyAddingScript;

        }

        var i, script, scripts = head.getElementsByTagName("script");

        for(i = scripts.length - 1; i >= 0; i--) {

            script = scripts[i];

            if(script.readyState === "interactive") {

                return script;

            }

        }

    }

    function inArray(arr, obj) {

        var i = arr.length;

        while(i--) {

            if(arr[i] === obj) {

                return true;

            }

        }

        return false;

    }

    var cachExps = seajs.exports = {};

    var cachedMods = seajs.cachedMods = {};

    function Module() {

        this.dependencies = [];

        this.deps = [];

        this.entry = [];

    }

    Module.resolve = function(uri, refUri) {

        uri = parsePaths(uri);

        uri = parseVars(uri);

        uri = normalize(uri);

        uri = addBase(uri, refUri);

        return uri;

    }

    // Resolve module.dependencies

    Module.prototype.resolve = function() {

        var mod = this;

        var i, deps = mod.dependencies;

        for(i = 0, len = deps.length; i < len; i++) {

            mod.deps[i] = Module.resolve(deps[i], mod.uri);

        }

    }

    Module.prototype.load = function() {

        var i, m, mod = this;

        mod.resolve();

        for(i = 0; i < mod.deps.length; i++) {

            if(!cachedMods[mod.deps[i]]) {

                m = cachedMods[mod.deps[i]] = new Module();

                m.uri = mod.deps[i];

                m.fetch();

            }

        }

    }

    // Fetch a module

    Module.prototype.fetch = function() {

        var mod = this;

        request(mod.uri);

    }

    Module.prototype.call = function(call) {

        var mod = this;

        if(0 === mod.deps.length) {

            call();

        } else {

            mod.n = 0;

            var i, entry;

            for(i = 0; i < mod.deps.length; i++) {

                if(!cachExps[mod.deps[i]]) {

                    entry = cachedMods[mod.deps[i]].entry;

                    mod.n++;

                    if(!inArray(entry, mod)) {

                        entry.push(mod);

                    }

                }

            }

            if(0 === mod.n) {

                call();

            }

        }

    }

    Module.prototype.cutExp = function() {

        var mod = this;

        var i, exports = [];

        for(i = 0; i < mod.deps.length; i++) {

            exports.push(cachExps[mod.deps[i]]);

        }

        return exports;

    }

    Module.use = function(deps, callback) {

        var mod = new Module();

        deps = deps ? deps : [];

        mod.dependencies = isArray(deps) ? deps : [deps];

        mod.callback = function() {

            function call() {

                var exports = mod.cutExp();

                if(isFunction(callback)) {

                    callback.apply(global, exports);

                }

                mod = null;

            }

            mod.call(call);

        }

        mod.load();

        mod.callback();

    }

    var anonymousMeta = null;

    Module.define = function(deps, factory) {

        var argsLen = arguments.length;

        if(argsLen === 1) {

            factory = deps;

            deps = [];

        }

        deps = isArray(deps) ? deps : [deps];

        var callback = function() {

            var mod = this;

            function call() {

                var exports = mod.cutExp();

                var m, i, exp = (isFunction(factory) ? factory.apply({}, exports) : factory) || true;

                cachExps[mod.uri] = exp;

                for(i = 0; i < mod.entry.length; i++) {

                    m = mod.entry[i];

                    m.n--;

                    m.callback();

                }

                delete cachedMods[mod.uri];

                mod = null;

            }

            mod.call(call);

        }

        if(supportOnload) {

            // Save information for the script onload event

            anonymousMeta = {

                deps: deps,

                callback: callback

            };

        } else {

            var node = getCurrentScript();

            var mod = cachedMods[node.src];

            mod.dependencies = deps;

            mod.callback = callback;

        }

    }

    // Public API

    seajs.use = function(deps, callback) {

        Module.use(deps, callback);

        return seajs;

    }

    global.define = Module.define;

    seajs.config = function(configData) {

        var curr, prev, key, k;

        for(key in configData) {

            curr = configData[key];

            prev = data[key];

            // Merge object config such as paths, vars

            if(prev && isObject(prev)) {

                for(k in curr) {

                    prev[k] = curr[k];

                }

            }

        }

        return seajs;

    }

})(this);

使用方法很简单,类似seajs和requirejs,略微不同

define:

define(['a','b',...],function(a,b,...){

    a.a();

    b.b();

    return obj;

});

//或者

define('a',function(a){

    a.a();

    return obj;

});

//第一个参数为依赖,第二个是工厂函数,返回带有方法的对象,用来自己开发js库。

seajs.use:

seajs.use(['a','b',...],function(a,b,...){

    a.a();

    b.b();

});

//或者

seajs.use('a',function(a){

    a.a();

});

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容