模块化方案

CommonJS

CommonJS的实现很简单。在CommonJS里面,文件和模块就是一一对应的关系。比方说,在同一个文件夹下,foo.js加载circle.js是这么写的:

foo.js:

    var circle = require("./circle.js");
    console.log('The area of a circle of radius 4 is' + circle.area(4));

circle.js:

    var PI = Math.PI;
    exports.area = function(r){
        return PI * r * r;
    };

    exports.circumference = function(r){
        return 2 * PI * r;
    };

在上面这个例子里面,circle.js这个模块导出了它的两个方法。注意,模块里的局部变量是私有的,比如circle.js里的PI.如果需要导出多个变量或者方法,可以采用module.exports的写法:


    module.exports = function(){
        return {
            //返回需要导出的变量或方法
        }
    }

AMD

AMD实现了JavaScript模块的异步加载,它的实现形式是:

    define(id?: String, dependencies?: String[], factory: Function|Object);

id定义了模块的名字,是选填项。

dependencies指定了该模块所依赖的模块,它也是选填项,如果缺省了,那么默认为:["require", "exports","module"].

factory定义了模块的方法,它可以是个函数,也可以是个对象。如果是函数的话,它所返回的值将会被这个模块导出。

具名模块:

    define('myModule', ['jquery'], function($) {
        // $ is the export of the jquery module.
        $('body').text('hello world');
    });
    // and use it
    define(['myModule'], function(myModule) {});

多个依赖:

    define(['jquery', './math.js'], function($, math) {
        // $ and math are the exports of the jquery module.
        $('body').text('hello world');
    });

导出自身:

    define(['jquery'], function($) {
        var HelloWorldize = function(selector){
            $(selector).text('hello world');
        };
        return HelloWorldize;
    });