随身笔记
随身笔记

requirejs教程

推荐看这txt:requirejs

首先要知道为什么要使用requirejs?
1,防止JS阻塞浏览器渲染。例如我们执行alert时,在alert代码之后的html就会停止加载页面的内容就不会在出现了。
2,防止页面加载过多JS相互依赖时,页面出现过多的<script type=”text/javascript”></script>页面变丑。

这是我们需要requirejs的2大理由,还有其他一些附加功能也方便我们维护JS。

 

require会定义三个变量:define,require,requirejs,其中require === requirejs,一般使用require更简短

  • define 定义一个模块
  • require 加载依赖模块,并执行加载完后的回调函数

/********************以下是基本用法********************/

require([],fn) //第一个参数必须是数组放索引0位置的先执行,第二个参数是回调函数也就是第一个参数里面的js加载成功后才执行。
<script type="text/javascript" src="js/require.js"></script> //首先加载requirejs
<script type="text/javascript">
  require(["js/a"]); // require就相当于加载器,a其实就是a.js不能加.js
  require(["js/a"],function(){ //参数1:加载的js,参数2:参数1的js加载成功后的回调函数
    alert("load finished");
  })
</script>

 

定义一个模块a.js 必须用define()

// a.js
define(function(){
   function fun1(){
     alert("it works");
   }
   fun1();
})

 

加载a.js模块    加载一个模块要用require()

require(["js/a"]);

需要注意:在AMD规范中优先加载依赖模块,也就是依赖前置,例如:

define(function (require, exports, module) {
  var a =require('./modulevv');  //1
  console.log('a');  //2
  var b =require('./moduleuu');  //3
  console.log('b');  //4
});

加载顺序是:1,3,2,4

只要是对外引入了依赖模块,就会优先加载依赖模块

不支持软加载,例如:

if(false){
   require('./moduleuu');
}
//就算是false,也会加载到moduleuu模块

 

为a.js模块返回一个回调

 require(["js/a"],function(){
    alert("load finished");   //加载a模块完成后返回一个回调函数
 })

 

给js文件自定义别名,先加载远程文件如果失败在加载本地文件。paths

在回调的函数中如果依赖jquery就在参数中添加$,如果还有别的依赖还可以添加。

 require.config({
   paths : {
    "jquery" : ["http://xx/jquery/2.0.3/jquery", "js/jquery"], //别名:['先加载1','备用地址1','备用地址2']
    "a" : "js/a" 
   }
})

require(["jquery","a"],function($){
  $(function(){
    alert("load finished"); 
  })
})

 

我们把require.config的配置加入到data-main后,以后每个页面使用下面的代码就行了

//创建一个 main.js以后这个就是入口了
<script data-main="js/main" src="js/require.js"></script>

 

解决不支持AMD插件的加载问题  

shim可以为requirejs加载非AMD规范的其他库

shim也可以解决模块依赖加载顺序的问题,例如jquery ui依赖jquery先执行后才能正常运行。

requirejs.config( {
  "shim": {
      "grid" : ["jquery"]  //grid依赖jquery先加载后才能执行
  }
});

 

我们用的最多的jquery插件很多都不支持AMD,而我们使用require.js默认是以AMD加载JS的,为了保证jquery插件在jquery.js加载完之后才执行,所以要使用shim

require.config({
  shim: {
      "jquery.form" : {
          deps : ["jquery"]         //jquery.form依赖jquery,也就是先加载jquery后才能加载jquery.form
          exports:["jquery.form"]  //表明这个模块外部调用时的名称
      },
      'avalon': {
          exports: "avalon" //将avalon对象在requirejs中暴露出来
      },
      'jquery-1.8.3.min':{
          exports: "$"
      }
  }

  require(['jquery.form'],function(){  //由于之前设置好了依赖关系可以直接加载jquery.form
                                       //这样默认先加载jquery,后才加载jquery.form
  });
})

也可以简写为:

// 简写用在avalon上没成功,还是不推荐简写吧
require.config({
  shim: {
    "jquery.form" : ["jquery"]   //这个是deps的简写
  }
})

这样配置之后我们就可以使用加载插件后的jquery了

require.config(["jquery", "jquery.form"], function($){
   $(function(){
     $("#form").ajaxSubmit({...});
   })
})

或者我们修改插件让插件支持AMD加载

;(function (factory) {
   if (typeof define === "function" && define.amd) {
      // AMD模式
      define([ "jquery" ], factory);
   } else {
      // 全局模式
      factory(jQuery);
   }
}(function ($) {
  /*---------我们代码---------------- */
    $.fn.extend({
       'color':function(value1,value2){
           $(this).css({'color':value1,'background':value2});
       }
    });
  /*---------我们代码---------------- */
}));

 

 

