推荐看这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

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