require.js 入门学习

require.js 介绍

//-------------------------------------------------------------

AMD规范

前端开发在近一两年发展的非常快,JavaScript作为主流的开发语言得到了前所未有的热捧。大量的前端框架出现了,这些框架都在尝试着解决一些前端开发中的共性问题,但是实现又不尽相同。在这个背景下,CommonJS社区诞生了,为了让前端框架发展的更加成熟,CommonJS鼓励开发人员一起在社区里为一些完成特定功能的框架制定规范。AMD(Asynchronous Module Definition)就是其中的一个规范。 

传统JavaScript代码的问题

让我们来看看一般情况下JavaScript代码是如何开发的:通过

有人可能会想到,加载这个文件,也可能造成网页失去响应。解决办法有两个,一个是把它放在网页底部加载,另一个是写成下面这样:

async属性表明这个文件需要异步加载,避免网页失去响应。IE不支持这个属性,只支持defer,所以把defer也写上。

这种写法虽然简单,但其实并不推荐,一般的写法还要再加个属性:

就像一个c程序总有一个 main 方法作为入口一样,上面这种写法,做了几件事情:
1、加载了 require-jquery.js 文件。注意,官方提供了 require.js和 jquery 的打包版本,推荐。
2、在加载之后,加载入口文件 js/main.js ,注意,main.js 写进去的时候,不需要后缀名。
你的所有其他 js 模块文件,都可以写在 main.js 里面,通过 main.js 加载。

require.js用法(一):define定义模块

define( ['wojilu.test1'], function( t1 ) {
    return {
        NewTest : function() { t1.MyTest();}
    };
});

通过文件名(不需要后缀名),引入了 wojilu.test1 命名空间,并给它取了别名 t1,然后在代码中使用 t1.MyTest() 方法。

按照 RequireJS 的规范,所有的模块定义,都必须放在 return {} 对象中。也就是说,你的代码都要写在 return 返回的 {} 对象里面。这会不会导致代码臃肿难看?当然不会。你可以重构一下,比如这样做:

define代码

define(['wojilu.test1'], function (t1) {
    function someFunc1() {
        // 实际主要代码
    }
    function someFunc2() {
        // 实际主要代码
    }
    // 通过 return 方式,将需要公开的函数暴露出来,供其他 js 调用
    return {
        NewTest: function () {
            t1.MyTest();
        },
        fun1: someFunc1,
        fun2: someFunc2
    };
});

require.js用法(二):require加载js文件

到此为止,我们遇到了两个关键词,一个是 define ,可以用来定义模块(命名空间),第一部分我们讲了;还有一个是 require,可以直接加载其他 js。它除了简单的用法:

之外,还有和 define 类似的复杂用法:
 

总结一下,define 是你定义自己的模块的时候使用,可以顺便加载其他js;require 直截了当,供你加载用的,它就是一个加载方法,加载的时候,可以定义别名。

require.js用法(三):require.config()对模块加载行为自定义

require.config()就写在主模块(main.js)的头部。参数就是一个对象,这个对象的paths属性指定各个模块的加载路径。

 require.config({
    paths: {
      "jquery": "lib/jquery.min",
      "underscore": "lib/underscore.min",
      "backbone": "lib/backbone.min"
    }
  });


另一种则是直接改变基目录(baseUrl)。

require.config({
    baseUrl: "js/lib",
    paths: {
      "jquery": "jquery.min",
      "underscore": "underscore.min",
      "backbone": "backbone.min"
    }
  });

如果某个模块在另一台主机上,也可以直接指定它的网址,比如:

require.config({
    paths: {
      "jquery": "https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min"
    }
});

require.js用法(四):define模块返回函数个数问题

1、define 的return只有一个函数,require的回调函数可以直接用别名代替该函数名。

2、define 的return当有多个函数,require的回调函数必须用别名调用所有的函数。

require(['selector','book'], function(query,book) {
    var els = query('.wrapper');

    book.fun1();
    book.fun2();
});
此处query 函数是1的情况,book 函数是2的情况。

require.js用法(五):加载的js文件不是AMD规范定义

当调用的js文件不是使用define定义,直接使用其全局变量或函数就可以了,没有影响。

这个时候只是控制了js 文件的加载顺序。


@@部分资料来自网络,感谢伟大的乐于分享的程序猿们!  

require.js:http://www.requirejs.org

require.js入门教程:http://www.verydemo.com/demo_c110_i2031.html

使用RequireJS优化Web应用前端:http://www.csdn.net/article/2012-09-27/2810404

require.js链接汇总:http://webeginner.diandian.com/post/2013-12-04/40060318517


你可能感兴趣的:(【JavaScript】)