自研模块加载器(三) module模块构造器设计-模块数据初始化

依赖加载策略

 

 

模块数据初始化

 

status状态生命周期

 

 

代码展示

demo包括4个文件, index.html , a.js , b.js , startUp.js

index.html

<!DOCTYPE html>
<html>
<head>
    <title>自研模块加载器</title>
</head>
<body>
    

    <script src="./startUp.js"></script>
    <script>
        startUp.use(['a.js', 'b.js'], function() {
            console.log('startUp...')
        })
    </script>
</body>
</html>

a.js

define(function(require, exports, module) {
    var a = {
        who: "我"
    }
    exports(a)
})

b.js

define(function(require, exports, module) {
    var b = {
        text: "太难了"
    }
    exports(b)
})

startUp.js (模块加载器)

(function(global) {
    var startUp = global.startUp = {
        version: '1.0.1'
    }

    var data = {}; // 获取当前模块加载器内置信息
    var cache = {}; // 缓存

    //模块的生命周期
    var status = {
        FETCHED: 1,
        SAVED: 2,
        LOADING: 3,
        LOADED: 4,
        EXECUTING: 5,
        EXECUTED: 6
    }


    // 静态工具类,判断是否为数组
    var isArray = function(obj) {
        return toString.call(obj) === "[object Array]";
    }

    // 构造函数
    function Module(uri, deps) {
        this.uri = uri;
        this.deps = deps || []; // ['a.js', 'b.js'] 依赖项
        this.exports = null;
        this.status = 0;
        this._waitings = {};
        this._remain = 0; 
    }

    // 分析主干(左子树,右子树)上的依赖
    Module.prototype.load = function (){
        var m = this;
        m.status = status.LOADING; // 设置构造函数的状态为 LOADING => 3 
    }

    // 资源定位
    Module.prototype.resolve = function(){

    }


    /*
     *    模块的静态属性和方法    
    */

    // 模块定义
    Module.define = function (factory) {

    }

    // 检测缓存对象是否有当前模块信息
    Module.get = function (uri, deps) {
        return cache[uri] || (cache[uri] = new Module(uri, deps));
    }

    Module.use = function (deps, callback, uri) {
        var m  = Module.get(uri, isArray(deps) ? deps : [deps]);
            
        console.log(m)
        // 模块加载完成执行回调
        m.callback = function() {

        }
        m.load();
    }

    var _cid = 0;


    function cid() {
        return _cid++;
    }

    // 初始化预加载资源
    data.preload = [];

    //     获取当前文档的URL
    data.cwd = document.URL.match(/[^?]*\//)[0];

    Module.preload = function(callback) {
        var length = data.preload.length;
        if(!length) callback();
    }

    // 入口函数
    startUp.use = function(list, callback){
        // 检测有没有预加载模块
        Module.preload(function() {
            Module.use(list, callback, data.cwd + "_use" +cid()) // 虚拟根目录
        })
    }

    global.define = Module.define;

})(this)

 

posted @ 2020-01-29 15:10  进击的小牛牛  阅读(299)  评论(0编辑  收藏  举报