javascript - 请教seaJs.use怎么实现的?
迷茫
迷茫 2017-04-10 17:18:58
[JavaScript讨论组]

随便来一个load_script实现.

function load_script(xyUrl, callback){
    var head = document.getElementsByTagName('head')[0];
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = xyUrl;

    script.onload = script.onreadystatechange = function(){
        if((!this.readyState || this.readyState === "loaded" || this.readyState === "complete")){
            callback && callback();
            // Handle memory leak in IE
            script.onload = script.onreadystatechange = null;
            if ( head && script.parentNode ) {
                head.removeChild( script );
            }
        }
    };
    // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
    head.insertBefore( script, head.firstChild );
}

当onload或者 onreadystatechange readyState === "loaded" 的时候。
js 加载完毕了。那么此时加载的js执行了吗?不一定执行完。

在seaJs中:

seaJs.use('a.js',function(ooo){
 console.log(ooo)// o为a.js exports的对象。那么此时a.js肯定执行过了。
})

请教seaJs.use怎么实现的?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(2)
阿神
var all = {};

function define(name, factory) {
    // 把定义记录下来
    var module = {
        name: name,
        factory: factory,
        depends: (function() {
            var content = factory.toString();
            return findUse(content);  // 通过正则表达式在 contnet 中找到所有 use 的模块
        })()
    };
    
    // 保存起来
    all[name] = module;
}

function use(depends, callback) {
    // 根据上面 define 的时候保存的依赖关系,递归加载所有依赖脚本
    // 加载完了之后再调用 callback,类似于递归的 Promise.all
} 
天蓬老师

seajs里是有几种状态来标识文件的加载情况的。 这几种状态是如何界定判断出来的。比如loaded 和 EXECUTED

var STATUS = Module.STATUS = {
  // 1 - The `module.uri` is being fetched
  FETCHING: 1,
  // 2 - The meta data has been saved to cachedMods
  SAVED: 2,
  // 3 - The `module.dependencies` are being loaded
  LOADING: 3,
  // 4 - The module are ready to execute
  LOADED: 4,
  // 5 - The module is being executed
  EXECUTING: 5,
  // 6 - The `module.exports` is available
  EXECUTED: 6,
  // 7 - 404
  ERROR: 7
}
Module.use 构造一个没有factory的模块,开始整个加载流程,状态初始化为FETCHING到SAVED;
Module.prototype.load 通过load方法,开始加载子模块,状态由SAVED到LOADING;
Module.prototype.onload 当子模块都加载完成后都会调用onload方法,状态由LOADING到LOADED;
Module.prototype.exec 加载过程都结束了,开始执行模块,状态由EXECUTING到EXECUTED;
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号