原本是作后端的,拿到一个偏前端的项目,js文件里好多define和require,看的有点蒙,只能本身动手查找资源了,了解这究竟是个什么,它能作什么?javascript
1.什么是require.js?css
1):require.js是一个js脚本加载器,它遵循AMD(Asynchronous Module Definition)规范,实现js脚本的异步加载,不阻塞页面的渲染和其后的脚本的执行,并提供了在加载完成以后的执行相应回调函数的功能;html
2):require.js要求js脚本必需要实现模块化,即文件化;而require.js的做用之一就是加载js模块,也就是js文件。前端
3):require.js能够管理js模块/文件之间的依赖;即不一样的框架例如Jquery,AngularJs等采用了不一样的语法,而使用这些语法的js文件在导入时必须排在Jquery.js或Angular.js以后才能顺利执行,require.js则可以解决排序依赖问题。java
4) : RequireJS 是一个JavaScript模块加载器。它很是适合在浏览器中使用,但它也能够用在其余脚本环境,就像 Rhino and Node。使用RequireJS加载模块化脚本将提升代码的加载速度和质量。jquery
2.为何要使用require.js?后端
<!DOCTYPE html>
<html>
<head>
<script type=
"text/javascript"
src=
"a.js"
></script>
</head>
<body>
<span>Hellow World</span>
</body>
</html>
require.js的诞生就是为了解决上面所说的两个问题:数组
1).实现js文件的异步加载,避免网页失去响应;浏览器
2).管理模块之间的依赖性,便于代码的编写和维护。服务器
三、require.js的使用-加载
官方网址:http://requirejs.org/docs/download.html
<script src=
"js/require.js"
></script>
这里可能会遇到一个问题:加载这个文件,也可能形成网页失去响应,这个问题的解决办法有两种:
1)<script src=
"js/require.js"
defer async=
"true"
></script>
async属性和defer属性代表这个文件须要异步加载,避免网页失去响应。IE只支持defer属性,而不支持async属性。
2)将文件放到网页底部加载,加载完require.js以后,咱们就能够加载本身的代码了,假设咱们本身的js文件命名为main.js,一样放于js文件夹下
<script src=
"js/require.js"
data-main=
"js/main"
></script>
data-main属性的做用是指定网页程序的主模块。即js目录下面的main.js,这个文件会第一个被require.js加载。因为require.js默认的文件后缀名是js,因此能够省略掉".js"简写成main
4.require.js的使用-API
3步中引入了main.js文件,main.js的写法
define(
function
(){
function
fun1(){
alert(
"main.js已生效"
);
}
fun1();
})
require([
"js/main"
]);
require([
'jquery'
,
'B'
,
'C'
],
function
(A, B, C){
// js代码
});
require()函数接受两个参数。第一个参数是一个数组,表示所依赖的框架,上例就是['A', 'B', 'C'],即main.js里的代码须要用到这三个模块;第二个参数是一个回调函数,当前面指定的模块都加载成功后,它将被调用。加载的模块会以参数形式传入该函数,从而在回调函数内部就可使用这些模块。
require()会异步加载A,B,C三个模块,浏览器不会失去响应;它指定的回调函数,只有前面的模块都加载成功后,才会运行,解决了依赖性的问题。
require.js会先加载jQuery,而后再运行回调函数。main.js的代码就写在回调函数中。注意:require中的依赖是一个数组,即便只有一个依赖,你也必须使用数组来定义。
五、加载文件
main.js的依赖模块是['jquery']。默认状况下,require.js会假定这个模块与main.js在同一个目录,文件名是 jquery.js,而后自动加载,除此以外,咱们能够经过require.config()方法,咱们能够对模块的加载行为进行自定义,require.config()就写在main.js的头部,它的参数是一个对象,这个对象的paths属性指定各个模块的加载路径。
require.config({
paths: {
"jquery"
:
"jquery.min"
,
"anjular"
:
"anjular.min"
}
});
require.config({
paths: {
"jquery"
:
"lib/jquery.min"
,
"anjular"
:
"lib/anjular.min"
}
});
require.config({
baseUrl:
"js/lib"
,
paths: {
"jquery"
:
"jquery.min"
,
"anjular"
:
"anjular.min"
}
});
require.config({
paths : {
}
})
<script data-main=
"js/main"
src=
"js/require.js"
></script>
require.js加载的模块,采用AMD规范,也就是说,模块必须按照AMD的规定来写。具体来讲,就是模块必须采用特定的define()函数来定义。若是一个模块不依赖其余模块,那么能够直接定义在define()函数之中。假定如今有一个math.js文件,它定义了一个math模块。那么,math.js就要这样定义:
define(
function
(){
var
add =
function
(x,y){
return
x+y;
};
return
{
add: add
};
});
require([
'math'
],
function
(math){
alert(math.add(1,1));
});
define([
'jquery'
],
function
($){
$(
"#div1"
).css(
"background-color"
,
"red"
);
})