Fork me on GitHub

seajs模块化开发

seajs是一个起辅助作用的库,所以它可以更方便开发,而它可以解决以下问题:

1、命名问题,就是冲突

2、性能问题,就是只要一个功能,但却使用一个大插件中的一个小功能,所以要手动拆分出这个功能

3、js依赖问题,要引入多个js文件,而且顺序也要排好,要手动去调节,要根据需求不断调节这些问题,修改BUG

 

seajs推荐一个功能就是一个模块,所以一个功能一个js文件。

一般流程都是以下代码:

<script>
    /*seajs的目录路径要搞清楚,你的文件在哪使用seajs,那个就是根目录*/
    /*配置*/
    seajs.config({
        base:"./",
        // 开启观察模式,主要看看有没有加载进来
        debug:true,
        /*别名*/
        alias:{
            "jquery":"js/jquery-3.1.0.min.js",
            "a":"js/a.js"
        },
        // 预加载
        preload:["jquery"]
    });
    // JQ库的引入
    seajs.use("jquery");
    /*加载*/
    seajs.use("./js/main");

    </script>

而这是有预加载的流程代码,而seajs是异步加载的方式加载的,所以加载像JQ库,而你的模块又依赖于它,那可能会在第一次执行或多次刷新时会报错,

意思是JQ库没加载进来,这是因为你的模块和JQ库一起加载了,JQ库没有加载完就去实现你的模块功能,所以就报错了,目前的解决方式是手动的写script标签

来同步加载。

 

以下是不适用预加载的方式:

<script>
    /*把模块引入seajs.use()*/
    // 两个参数,一个是模块地址,第二为回调函数
    // 如果没有./,那么目录的地址是相对于sea-debug.js的地址为默认地址,有就以html目录为根目录
    // 回调中参数就是exports
    seajs.use("./main.js",function(ex){
        
    });
    </script>

 

以下是一个例子:

拖拽的例子:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="sea-debug.js"></script>
    <style>
    #div1{
        width: 200px;
        height: 200px;
        position: absolute;
        background-color: red;
    }
    #div2{
        width: 30px;
        height: 30px;
        position: absolute;
        background-color: yellow;
        right: 0;
        bottom: 0;
    }
    #div3{
        width: 100px;
        height: 100px;
        background-color: blue;
        position: absolute;
        right: 0;
        top: 0;
    }
    </style>
</head>
<body>
<input type="button" id="btn" value="点击">
<div id="div1">
    <div id="div2"></div>
</div>
<div id="div3"></div>
    <script>
    /*把模块引入seajs.use()*/
    // 两个参数,一个是模块地址,第二为回调函数
    // 如果没有./,那么目录的地址是相对于sea-debug.js的地址为默认地址,有就以html目录为根目录
    // 回调中参数就是exports
    seajs.use("./main.js",function(ex){
        
    });
    </script>
</body>
</html>
/*
定义一个模块
他接受三个参数,这三个参数是不可改变的
 */
define(function(require,exports,module){
    // exports是对外的接口
    // require依赖的接口
    // 如果require的返回值是一个模块,接受的一个模块的接口exports
    var btn=document.getElementById("btn");
    var div1=document.getElementById("div1");
    var div2=document.getElementById("div2");
    var div3=document.getElementById("div3");
    require("./drag.js").drag(div3);
    require("./scale.js").scale(div1,div2);
})
define(function(require,exports,module){
    function drag(obj){
        var disX=0;
        var disY=0;
        obj.onmousedown=function(ev){
            ev=ev || window.event;
            disX=ev.clientX-obj.offsetLeft;
            disY=ev.clientY-obj.offsetTop;
            document.onmousemove=function(ev){
                ev=ev || window.event;
                var X=ev.clientX-disX;
                var Y=ev.clientY-disY;
                X=require("./range.js").range(X,document.documentElement.clientWidth-obj.offsetWidth,0);
                Y=require("./range.js").range(Y,document.documentElement.clientHeight-obj.offsetHeight,0);
                obj.style.top=Y+"px";
                obj.style.left=X+"px";
            }
            document.onmouseup=function(){
                document.onmousemove=document.onmouseup=null;
            }
        }
    };
    exports.drag=drag;
});
define(function(require,exports,module){

    function scale(obj1,obj2){
        var disX=0;
        var disY=0;
        var disW=0;
        var disH=0;
        obj2.onmousedown=function(ev){
            ev=ev||window.event;
            disX=ev.clientX;
            disY=ev.clientY;
            disW=obj1.offsetWidth;
            disH=obj1.offsetHeight;
            document.onmousemove=function(ev){
                ev=ev||window.event;
                var x=ev.clientX-disX;
                var y=ev.clientY-disY;
                var w=require("./range.js").range(x+disW,500,obj2.offsetWidth);
                var h=require("./range.js").range(y+disH,500,obj2.offsetWidth);
                obj1.style.width=w+"px";
                obj1.style.height=h+"px";
            }
            document.onmouseup=function(){
                document.onmousemove=document.onmouseup=null;
            }
        }
    }

    exports.scale=scale;
})
define(function(require,exports,module){

    function range(iNum,iMax,iMin){
        if(iNum>=iMax){
            return iMax;
        }
        if(iNum<=iMin){
            return iMin;
        }
        return iNum;
    }

    exports.range=range;
})

这里有三个实现功能的模块,还有一个主模块,是调用他们的。

 

posted @ 2016-11-03 16:18  小数点就是问题  阅读(186)  评论(0编辑  收藏  举报