一、为什么要使用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模块可以并行加载所有依赖模块,从而很好地提高页面加载性能:

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 }; });

五、require.js插件

require.js还提供一系列插件,实现一些特定的功能。

比如domready插件,可以让回调函数在页面DOM结构加载完成后再运行。

require(['domready!'], function (doc){

   // called once the DOM is ready

});
02-14 04:00