RequireJS认识及使用

    最近在写前端这个坑,因为使用大量的框架并且自己的写的工具js也需要引入导致界面臃肿并且稍不注意就会出现冲突。所以使用requirejs来解决这个问题。

    AMD规范:全称是Asynchronous Module Definition,即异步模块加载机制。从它的规范描述页面看,AMD很短也很简单,但它却完整描述了模块的定义,依赖关系,引用关系以及加载机制。requirejs就实现了这个规范。

    下载地址:http://www.requirejs.cn/docs/download.html

    一、AMD作为一个规范,只定义了API,二不管心其实现。define函数

define([module-name?], [array-of-dependencies?], [module-factory-or-object]);

    module-name:模块标识,可以省略。

    array-of-dependencies:所依赖的模块,是数组的,可以省略。

    module-or-object:模块的实现,或者是JavaScript的一个对象。

    define具有异步性。define函数执行时,首先回异步调用第二个参数的中罗列的依赖模块,当所有模块别载入完之后,如果第三个函数时回调函数则执行;然后告诉系统模块可用,也通知依赖自己的模块可用。


二、加载

    使用requirejs的第一步,就是在界面中引入requirejs。

    <script src="js/require.js"></script>

    这种加载方式是阻塞式加载,加载当前js的时候会影响主界面的加载,所以script标签一般放在最后,或者定义为异步加载,defer asnyc。

    当requirejs自身完成加载以后就会检查是否有data-main参数这个就是我们要引入的js的一个总和了。

    【内部机制】

    在RequireJS内部,会使用head.appendChild()将每一个模块依赖加载为一个script标签。RequireJS等待所有的依赖加载完毕,计算出模块定义函数正确调用顺序,然后依次调用它们。

    一般使用了requirejs来管理js那么尽量都由他来管理,否者在界面中的js依赖就不能保证,因为requirejs使用异步加载。

    三、模块

    把js定义为一个模块,可以有效的避免全局名称污染和冲突。因为可以明确起依赖关系。require的define模块的定义 

define('module1',["jquery"],function($){
   console.log(11);
});

    模块定义好之后的使用 

require(["module1"], function(){
   
});

就会打印出11。

    四、路径的配置。

    1.使用require.cinfig

require.config({
   baseUrl :"resource/external/plugin",
   paths : {
      "validateBox" : "ta-validate-all/validateBox",
   },
   shime :{
      "ztree.core.min" : ["jquery"]
   }
});

    baseUrl:基础路径。

    paths:定义模块的路径

    shime:改造不支持amd的js,并且添加依赖

    五、在项目中具体使用

    1.引入requirejs,使用data-mian的话自己定义的baseUrl 就无效了。变为mian.js所在的目录

<script src="resources/plugin/require.js"></script>
<script src="resources/plugin/main.js"></script>

    2.在main.js中定义模块路径具体如下

    

require.config({
    baseUrl:"resources/plugin",
    paths:{
        "jquery":"jquery/js/jquery-3.3.1",
        "jcookie":"jquery/js/jquery.cookie",
        "bootstrap":"bootstrap/js/bootstrap",
        "ztree":"zTree/js/jquery.ztree.all",
        "login":"login/js/login",
        "index":"index/js/index"
    },
    shim:{
        "ztree" : {
            deps: ["jquery"],/*依赖*/
            exports:"ztree"/*输出的对象名称*/
        }
    },
    waitSeconds : 0/*禁用等待超时*/
});

比如在界面中使用jquery

<script type="text/javascript">
    require(["jquery"],function($){});
</script>

定义模块

/*登录页的js*/
/*自执行函数*/
(function(factory){
    if(typeof define === "function" && define.amd){/*判断是否有require的环境*/
        define(["jquery"],factory);
    }else{
        factory(jQuery);
    }
})(function($){/*回调函数*/
    
});
使用自执行函数可以判断是否有requirejs环境, 在没有requirejs环境下也可以使用。

    

    

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值