require.js的诞生是为了解决两大问题
- 实现js文件的异步加载,避免网页失去响应;
- 管理模块之间的依赖性,便于代码的编写和维护。
引用
首先,点击‘下载’require.js.
这里可以采用网页底部加载的方式,或者1
<script src="js/require.js" defer async="true" ></script>
async属性表明这个文件需要异步加载,避免网页失去响应。IE不支持这个属性,只支持defer,所以把defer也写上。
定义模块目录
data-main指定网页中的主模块,在require.js加载完成后加载js目录下的main.js,默认后缀为js,所以写main即可,其他模块也是按照datamain的目录js/查找
1
<script src="js/require.js" data-main="js/main"></script>
定义baseUrl作为模块目录路径,config的使用见下文
1
2
3require.config({
baseUrl: 'js
})
这样的话,在页面引用时1
2<script src="js/require.js"></script>
<script src='js/main.js></script>
主模块的写法
1 | require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){ |
require()函数接受两个参数。
第一个参数是一个数组,表示所依赖的模块,依次填入依赖的模块名,异步加载依赖模块;
第二个参数是一个回调函数,当前面指定的模块都加载成功后,它将被调用。加载的模块返回的模块对象会以参数形式传入该函数,参数的顺序和加载的顺序相同,从而在回调函数内部就可以使用这些模块。
模块的加载
使用require.config()方法,我们可以对模块的加载行为进行自定义。require.config()就写在主模块(main.js)的头部或者单独文件。
需要单独定义requireConfig文件时,要在main.js之前引用,或作为main的依赖模块引入
使用baseUrl和path配置模块路径1
2
3
4
5
6
7require.config({
baseUrl: "js",
paths: {
"jquery": "lib/jquery",
"模块名": "模块路径"
}
});
path用于映射放于baseUrl下的模块名,模块路径不止可以是字符串,还可以是数组,写法如下
1 | path: { |
会对数组内容按顺序加载,第一个加载失败后会加载第二个,作为备用路径
模块加载之后会立刻执行
其他配置
- map
1
2
3
4
5
6
7
8
9
10
11map: {
'*': {
'jquery': 'libs/jquery'
},
'app/module1': {
'jquery': 'lib/jquery1'
},
'app/module2': {
'jquery': 'lib/jquery2'
}
},
使用map就可以实现,在加载不同的模块时,依赖不同版本的jquery
- waitSeconds
下载js等待的时间,默认为7s,如果设置为0,则禁用等待超时,会一直加载 - urlArgs
加载文件时,在文件名后面增加额外的query参数 - deps
依赖模块,在加载requireConfig之后作为依赖模块加载
模块定义
使用define方法定义AMD规范模块,如果一个模块不依赖其他模块,那么可以直接定义在define()函数之中
- 函数式定义
1
2
3
4
5
6
7define('name',['依赖模块'], function(){
return {
add : function (x,y){
return x+y;
};
}
})
模块名可以不写,依赖模块可有可无,可以直接define(function(){}),可以返回任何值,函数方法,对象,变量
在加载依赖模块之后,使用name.add(x, y)即可调用。
- 定义对象
1
2
3
4
5define({
name: 'zhangsan',
age: 20,
gender: '男'
})
加载非规范模块
加载不支持AMD的库,在用require()加载之前,要先用require.config()方法,定义它们的一些特征1
2
3
4
5
6
7
8
9
10
11require.config({
shim: {
'name': {
deps: ['jquery'],
exports: 'obj',
init: function($) {
return $;
}
}
}
});
- name, 模块名
- deps数组,依赖的模块。
- exports值(输出的变量名),表明这个模块外部调用时的名称,即模块对象名;
- init,初始化函数,返回的对象代替exports作为模块对象
以bootstrap为例,在没有返回对象和init函数的情况下,在加载时可以直接写deps数组
shim: {
‘bootstrap’: [‘jquery’]
}
举个栗子
1 | //app.js |