一、为什么要使用require.js?
1、在大型项目中,往往一个页面需要加载很多个js文件,而页面加载的时候,浏览器会停止网页渲染,因此加载文件越多,导致网页失去响应的时间就会越长;
2、其次,由于js文件之间存在依赖关系,因此必须严格保证加载顺序(比如上例的1.js要在2.js的前面),依赖性最大的模块一定要放到最后加载,当依赖关系很复杂的时候,代码的编写和维护都会变得困难。
所以,在开发大型Javascript应用程序的时候,就必须引入模块化机制。关于前端模块化的前世今生,可以参考此博客:https://www.cnblogs.com/scq000/p/10647128.html
二、require.js能干什么?
1、RequireJS是遵循AMD规范的模块化工具, 在导入模块的时候,会先加载对应的依赖模块,然后再执行接下来的代码,同时AMD模块可以并行加载所有依赖模块,防止js加载阻塞页面渲染,从而很好地提高页面加载性能:
2、管理模块之间的依赖性,便于代码的编写和维护。
RequireJS的基本思想是,通过define方法,将代码定义为模块;通过require方法,实现代码的模块加载。
三、require.js的加载:
<script src="js/require.js"></script>
引用js的过程,为了避免网页失去响应,我们可以将代码卸载网页底部进行加载,也可以采用异步加载,设定async属性。IE不支持这个属性,只支持defer,所以把defer也写上。
<script src="js/require.js" defer async="true"></script>
加载require.js以后,下一步就要加载我们自己的代码了。假定我们的代码文件时main.js,且与requireJS放置在相同的路径js文件夹下,可以写成下面这样:
<script src="js/require.js" data-main="js/main"></script>
data-main属性的作用是,指定网页程序的主模块。在上例中,就是js目录下面的main.js,这个文件会第一个被require.js加载。由于require.js默认的文件后缀名是js,所以可以把main.js简写成main。
四、主模块的写法
(一)主模块中依赖的加载
主模块依赖于其他模块,这时就要使用AMD规范定义的的require()函数。
// main.js require(['moduleA', 'moduleB', 'moduleC'], function (moduleA, moduleB, moduleC){ // some code here });
比如,假定主模块依赖jquery、underscore和backbone这三个模块,main.js就可以这样写:
require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){ // some code here });
require.js会先加载jQuery、underscore和backbone,然后再运行回调函数。主模块的代码就写在回调函数中。
使用require.config()方法,我们可以对模块的加载行为进行自定义。require.config()就写在主模块的头部。参数就是一个对象,这个对象的paths属性指定各个模块的加载路径。
// 如果不依赖其他模块,可以直接在主模块中写js代码 // alert("加载成功!"); // 真正常见的情况是,主模块依赖于其他模块,这时就要使用AMD规范定义的的require()函数。 require.config({ // 假如要加载的模块与主模块不在一个文件夹,可以改变基目录baseUrl为要加载的模块目录 // baseURL:"", paths:{ "jquery":"jquery-3.2.1.js", } })
(二)模块的定义与加载
1、define()函数
require.js加载的模块,采用AMD规范。也就是说,模块必须按照AMD的规定来写。
其中,模块必须采用特定的define()函数来定义。如果一个模块不依赖其他模块,那么可以直接定义在define()函数之中。
关于define函数的详解,可以参考此博客:https://www.cnblogs.com/minghui007/p/7127762.html
假定现在有一个math.js文件,它定义了一个math模块。那么,math.js就要这样写:
//math.js
define(function (){ var add = function (x,y){ return x+y; }; return { add: add }; });
加载方法如下:
// main.js require(['math'], function (math){ alert(math.add(1,1)); });
如果这个模块还依赖其他模块,那么define()函数的第一个参数,必须是一个数组,指明该模块的依赖性。
//math.js
define(['jquery'], function($) { 'use strict'; var add = function (x,y){ return x+y; }; return{ add: add }; });