RequireJS 是一个 JS 文件,主要的功能是优化页面 JS 的载入,在平时我们在 html 页面使用的是 script 标签来载入 JS,如下示例:

<script src="1.js"></script>
<script src="2.js"></script>
<script src="3.js"></script>

这样的写法有很大的缺点。首先,加载的时候,浏览器会停止网页渲染,加载文件越多,网页失去响应的时间就会越长;其次,由于 js 文件之间存在依赖关系,因此必须严格保证加载顺序 (比如上例的 1.js 要在 2.js 的前面),依赖性最大的模块一定要放到最后加载,当依赖关系很复杂的时候,代码的编写和维护都会变得困难。
require.js 的诞生,就是为了解决这两个问题:
(1) 实现 js 文件的异步加载,避免网页失去响应;
(2) 管理模块之间的依赖性,便于代码的编写和维护。
使用 require.js 后你将不再使用 script 标签在 HTML 中引入 JS 文件,以及不用通过 script 标签顺序去管理依赖关系,我们要做的就是在页面中引入 require.js,然后做相应的配置即可,这样不仅可以简化页面的 js 导入配置,还可以提高网页的访问速度。
浏览器支持:
IE 6+ ………. compatible ✔
Firefox 2+ ….. compatible ✔
Safari 3.2+ …. compatible ✔
Chrome 3+ …… compatible ✔
Opera 10+ …… compatible ✔

RequireJS 应用

1 、首页我们在官网下载 RequireJS 应用,下载地址:http://requirejs.org/
2 、新建一个测试目录 rjs,结构如下:

3 、将下载的 require.js 放入 script 目录中

4 、在 rjs 目录下添加 project.html 文件,代码如下:

<!DOCTYPE html>
<html>
    <head>
        <title>RequireJs 测试</title>
        <!-- data-main attribute tells require.js to load
             scripts/main.js after require.js loads. -->
        <script data-main="scripts/main" src="scripts/require.js"></script>
    </head>
    <body>
        <h1>RequireJs 测试: 弹出 「RequireJs 测试」</h1>
    </body>
</html>

我们发现在 script 标签中增加了 data-main 属性,这个 main 指主模块或入口模块,data-main 属性的作用是,就是 js 目录下面的 main.js,这个文件会第一个被 require.js 加载。由于 require.js 默认的文件后缀名是 js,所以可以把 main.js 简写成 main,这个 main 指主模块或入口模块,好比 c 或 java 的主函数 main 。

5 、在 main.js 中添加如下代码:

require(["helper/util"], function(util) {
    //This function is called when scripts/helper/util.js is loaded.
    //If util.js calls define(), then this function is not fired until
    //util's dependencies have loaded, and the util argument will hold
    //the module value for "helper/util".
});

6 、在 scripts/helper/util.js 添加如下代码

alert("RequireJs 测试");

7 、用浏览器打开 project.html 可以看到 js 的弹出窗口。

8 、测试包下载:点击下载

8 、如果我们需要加载第三方库,本站已 jquery-1.10.1.min.js 为例,则下载 jquery-1.10.1.min.js, 将文件放置你的 helper 目录下,如下图:

修改 main.js 文件,代码如下:

require.config({
	baseUrl: 'scripts/helper',
    paths: {
        jquery: 'jquery-1.10.1.min',
        util: 'util'
    }
});

require(['jquery'], function($) {
    alert($().jquery);
});
require(["util"], function(util) {
    //加载 scripts/helper/util.js.
    //If util.js calls define(), then this function is not fired until
    //util's dependencies have loaded, and the util argument will hold
    //the module value for "helper/util".
});

baseUrl 为加载第三方库的路径
path 为各个包的名称
main.js 中就两个函数调用 require.config 和 require 。
require.config 用来配置一些参数,它将影响到 requirejs 库的一些行为。
require.config 的参数是一个 JS 对象,常用的配置有 baseUrl,paths 等。
这里配置了 paths 参数,使用模块名 「jquery」,其实际文件路径 jquery-1.10.1.min.js(后缀.js 可以省略) 。
我们知道 jQuery 从 1.7 后开始支持 AMD 规范,即如果 jQuery 作为一个 AMD 模块运行时,它的模块名是 「jquery」 。注意 「jquery」 是固定的,不能写 「jQuery」 或其它。
注:如果文件名 「jquery-1.7.2.js」 改为 「jquery.js」 就不必配置 paths 参数了。

AMD 模块的写法说明

require.js 加载的模块,采用 AMD 规范。也就是说,模块必须按照 AMD 的规定来写。
具体来说,就是模块必须采用特定的 define() 函数来定义。如果一个模块不依赖其他模块,那么可以直接定义在 define() 函数之中。
假定现在有一个 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() 函数的第一个参数,必须是一个数组,指明该模块的依赖性。

define(['myLib'], function(myLib){
    function foo(){
      myLib.doSomething();
    }
    return {
      foo : foo
    };
  });

当 require() 函数加载上面这个模块的时候,就会先加载 myLib.js 文件。

RequireJS 相关资源

RequireJS 首页:http://requirejs.org/
RequireJS 下载:http://requirejs.org/docs/download.html
RequireJS 文档:http://requirejs.org/docs/api.html
测试 DEMO: http://www.wpnoob.cn/wpsource/rjs.zip