一:什么是require.jsjavascript
①:require.js是一个js脚本加载器,它遵循AMD(Asynchronous Module Definition)规范,实现js脚本的异步加载,不阻塞页面的渲染和其后的脚本的执行,并提供了在加载完成以后的执行相应回调函数的功能;css
②:require.js要求js脚本必需要实现模块化,即文件化;而require.js的做用之一就是加载js模块,也就是js文件。html
③:require.js能够管理js模块/文件之间的依赖;即不一样的框架例如Jquery,AngularJs等采用了不一样的语法,而使用这些语法的js文件在导入时必须排在Jquery.js或Angular.js以后才能顺利执行,require.js则可以解决排序依赖问题。java
二:为何要使用require.jsjquery
①:加载的时候,浏览器会中止网页渲染,缘由以下:ajax
在不使用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" style="width: 100px;height: 100px;background-color: red;"></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的加载
①:首先,咱们要去官网下载最新的版本,官方网址:http://requirejs.org/docs/download.html
下载完成后,将它放在网站项目的js子文件夹下就可使用了:
<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中的依赖是一个数组,即便只有一个依赖,你也必须使用数组来定义。
五:加载文件
在上一部分中,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" } });
上述模块路径默认与main.js在同一个目录(js子目录)。若是这些模块在其余目录,好比js/lib目录,则有两种写法。一种是逐一指定路径:
require.config({ paths: { "jquery": "lib/jquery.min", "anjular": "lib/anjular.min" } });
另外一种则是直接改变根目录(baseUrl):
require.config({ baseUrl: "js/lib", paths: { "jquery": "jquery.min", "anjular": "anjular.min" } });
以前的例子中加载模块都是本地js,可是大部分状况下网页须要加载的JS可能来自本地服务器、其余网站或CDN,这样就不能经过这种方式来加载了,咱们以加载一个jquery库为例:
require.config({ paths : { "jquery" : ["http://libs.baidu.com/jquery/2.0.3/jquery"] } })
上面的例子中重复出现了require.config
配置,若是每一个页面中都加入配置,必然会十分麻烦,requirejs提供了一种叫"主数据"的功能,咱们能够将全部的require.config
配置放到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
require.config({ shim: { "jquery" : {exports : "$"} } })
这样配置后,咱们就能够在其余模块中引用jquery模块:
require(["jquery"], function(_){ $("#div1").css("background-color","red"); })
2.插件形式的非AMD模块,咱们常常会用到jquery插件,并且这些插件基本都不符合AMD规范,好比jquery.form插件,这时候就须要将form插件加入到jquery中:
require.config({ shim: { "jquery.form" : { deps : ["jquery"] } } })
require.config(["jquery", "jquery.form"], function($){ $(function(){ $("#form").ajaxSubmit({...}); }) })
以上就是require的基本用法详解。