zoukankan      html  css  js  c++  java
  • avalon中require的实现

    var plugins = {
        loader: function(builtin) {
            window.define = builtin ? innerRequire.define : otherDefine
            window.require = builtin ? innerRequire : otherRequire
        },//判断使用那个require 和define
    innerRequire = avalon.require = function(array, factory, parentUrl) {
            if (!Array.isArray(array)) {
                avalon.error("require的第一个参数必须是依赖列数,类型为数组 " + array)
            }
    
            var deps = {} // args的另一种表现形式,为的是方便去重
            var id = parentUrl || "callback" + setTimeout("1")
            /* setTimeout("1")
             * 
             * setTimeout() 方法的返回值是一个唯一的数值,这个数值有什么用呢?如果你想要终止 setTimeout() 方法的执行,那就必须使用 clearTimeout() 方法来终止,
             * 而使用这个方法的时候,系统必须知道你到底要终止的是哪一个 setTimeout() 方法
             * (因为你可能同时调用了好几个 setTimeout() 方法),这样 clearTimeout() 方法就需要一个参数,
             * 这个参数就是 setTimeout() 方法的返回值 (数值),用这个数值来唯一确定结束哪一个 setTimeout() 方法。
             * 在系统中每次调用一次,就会递增一次 
             * 
             */
            parentUrl = getBaseUrl(parentUrl)//获取模块加载的根目录
            /*
             *  function getBaseUrl(parentUrl) {
                            return kernel.baseUrl ? kernel.baseUrl : parentUrl ?
                                   parentUrl.substr(0, parentUrl.lastIndexOf("/")) :
                                   kernel.loaderUrl
                            }
                            kernel在配置系统模块可以找到,该对象主要是处理我们自己配置的条件。
             */
            //加载每个依赖的文件
            array.forEach(function(el) {
                var url = loadResources(el, parentUrl) //加载资源,并返回能加载资源的完整路径
                if (url) {
                    if (!deps[url]) {//去重:如果deps中存在url,那就不用加入到依赖项数组中
                        args.push(url)
                        deps[url] = "司徒正美" //去重:
                    }
                }
            })
            if (!modules[id]) {
                //如果此模块是定义在另一个JS文件中, 那必须等该文件加载完毕
                //才能放到检测列队中
                loadings.push(id)
            }
            if (!modules[id] || modules[id].state !== 2) {
                modules[id] = makeModule(id, 1, factory, deps, args)//更新此模块信息
            }
          
            checkDeps()
        }
    just do myself
  • 相关阅读:
    使用REST风格完成MVC前后端分离
    MySQL数据库开发常见问题及几点优化!
    springboot 使用JPA自动生成Entity实体类的方法
    mybatis-plus 自动生成代码
    springboot中使用ContextLoaderListener.getCurrentWebApplicationContext();获取WebApplicationContext为空问题
    Java 7 使用TWR(Try-with-resources)完成文件copy
    MySQL 删除数据库
    MySQL 创建数据库
    MySQL 创建数据表
    JDBC Java 连接 MySQL 数据库
  • 原文地址:https://www.cnblogs.com/rookieCat/p/4635162.html
Copyright © 2011-2022 走看看