Sea.js

模块定义

在Sea.js中所有JavaScript文件都应该用模块的形式来书写,并且一个文件只包含一个模块。

使用全局函数define来定义模块:

define([id], [dependencies], factory);

id

当前模块的唯一标示可选。默认为文件的的访问路径。如果指定必须为顶级或绝对标示。

dependencies

当前模块所依赖的模块,是一个由模块组成的数组,可选。如果没有指定,模块加载器会从 factory.toString()中解析出数组。

factory

模块的工厂函数,模块初始化时,会调用一次该工厂函数。factory可以是函数,也可以是对象 字符串等,这时module.exports会直接设置为factory值。

define(function (require, exports, moudle) {
    //do someing
})

exports

exports用来向外提供模块的API.

define(function (require, exports) {
    //snip...
    exports.foo = 'bar';
    exports.doSomething = function() {};
});

除了给exports对象增加成员,还可以使用 return直接向外提供API

define(function (require, exports) {
    // ..
    return {
        foo : 'bar',
        doSomeing : function () {}
    }
});

如果return 语句是模块的唯一代码,可简化为:

define({
    foo : 'bar',
    doSomething : function () {}
});

** 下面的格式是错误的:

define(function (require, exports) {
    exports = {
        foo : 'bar',
        doSomething : function () {}
    }
});

模块加载器不能获取新赋给exports变量的值请使用 return 或 module.exports。

require

用来访问其他模块的API

define(function () {

    var test = require('test');

    test.doSomething();

})

require.async

该方法用来异步加载模块,加载完成后执行回调函数

define(function (require, exports, module) {
    
    //加载一个
    require.async('./test', function () {
        //....
    });
    //加载多个
    require.async(['./a', './b'], function () {
        //....
    });
})

require.resolve

使用require.resolve()的内部机制来解析并返回模板路径。该函数不会加载模块,只返回解析后的路径。

require.load

该方法可用来异步加载脚本,并在加载完成后,执行指定的回调函数。开发插件时,可以通过覆盖方法来实践自定义的资源加载。

require.constructor

有时候我们需要给所有require参数对象添加一些公用方法。这时,使用require.constructor来实现会非常方便。


module

module参数春村模块的元信息。有以下成员:

module.id

当前模块的唯一标示,返回此模块的exports

define(function (require, exports, module) {
    console.log(module.id); //http://path/to/this/file.js   
})

module.dependencies

module.dependencies是一个数组,表示当前模块的依赖列表

该数组只读,模块加载完成后,修改数组不会有任何效果。

module.exports

exports对象由模块系统创建,这并不能满足开发者的所有需求,有时候会希望exports是某个类的实力。这时可用module.exports来实现:

define(function (require, exports, module) {
    console.log(module.exports === exports); //true
    module.exports = new SomeClass();
    console.log(module.exports === exports); //false
});

module.exports需要同步进行,它不能放在回调函数里。

// test.js
define(funcion (require, exports, module) {
    setTimeout(function () {
        module.exports = {a : 'hello'}
    }, 0);
});

// app.js

define(function (require, exports, module) {
    var test = require('test');
    console.log(test.a) //undefined
});

module.constructor

有的时候,我们需要给所有 module参数添加一些公用属性或方法。在这种情况下,module.constructor可以很好地满足需求。比如:

extend.js:

define(function (require, exports, module) {
	var Module = module.constructor;
	Module.prototype.filename = function (arg) {
		var id = arg.id;
		console.log(id, 'id');
		var parts = id.split('/');
		console.log(parts[parts.length - 1], 'parts');
		return parts[parts.length - 1];
	}
	exports.filename = function (arg) {
		return module.filename(arg);
	}
});

test.js

define(function (require, exports, module) {
    var extend = require('./extend.js');
    console.log(extend.filename(module)); //输出test.js
});


关于seajs推荐阅读  here.

这是我的github上一个非常简单的例子 click here.

你可能感兴趣的:(cmd,seajs)