在老版本的jquery中,是没有继承AMD规范的,所以不能直接require[“jquery”],这时候就需要shim,比如我要是用underscore类库,但是他并没有实现AMD规范,那我们可以这样配置

require.config({
   shim: {
      "underscore" : {
         exports : "_";
      }
   }
})

这样配置后,我们就可以在其他模块中引用underscore模块:

require(["underscore"], function(_){
     _.each([1,2,3], alert);
})

 

shim中的init在不使用define()模块加载其他js

我们知道要在requirejs中加载js就必须定义在define()模块中,其他的模块才能加载

使用shim中的init就可以不需要,如:

// c.js

function c(){
  alert('11');
}


function w(){
  alert('11');
}

 

shim: {
   c:{ //这里指的是c.js
      init:function(){
         return{
            c0:c, //c和w指的是函数体的名称
            c1:w
          }
       }
    }
},


require(['c'],function(fn){ 
  console.log(fn);  //fn就是返回的对象 {c0:c,c1:w}
})

 

 

baseUrl路径

data-main="js/main" //这里的main.js里面所写的代码将在加载完reuqire.js后处理,这里需要到data-*自定义属性所以IE7以下不支持
如果需要每个页面都要加载到的JS代码就写在main.js即可。
这里注意以下路径问题"js/main"就相当于
require.config({
 baseUrl : "js"
})
也就是说原来需要 "js/a"现在只写成 "a"就行了

 

 

版本号更新

//要在加载require.js之前写上
<script>
 var require = {
 urlArgs: "ver=" + (new Date()).getTime()
 };
</script>  
<script data-main="js/main" src="js/require.js"></script>

 

版本号冲突问题map

require_map
map: {
   '*': {  //默认其他模块都使用此jq版本号
     'jquery': 'jquery-1.10.2.min'
   },
  'a': {  //指定a.js模块使用此版本号
     'jquery': 'jquery-1.8.3.min'
   }
 }

 

requirejs推荐一个JS一个模块,模块变量和方法之间的访问

例如:

a.js

define([],function(){   //*注意 即使没有要载入的模块默认也要加入空数组[]
   var obj={  //对象里面的变量和方法都是私有的
     wo:'我',
     run:function(){
       return this.wo+'-----';
     }
  };
 
  return{ //对外提供接口
    wo:obj.wo,
    run:obj.run()
  }
})

hello.js依赖a.js才能获取到数据

define(['a'],function(a){ 
  alert(a.run);
})

main.js开始加载hello.js

require(['hello']);

让某些模块优先比其他模块先加载

priority:['text','css']  //text.js和css.js模块优先比其他模块先加载

 

 

模块对外提供接口

*注意模块的命名不能使用module.js这种关键字名称

当 exports 与 init 同时存在的时候, exports 将被忽略。

 //home.js


define(['jquery'],function($){
   function run(){
      $(function(){
        alert( $().jquery );
      })
   }

   return{
     hello:run
   }
});
//在main.js中调用,
 require(["home"],function(home){
    home.hello();
 });

哪里都可以调用home.hello();只要加载就行

 

错误回调

如果当模块加载失败时候也需要回调处理

require(["mmRouter1","a1"], function(e,a) {

},function(err){
  var failedId = err.requireModules && err.requireModules[0];
  console.log(failedId)  //输出 错误的模块名称,有多少个模块出错就输出多少个 mmRouter1  a1
})

 

requirejs 提供DOM加载 类似jquery   ready()方法

domReady下载和用法:https://sdeno.com/?p=5034

 

config所有参数:https://github.com/jrburke/r.js/blob/master/build/example.build.js

http://www.w3cschool.cc/w3cnote/requirejs-tutorial-1.html

 http://www.runoob.com/w3cnote/requirejs-tutorial-1.html

 

其他教程:

http://www.uihtm.com/requirejs-plug-in.html

http://www.cnblogs.com/snandy/archive/2012/05/22/2513652.html

http://www.runoob.com/w3cnote/requirejs-tutorial-1.html

 

 

随身笔记

requirejs教程
推荐看这txt:requirejs 首先要知道为什么要使用requirejs? 1,防止JS阻塞浏览器渲染。例如我们执行alert时,在alert代码之后的html就会停止加载页面的内容就不会在出现了。 2,防止…
扫描二维码继续阅读
2015-05-12