`
kongxiantao
  • 浏览: 108051 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JavaScript DO 框架 学习

阅读更多

昨天在github找东西的时候,发现上了克军的DO框架,感觉不错,今天看了一上午,作者的思路很清晰,学了不少到东西。

同时发现DO的还有一个分支,应该算是DO的第二个版本吧,不过是压缩过后的,没有压缩的暂时没有找到,等找到了在学习

 

地址:https://github.com/kejun/Do

 

以下算是把源码给汉化。版权归作者克军,呵呵呵。

 

不废话没直接上代码:

 

/**
 * Do 是一个轻量级javascript开发框架。它的核心库可以自由更换。
 * 设计原则:
 * 1. 不提供任何业务相关功能
 * 2. 公共功能功能都出自核心库,核心库可灵活添加或更换。
 * 3. 内置依赖关系管理系统
 * @author Kejun (listenpro@gmail.com)
 * @version 0.1(draft)
 */

(function(){

var _Doc = document, 
_loaded = {},
_isArray = function (e) { return e.constructor === Array; },

_log = function (e) {
    if (window.console && window.console.log){
        window.console.log(e);
    }
},


//内部配置文件
_config = {
    //核心库,可以任意换
    core_lib: ['http://code.jquery.com/jquery-1.4.2.js'],
    
    //模块依赖
    mods: {}
},

//加载队列
_loading_queue = {},

// load external js or css.  
// 加载外部的js  css , cb = callback
_load = function (url, type, charset, cb) {
    // url为空 返回
	if (!url) {
        return;
    }
//	加载 url
    if (_loaded[url]) {
        _loading_queue[url] = false;//已加载
        if (cb) {
            cb(url);//加载 url
        }
        return;
    }
    
    if (_loading_queue[url]) {
        setTimeout(function(){
            _load(url, type, charset, cb);
        }, 10);
        return;
    }
    _loading_queue[url] = true;
    
    // n = node
    var n, t = type || url.toLowerCase().substring(url.lastIndexOf('.') + 1);

    if (t === 'js') {
        n = _Doc.createElement('script');
        n.setAttribute('type', 'text/javascript');
        n.setAttribute('src', url);
    } else if (t === 'css') {
        n = _Doc.createElement('link');
        n.setAttribute('type', 'text/css');
        n.setAttribute('rel', 'stylesheet');
        n.setAttribute('href', url);
        _loaded[url] = true;
    }
    
    if (charset) {
        n.charset = charset;
    }
    
    if (t === 'css') {
      _Doc.getElementsByTagName('head')[0].appendChild(n);
      if (cb) {
        cb(url);
      }
      return;
    }
    
    n.onload = n.onreadystatechange = function () {
        if (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete') {
            //loaded success.
            _loaded[this.getAttribute('src')] = true;
            
            if (cb) {
                cb(this.getAttribute('src'));
            }
            
            n.onload = n.onreadystatechange = null;
        }
    };
    
    _Doc.getElementsByTagName('head')[0].appendChild(n);
},

//计算 参数e是个队列
_calculate = function(e) {
    if (!e || !_isArray(e) ) {
        return;
    }
    
    var i = 0, item, result = [], 
    mods = _config.mods,
    _depeList = [],//需要加载的List
    _hasAdded = {},//已经加载的List
    getDepeList = function (e) {

        var i = 0, m, reqs;
        
        // break loop require.如果已经加载
        if (_hasAdded[e]) {
            return _depeList;
        }   
        _hasAdded[e] = true;
        if (mods[e].requires) {
            reqs = mods[e].requires;
            for (; m = reqs[i++];) {
              // is a module.
              if (mods[m]) {
                getDepeList(m);
                _depeList.push(m);
               } else {
                // is a file.
                _depeList.push(m);
               }
            }
            return _depeList;
        }
        return _depeList;
    };
    
    for (; item = e[i++]; ) {
        if (mods[item] && mods[item].requires && mods[item].requires[0]) {
            _depeList = [];
            _hasAdded = {};
            result = result.concat(getDepeList(item));
        }
        result.push(item);
    }
    
    return result;
},

// a asynchronous queue
_queue = function (e) {
    if (!e || !_isArray(e) ) {
        return;
    }
    
    this.queue = e;
    //timeout file collection.
    this._skip = {};
};

_queue.prototype = {
//	超时
    _Timeout: 6000,
    
//  间隔
    _interval: 10, 
    
    start: function () {
        var o = this;
        this.current = this.next(); 
        
        if (!this.current) {
            this.end = true;
            return;
        }
        
//        延迟 _Timeout后执行  ,打印  o.current  加载超时
        this._outTimer = setTimeout(function () {
          _log('[DoubanJS] "' + o.current + '" timeout.');
          o._skip[o.current] = true; 
          o.start(); 
        }, this._Timeout);
        
        this.run();
    },
    
    run: function () {
        
        var o = this, mod;
        
        if (typeof this.current === 'function') {
            this.clearTimer();
            this.current();//?
            this.start();//加载下一个
        } else if (typeof this.current === 'string') {
            if (_config.mods[this.current]) {
              // todo:load a module.
              mod = _config.mods[this.current];
              _load(mod.path, mod.type, mod.charset, function (e) {
                 // if timeout file fire callback don't disturb queue.
            	 // 如果还没有超时,继续
                 if (!o._skip[e]) {
                   o.clearTimer();
                   o.start();
                 }
              });
            } else if (/\.js|\.css/i.test(this.current)) {
              // load a file.
              _load(this.current, '', '', function (e) {
                 // if timeout file fire callback don't disturb queue.
                 if (!o._skip[e]) {
                   o.clearTimer();
                   o.start();
                 }
              }); 
            } else {
              // no found module. skip to next
              this.clearTimer();
              this.start();
           }
        }
    },
    
    clearTimer: function () {
    	//取消指定的setTimeout函数将要执行的代码 
        clearTimeout(this._outTimer);
    },
    
    next: function () { return this.queue.shift(); } // 删除 queue 的第一个元素 ,并返回第一个元素
};


// preload core lib.
_load(_config.core_lib[0], 'js');


this.Do = function(){
    var args = Array.prototype.slice.call(arguments, 0), 
    thread = new _queue(_calculate(_config.core_lib.concat(args)));
    thread.start();
};

this.Do.add = function(sName, oConfig) {
    if (!sName || !oConfig || !oConfig.path) {
        return;
    }
    
    _config.mods[sName] = oConfig;
};

})();
 

 

 

 

分享到:
评论

相关推荐

    jQuery,JavaScript框架

    jQuery课件,jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨是“write Less,Do More”。

    JavaScript的框架jquery文件

    jquery文件,属于JavaScript的一种框架。jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(框架)于2006年1月由John Resig发布。jQuery设计的宗旨是“write Less,Do More...

    do 框架(3.5k)

    Do是豆瓣网kejun开发的一个很轻量的Javascript开发框架。目前do.min.js。它的核心功能是对模块进行组织和加载。加载采取并行异步队列的策略,并且可以控制执行时机。Do可以任意置换核心类库,默认是jQuery。 项目...

    jQuery API 一个兼容多浏览器的javascript框架

    jQuery是一个兼容多浏览器的javascript框架,核心理念是write less,do more(写得更少,做得更多)。jQuery在2006年1月由美国人John Resig在纽约的barcamp发布,吸引了来自世界各地的众多JavaScript高手加入,由Dave ...

    jQuery(JavaScript框架)基础讲解

    jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(框架)于2006年1月由John Resig发布。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。...

    jQuery 1.6版本至1.9版本 一个兼容多浏览器的javascript框架

    jQuery是一个兼容多浏览器的javascript框架,核心理念是write less,do more(写得更少,做得更多)。jQuery在2006年1月由美国人John Resig在纽约的barcamp发布,吸引了来自世界各地的众多JavaScript高手加入,由Dave ...

    JavaScript消息传输框架Stomple.zip

    Stomple 是一个基于 WebSocket 实现了 Stomp 消息传输框架协议的 JavaScript 包。 示例代码: var client = Stomple.create_client({ url : "ws://localhost:61614/stomp", destination : "jms.topic.chat", login :...

    JavaScript基础教程第8版

    书中从JavaScript语言基础开始,分别讨论了图像、框架、浏览器窗口、表单、正则表达式、用户事件和cookie,并在上一版的基础上新增了两章,讲述jQuery框架的基础知识。本书不仅介绍了基础知识和使用方法,也深入探讨...

    JavaScript详解(第2版)

     13.3 处理窗口事件或框架事件   13.3.1 onLoad和onUnLoad事件   13.3.2 onFocus和onBlur事件函数   13.3.3 onResize事件处理函数   13.4 鼠标事件处理   13.4.1 怎样使用鼠标事件   13.4.2 ...

    源文件程序天下JAVASCRIPT实例自学手册

    2.8.5 while和do-while循环语句 2.8.6 使用break和continue进行循坏控制 2.8.7 with对象操作语句 2.8.8 使用for…in进行对象循坏 2.8.9 含标签的语句 2.9 函数 2.9.1 函数的基本组成 2.9.2 全局函数与局部函数 2.9.3...

    《精通Javascript+jQuery》光盘源码

     2.7.2 do…while语句  2.7.3 for语句  2.7.4 break和continue语句  2.7.5 for…in语句  2.7.6 实例:九九乘法表  2.8 函数  2.8.1 定义和调用函数  2.8.2 用arguments对象访问函数的参数  2.8.3 ...

    JavaScript基础.doc

    2.3.4 do…while循环控制结构 9 2.3.5 for循环控制结构 10 2.3.6 switch控制结构 10 2.3.7 with语句 10 2.3.8 comment语句 11 3 事件 12 4 函数 14 4.1 函数的构成 14 4.2 函数的调用 14 4.3 构造函数 14 4.4 默认...

    elixir-rest:用于 Javascript 框架的 REST 服务器

    长生不老药休息用于 EmberJS(以及其他前端 Javascript 框架)的 REST 服务器确保你有和创建一个新项目在终端 elixir new my_app将以下内容放入mix.exs文件: defmodule MyApp do use Mix.Project alias ...

    jquery ——Javascrīpt框架

    jQuery是继prototype之后又一个优秀的Javascrīpt框架。其宗旨是——WRITE LESS,DO MORE,写更少的代码,做更多的事情。  它是轻量级的js库(压缩后只有21k) ,这是其它的js库所不及的,它兼容CSS3,还兼容各种浏览器 ...

    Android代码-简单方便的WebView和Javascript双向交互的框架

    A simpler, extendable bidirectional communication Frame between Android WebView and Javascript Features supports parsing and callback for JS primitive types Modular management support System WebView ...

    javascript函数的解释

    71.JS中遇到脚本错误时不做任何操作:window.onerror = doNothing; 指定错误句柄的语法为:window.onerror = handleError; 72.JS中指定当前打开窗口的父窗口:window.opener,支持opener.opener...的多重继续. 73.JS中的...

    jQuery经典入门教程 绝对详细

    jQuery是一个兼容多浏览器的javascript框架 核心理念是write less do more 写得更少 做得更多 jQuery在2006年1月由美国人John Resig在纽约的barcamp发布 吸引了来自世界各地的众多JavaScript高手加入 由Dave Methvin...

    Events.js:用于事件的 JavaScript 微框架

    一个超级棒的 JavaScript 事件处理程序库 作者:詹姆斯·布鲁蒙德版本:0.2.3-beta 版权所有 2011 詹姆斯·布鲁蒙德在MIT和GPL下获得双重许可 特征 简单易用的API 事件命名空间 对一些通常不受支持的事件...

    JavaScript基础和实例代码

    2.8.5 while和do-while循环语句 2.8.6 使用break和continue进行循坏控制 2.8.7 with对象操作语句 2.8.8 使用for…in进行对象循坏 2.8.9 含标签的语句 2.9 函数 2.9.1 函数的基本组成 2.9.2 全局函数与局部函数 2.9.3...

    js-antes-do-framework:在开始使用任何JavaScript框架之前,请回顾10项基本技巧,以了解这些知识

    框架之前JavaScript 在这10个系列的视频中,我将在开始学习诸如React或Vue.js之类的框架之前,回顾我认为应该清楚的主要JavaScript概念。 :clapper_board: :books:

Global site tag (gtag.js) - Google Analytics