1. 为何要使用require.js |
刚开始的时候,网页须要用到不少不一样的插件,都是依次加载,须要注意其中的加载顺序即依赖关系。html
<script src="1.js"></script> <script src="2.js"></script> <script src="3.js"></script> <script src="4.js"></script> <script src="5.js"></script> <script src="6.js"></script>
这种写法有很大缺点。首先,加载的时候,浏览器会中止网页渲染,加载文件越多,网页失去响应的时间就会越长;jquery
其次,因为js文件之间存在依赖关系,所以必须严格保证加载顺序(好比上例的1.js要在2.js的前面),依赖性最大的数组
模块必定要放到最后加载,当依赖关系很复杂的时候,代码的编写和维护都会变得困难。浏览器
① 实现js文件的异步加载,避免网页失去响应;异步
② 管理模块之间的依赖性,便于代码的编写和维护。async
2. require.js的使用函数 |
2.1.1 使用require.js的第一步,是先去官方网站下载最新版本。requirejs
下载后,假定把它放在js子目录下面,就能够加载了。网站
<script src="js/require.js" defer async="true" ></script>
async属性代表这个文件须要异步加载,避免网页失去响应。IE不支持这个属性,只支持defer,因此把defer也写上。ui
也能够将这行代码放在网页底部加载。
2.1.2 加载require.js之后,下一步就要加载咱们本身的代码了。假定咱们本身的代码文件是main.js,也放在js目录下面。那么,只须要写成下面这样就好了:
<script src="js/require.js" data-main="js/main"></script>
data-main属性的做用是,指定网页程序的主模块。在上例中,就是js目录下面的main.js,这个文件会第一个被require.js加载。
因为require.js默认的文件后缀名是js,因此能够把main.js简写成main。
这是个人JS目录。
经过require方法,实现代码的模块加载,require()函数接受两个参数:
① 第一个参数是一个数组,表示所依赖的模块,例如["JQuery","underscore", “backbone”],即主模块依赖这两个模块;
② 第二个参数是一个回调函数,当前面指定的模块都加载成功后,它将被调用。加载的模块会以参数形式传入该函数,
从而在回调函数内部就可使用这些模块。回调函数就是整个页面的JS代码。
require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){ });
一、默认状况下,require.js假定这两个模块与main.js在同一个目录,文件名分别为jquery.js,underscore.js,而后自动加载。使用
require.config()方法,咱们能够对模块的加载行为进行自定义。
require.config是用来配置模块加载位置,简单点说就是给模块起一个更短更好记的名字。
require.config({
paths: {
"jquery": ["http://libs.baidu.com/jquery/2.0.3/jquery", "jquery-3.1.1.min"], "underscore": "underscore" } });
require.config()就写在主模块main.js的头部。参数就是一个对象,这个对象的paths 属性指定各个模块的加载路径。
paths还有一个重要的功能,就是能够配置多个路径,若是远程cdn库没有加载成功,能够加载本地的库。
二、上面的代码给出了三个模块的文件名,路径默认与main.js在同一个目录(js子目录)。若是这些模块在其余目录,
好比js/lib目录,则有两种写法。一种是逐一指定路径。
require.config({ paths: { "jquery": "lib/jquery", "underscore": "lib/underscore" } });
另外一种则是直接改变基目录baseUrl:
require.config({ baseUrl: "js/lib", paths: { "jquery": "jquery", "underscore": "underscore" } });
三、加载非规范化模块
shim属性,专门用来配置不兼容的模块。具体来讲,每一个模块要定义
① exports值(输出的变量名),代表这个模块外部调用时的名称;
② deps数组,代表该模块的依赖性。
好比,jQuery的插件能够这样定义:
require.config({ baseUrl: "js/lib", shim: { 'underscore':{ exports: '_' }, 'backbone': { deps: ['underscore', 'jquery'], exports: 'Backbone' } } paths: { "jquery": "jquery", "underscore": "underscore" } });
① 模块必须采用特定的define()函数来定义。若是一个模块不依赖其余模块,那么能够直接定义在define()函数之中。
define(function (){});
② 若是这个模块还依赖其余模块,那么define()函数的第一个参数,必须是一个数组,指明该模块的依赖性。
define(['jquery'], function(jquery){});
3. 例子 |
一、student.js文件:
define(function() { return { createStudent: function(name, gender) { return { name: name, gender: gender }; } }; });
二、class.js文件:
define(function() { var allStudents = []; return { classID: "001", department: "computer", addToClass: function(student) { allStudents.push(student); }, getClassSize: function() { return allStudents; } }; } );
三、manager.js文件:
define(["student", "class"], function(student, clz) { return { addNewStudent: function(name, gender) { clz.addToClass(student.creatStudent(name, gender)); }, getMyClassSize: function() { return clz.getClassSize(); } }; });
四、main.js文件:
require(["manager"], function(manager) { manager.addNewStudent("Jack", "男"); manager.addNewStudent("Rose", "女"); console.log(manager.getMyClassSize()); });