Require.js的基本⽤法详解
⼀:什么是require.js
①:require.js是⼀个js脚本加载器,它遵循AMD(Asynchronous Module Definition)规范,实现js脚本的异步加载,不阻塞页⾯的渲染和其后的脚本的执⾏,并提供了在加载完成之后的执⾏相应回调函数的功能;
②:require.js要求js脚本必须要实现模块化,即⽂件化;⽽require.js的作⽤之⼀就是加载js模块,也就是js⽂件。
③:require.js可以管理js模块/⽂件之间的依赖;即不同的框架例如Jquery,AngularJs等采⽤了不同的语法,⽽使⽤这些语法的js⽂件在导⼊时必须排在Jquery.js或Angular.js之后才能顺利执⾏,require.js则能够解决排序依赖问题。
⼆:为什么要使⽤require.js
①:加载的时候,浏览器会停⽌⽹页渲染,原因如下:
在不使⽤require.js时,⽂件编写⽅式如下:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="a.js"></script>
</head>
<body>
<span>Hellow World</span>
</body>
</html>
在导⼊的a.js⽂件中:
(function(){
function fun1(){
alert("JS⽂件已⽣效");
}
fun1();
})()
在运⾏以上代码时我们可以注意到在alert弹出的提⽰框出现的时候,⽹页html的部分仍然是空⽩的,没有显⽰出任何内容,当我们点击确定之后"Hellow World"才会显⽰在⽹页中,这就是JS阻塞浏览器渲染导致的结果。加载⽂件越多,⽹页失去响应的时间就会越长。
②:由于js⽂件之间存在依赖关系,因此必须严格保证加载顺序,依赖性最⼤的模块⼀定要放到最后加载,当依赖关系很复杂的时候,代码的编写和维护都会变得困难。例如:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script type="text/javascript" src="js/jquery-1.10.2.js" ></script>
<script type="text/javascript" src="js/b.js" ></script>
</head>
<body>
<div id="div1" ></div>
</body>
</html>
在b.js⽂件中
$(function(){
$("#div1").css("background-color","blue");
})
为了使b.js中的代码⽣效,必须要把<script type="text/javascript" src="js/b.js" ></script>这⾏代码放到<script
type="text/javascript" src="js/jquery-1.10.2.js" ></script>后⾯,这样在使⽤的框架和js⽂件较多的时候,它们的导⼊顺序就会变得很⿇烦。
require.js的诞⽣就是为了解决上⾯所说的两个问题:
1.实现js⽂件的异步加载,避免⽹页失去响应;
2.管理模块之间的依赖性,便于代码的编写和维护。
三:require.js的加载
下载完成后,将它放在⽹站项⽬的js⼦⽂件夹下就可以使⽤了:号null啥意思
<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。
四:基本API
在上⼀部分中,我们引⼊了main.js⽂件,main.js的写法:
define(function(){
function fun1(){
alert("main.js已⽣效");
}
fun1();
})
这样,我们就通过define函数定义了⼀个模块,然后在页⾯中通过AMD规范定义的的require()函数使⽤:
require(["js/main"]);
⼀般情况下,它会依赖于其他的js框架,⽐如jquery等等,那么,我们这时就要在页⾯⽂件中。我们需要按照以下格式来写:
require(['A', 'B', 'C'], function (A, B, C){
// js代码
});
require()函数接受两个参数。第⼀个参数是⼀个数组,表⽰所依赖的框架,上例就是['A', 'B', 'C'],即main.js⾥的代码需要⽤到这三个模块;第⼆个参数是⼀个回调函数,当前⾯指定的模块都加载成功后,它将被调⽤。加载的模块会以参数形式传⼊该函数,从⽽在回调函数内部就可以使⽤这些模块。
require()会异步加载A,B,C三个模块,浏览器不会失去响应;它指定的回调函数,只有前⾯的模块都加载成功后,才会运⾏,解决了依赖性的问题。
下⾯。我们就以jquery为例,说明这个函数是怎样运⾏的:
require(['jquery'], function ($){
// jquery代码
});
require.js会先加载jQuery,然后再运⾏回调函数。main.js的代码就写在回调函数中。注意:require中的依赖是⼀个数组,即使只有⼀个依赖,你也必须使⽤数组来定义。plsql1104注册码
五:加载⽂件
在上⼀部分中,main.js的依赖模块是['jquery']。默认情况下,require.js会假定这个模块与main.js在同⼀个⽬录,⽂件名是jquery.js,然后⾃动加载,除此之外,我们可以通过fig()⽅法,我们可以对模块的加载⾏为进⾏⾃定
义,fig()就写在main.js的头部,它的参数是⼀个对象,这个对象的paths属性指定各个模块的加载路径。
paths: {
"jquery": "jquery.min",
"anjular": "anjular.min"
}
});
上述模块路径默认与main.js在同⼀个⽬录(js⼦⽬录)。如果这些模块在其他⽬录,⽐如js/lib⽬录,则有两种写法。⼀种是逐⼀指定路径:
paths: {
"jquery": "lib/jquery.min",
"anjular": "lib/anjular.min"
}
});
另⼀种则是直接改变根⽬录(baseUrl):
baseUrl: "js/lib",
paths: {
静态代码扫描工具 "jquery": "jquery.min",
"anjular": "anjular.min"
}
});
之前的例⼦中加载模块都是本地js,但是⼤部分情况下⽹页需要加载的JS可能来⾃本地服务器、其他⽹站或CDN,这样就不能通过这种⽅式来加载了,我们以加载⼀个jquery库为例:
paths : {
"jquery" : ["libs.baidu/jquery/2.0.3/jquery"]
}
})
上⾯的例⼦中重复出现了fig配置,如果每个页⾯中都加⼊配置,必然会⼗分⿇烦,requirejs提供了⼀种叫"主数据"的功能,我们可以将所有的fig配置放到main.js中,在页⾯中调⽤它,
<script data-main="js/main" src="js/require.js"></script>
就可以使每⼀个页⾯都使⽤这个配置,然后页⾯中就可以直接使⽤require来加载所有的短模块名。
六:AMD模块的写法
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));
});
如果这个js⽂件还依赖其他模块,那么define()函数的第⼀个参数,必须是⼀个数组,指明该模块的依赖性。
define(['jquery'], function($){
$("#div1").css("background-color","red");
})
当require()函数加载上⾯这个模块的时候,就会先加载jquery.js⽂件。
七:第三⽅模块
通过require加载的模块⼀般都需要符合AMD规范即使⽤define来申明模块,但是部分时候需要加载⾮AMD规范的js,这时候就需要⽤到另⼀个功能:shim:
1. ⾮AMD模块输出,将⾮标准的AMD模块变成可⽤的模块,例如:在⽼版本的jquery中,是没有继承AMD规范的,所以不能直接require["jquery"],这时候就需要shim
shim: {
"jquery" : {exports : "$"}
jquery下载文件插件}
})
这样配置后,我们就可以在其他模块中引⽤jquery模块:
konsole什么意思require(["jquery"], function(_){
$("#div1").css("background-color","red");
})
2.插件形式的⾮AMD模块,我们经常会⽤到jquery插件,⽽且这些插件基本都不符合AMD规范,⽐如jquery.form插件,这时候就需要将form插件加⼊到jquery中:
shim: {
"jquery.form" : {
deps : ["jquery"]
}
}
})
go和java后端开发劣势$(function(){
$("#form").ajaxSubmit({...});
})
})
以上就是require的基本⽤法详解。希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论