本文只是下面这篇教程的简化版,只提取核心部分,主要为了方便自己随时参考
原帖
http://www.cnblogs.com/leoo2sk/archive/2011/06/27/write-javascript-with-seajs.html (张洋)

SeaJs下载

https://github.com/seajs/seajs/
https://github.com/seajs/seajs/tree/master/build

示例
假设开发一个Web应用TinyApp,在TinyApp中使用jQuery框架。
TinyApp的首页会用到module1.js,module1.js依赖module2.js和module3.js,同时module3.js依赖module4.js。

//index.html
<script src="./sea.js"></script>
<script>
seajs.use('./init', function(init) {
        init.initPage();
});
</script>

//jquery.js
define(function(require, exports, module) = {
        //原jquery.js代码...
        module.exports = $.noConflict(true);
});

//init.js
define(function(require, exports, module) = {
        var $ = require('jquery');
        var m1 = require('module1');

        exports.initPage = function() {
                $('.content').html(m1.run());    
        }
});

//module1.js
define(function(require, exports, module) = {
        var $ = require('jquery');
        var m2 = require('module2');
        var m3 = require('module3');

        exports.run = function() {
                return $.merge(['module1'], $.merge(m2.run(), m3.run()));    
        }
});

//其他module略...


模块定义函数define
define(function(require, exports, module) {    //function为工厂函数
        //code of the module...
});

工厂函数factory解析
require——模块加载函数,用于记载依赖模块。
exports——接口点,将数据或方法定义在其上则将其暴露给外部调用。
module——是一个对象,存储模块的元数据。

module具体如下:
module.id——模块的ID。
module.dependencies——一个数组,存储了此模块依赖的所有模块的ID列表。
module.exports——与exports指向同一个对象。

三种编写模块的模式

1.基于exports的模式
define(function(require, exports, module) {
        var a = require('a'); //引入a模块
        var b = require('b'); //引入b模块
        var data1 = 1; //私有数据
        var func1 = function() { //私有方法
                return a.run(data1);
        }
        exports.data2 = 2; //公共数据
        exports.func2 = function() { //公共方法
                return 'hello';
        }
});

2.直接返回一个对象表示模块
define(function(require) {
        //...代码省略...
        return {
                data2: 2,
                func2: function() {
                        return 'hello';
                }
        };
});

3.模块定义没有其它代码,只返回一个对象(对于定义纯JSON数据的模块非常合适)
define({
        data: 1,
        func: function() {
                return 'hello';
        }
});


模块寻址

1.绝对地址
require("http://example/js/a"); //不用加“.js”


2.相对地址
  例如在“http://example/js/b.js”中载入
require("./c");

  则载入“http://example/js/c.js”

3.基址地址
  seajs.config()中指定 base

4.不会自动添加“.js”的情况
  (1)载入css时
  (2)含有“?”时
  (3)路径以”#”结尾时

三个载入模块的API

seajs.use、require和require.async

1.seajs.use - 用于载入入口模块

    //单一模式
    seajs.use('./a');

    //回调模式
    seajs.use('./a', function(a) {
        a.run();
    });

    //多模块模式
    seajs.use(['./a', './b'], function(a, b) {
        a.run();
        b.run();
    });


  给sea.js的script标签加“data-main”属性省略seajs.use
    <script src="./sea.js" data-main="./init"></script>


2.require - 当一个模块中需要用到其它模块时一般用require加载
  传给require的路径标识必须是字符串字面量,不能是表达式

3.require.async - js文件在用到时才下载,实现代码按需加载
require.async('/path/to/module/file', function(m) {
        //code of callback...
});

全局配置
seajs.config({
        base: 'path/to/jslib/',
        alias: {
            'app': 'path/to/app/'
        },
        charset: 'utf-8',
        timeout: 20000,
        debug: false
});

base表示基址寻址时的基址路径
alias可以对较长的常用路径设置缩写。
charset表示下载js时script标签的charset属性。
timeout表示下载文件的最大时长,以毫秒为单位。
debug表示是否工作在调试模式下。