(1)实现js文件的异步加载,避免网页失去响应;
(2)管理模块之间的依赖性,便于代码的编写和维护。
加载require:
加载require的时候有可能造成网页失去响应,解决办法:1.<script src="js/require.js"></script>放在页面的底部加载。2.<script src="js/require.js" defer async="true" ></script>用这种方式来编写。其中defer兼容IE
使用方法:
1.指定网页主模块:<script src="js/require.js" data-main="main"></script>
指定main.js为主模块,这个文件会第一个被require.js加载。由于require.js默认的文件后缀名是js,所以可以把main.js简写成main
2.编写主模块:
主模块依赖于其他模块,这时就要使用AMD规范定义的的require()函数。
例:
require(['moduleA', 'moduleB', 'moduleC'], function (moduleA, moduleB, moduleC){
// some code here
});
如上所示,require()函数接受两个参数。
第一个参数是一个数组,表示所依赖的模块,上例就是['moduleA', 'moduleB', 'moduleC'],即主模块依赖这三个模块;
第二个参数是一个回调函数,当前面指定的模块都加载成功后,它将被调用。加载的模块会以参数形式传入该函数,从而在回调函数内部就可以使用这些模块。
require()异步加载moduleA,moduleB和moduleC,浏览器不会失去响应;它指定的回调函数,只有前面的模块都加载成功后,才会运行,解决了依赖性的问题。
3.加载规范模块
使用require.config()方法,可以对模块的加载行为进行自定义。require.config()就写在主模块(main.js)的头部。参数就是一个对象,这个对象的paths属性指定各个模块的加载路径。
例:
require.config({
paths: {
"jquery": "jquery.min", "underscore": "underscore.min","backbone": "backbone.min"
}
});
如果这些模块在其他目录,比如js/lib目录,则有两种写法。一种是逐一指定路径。一种是指定路径后再指定加载路径。
例:
require.config({
paths: {
"jquery": "lib/jquery.min",
"underscore":"lib/underscore.min",
"backbone":"lib/backbone.min"
}
});
require.config({ baseUrl: "js/lib", paths: { "jquery":"jquery.min", "underscore":"underscore.min", "backbone": "backbone.min" } });
require.js加载的模块,采用AMD规范。也就是说,模块必须按照AMD的规定来写。
具体来说,就是模块必须采用特定的define()函数来定义。如果一个模块不依赖其他模块,那么可以直接定义在define()函数之中。例:如果这个模块还依赖其他模块,那么define()函数的第一个参数,必须是一个数组,指明该模块的依赖性。参考第二条define(function (){ var add = function (x,y){ return x+y; }; return { add: add }; });
当require()函数加载上面这个模块的时候,就会先加载myLib.js文件。例:
define(['myLib'], function(myLib){ function foo(){ myLib.doSomething(); } return { foo : foo }; });
4.加载非规范模块如果这个模块是非规范模块,必须要先定义它的特征;
require.config()接受一个配置对象,这个对象除了有前面说过的paths属性之外,还有一个shim属性,专门用来
配置不兼容的模块。具体来说,每个模块要定义
(1)exports值(输出的变量名),表明这个模块外部调用时的名称;
(2)deps数组,表明该模块的依赖性。例子:
shim: { 'jquery.scroll': { deps: ['jquery'], exports: 'jQuery.fn.scroll' } }