sea.js入门

Sea.js的配置

<script src="sea.js"></script>

<script> seajs.use("main"); </script>

 

用script标签引入 sea.js,然后用seajs.use进行配置。 
seajs.use主要用于载入入口模块。入口模块相当于C程序的main函数,同时也是整个模块依赖树的根。上面在TinyApp小例子中,init就是入口模块。seajs.use用法如下:

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

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

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

 

一般seajs.use只用在页面载入入口模块,SeaJS会顺着入口模块解析所有依赖模块并将它们加载。

如果入口模块只有一个,也可以通过给引入sea.js的script标签加入”data-main”属性来省略seajs.use,例如上面的代码也可以改为如下写法:

<script src="sea.js" data-main="main.js"></script>

 

不过我一直没有成功过,具体原因不明。

seajs.config seajs.config(options)

用来进行配置的方法。

seajs.config({

// 别名配置 
alias: { 
‘es5-safe’: ‘gallery/es5-safe/0.9.3/es5-safe’, 
‘json’: ‘gallery/json/1.0.2/json’, 
jQuery’: ‘jquery/jquery/1.10.1/jquery’ 
},

// 路径配置 
paths: { 
‘gallery’: ‘https://a.alipayobjects.com/gallery’ 
},

// 变量配置 
vars: { 
‘locale’: ‘zh-cn’ 
},

// 映射配置 
map: [ 
[‘http://example.com/js/app/‘, ‘http://localhost/js/app/‘] 
],

// 预加载项 
preload: [ 
Function.prototype.bind ? ” : ‘es5-safe’, 
this.JSON ? ” : ‘json’ 
],

// 调试模式 
debug: true,

// Sea.js 的基础路径 
base: ‘http://example.com/path/to/base/‘,

// 文件编码 
charset: ‘utf-8’ 
});

支持以下配置选项: 
alias Object

当模块标识很长时,可以使用 alias 来简化。

seajs.config({ 
alias: { 
‘jquery’: ‘jquery/jquery/1.10.1/jquery’, 
‘app/biz’: ‘http://path/to/app/biz.js‘, 

});

define(function(require, exports, module) {

var $ = require(‘jquery’); 
//=> 加载的是 http://path/to/base/jquery/jquery/1.10.1/jquery.js

var biz = require(‘app/biz’); 
//=> 加载的是 http://path/to/app/biz.js

});

使用 alias,可以让文件的真实路径与调用标识分开,有利于统一维护。 
paths Object

当目录比较深,或需要跨目录调用模块时,可以使用 paths 来简化书写。

seajs.config({ 
paths: { 
‘gallery’: ‘https://a.alipayobjects.com/gallery‘, 
‘app’: ‘path/to/app’, 

});

define(function(require, exports, module) {

var underscore = require(‘gallery/underscore’); 
//=> 加载的是 https://a.alipayobjects.com/gallery/underscore.js

var biz = require(‘app/biz’); 
//=> 加载的是 path/to/app/biz.js

});

paths 配置可以结合 alias 配置一起使用,让模块引用非常方便。 
vars Object

有些场景下,模块路径在运行时才能确定,这时可以使用 vars 变量来配置。

seajs.config({ 
vars: { 
‘locale’: ‘zh-cn’ 

});

define(function(require, exports, module) {

var lang = require(‘./i18n/{locale}.js’); 
//=> 加载的是 path/to/i18n/zh-cn.js

});

vars 配置的是模块标识中的变量值,在模块标识中用 {key} 来表示变量。 
map Array

该配置可对模块路径进行映射修改,可用于路径转换、在线调试等。

seajs.config({ 
map: [ 
[ ‘.js’, ‘-debug.js’ ] 

});

define(function(require, exports, module) {

var a = require(‘./a’); 
//=> 加载的是 path/to/a-debug.js

});

更多用法可参考:调试实践 
preload Array

使用 preload 配置项,可以在普通模块加载前,提前加载并初始化好指定模块。

// 在老浏览器中,提前加载好 ES5 和 json 模块 
seajs.config({ 
preload: [ 
Function.prototype.bind ? ” : ‘es5-safe’, 
this.JSON ? ” : ‘json’ 

});

preload 中的空字符串会被忽略掉。

注意:preload 中的配置,需要等到 use 时才加载。比如:

seajs.config({ 
preload: ‘a’ 
});

// 在加载 b 之前,会确保模块 a 已经加载并执行好 
seajs.use(‘./b’);

preload 配置不能放在模块文件里面:

seajs.config({ 
preload: ‘a’ 
});

define(function(require, exports) { 
// 此处执行时,不能保证模块 a 已经加载并执行好 
});

debug Boolean

值为 true 时,加载器不会删除动态插入的 script 标签。插件也可以根据 debug 配置,来决策 log 等信息的输出。 
base String

Sea.js 在解析顶级标识时,会相对 base 路径来解析。详情请参阅 模块标识

注意:一般请不要配置 base 路径,把 sea.js 放在合适的路径往往更简单一致。 
charset String | Function

获取模块文件时,

模块的定义及编写

模块定义函数define

SeaJS中使用“define”函数定义一个模块。define可以接收三个参数: 
复制代码 代码如下:

上面是我从SeaJS源码中摘录出来的,define可以接收的参数分别是模块ID,依赖模块数组及工厂函数。

define对于不同参数个数的解析规则如下: 
如果只有一个参数,则赋值给factory。 
如果有两个参数,第二个赋值给factory;第一个如果是array则赋值给deps,否则赋值给id。 
如果有三个参数,则分别赋值给id,deps和factory。 
但是,包括SeaJS的官方示例在内几乎所有用到define的地方都只传递一个工厂函数进去,类似与如下代码: 
复制代码 代码如下:

define(function(require, exports, module) { 
//code of the module… 
});

个人建议遵循SeaJS官方示例的标准,用一个参数的define定义模块。那么id和deps会怎么处理呢? 
id是一个模块的标识字符串,define只有一个参数时,id会被默认赋值为此js文件的绝对路径。如example.com下的a.js文件中使用define定义模块,则这个模块的ID会赋值为 http://example.com/a.js ,没有特别的必要建议不要传入id。deps一般也不需要传入,需要用到的模块用require加载即可。

工厂函数factory解析

工厂函数是模块的主体和重点。在只传递一个参数给define时(推荐写法),这个参数就是工厂函数,此时工厂函数的三个参数分别是: 
1.require——模块加载函数,用于记载依赖模块。 
2.exports——接口点,将数据或方法定义在其上则将其暴露给外部调用。 
3.module——模块的元数据。 
这三个参数可以根据需要选择是否需要显示指定。 
下面说一下module。module是一个对象,存储了模块的元信息,具体如下: 
1.module.id——模块的ID。 
2.module.dependencies——一个数组,存储了此模块依赖的所有模块的ID列表。 
3.module.exports——与exports指向同一个对象。

三种编写模块的模式

第一种定义模块的模式是基于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';
    }
});

 

上面是一种比较“正宗”的模块定义模式。除了将公共数据和方法附加在exports上,也可以直接返回一个对象表示模块,如下面的代码与上面的代码功能相同: 
复制代码 代码如下: 
define(function(require) { 
var a = require(‘a’); //引入a模块 
var b = require(‘b’); //引入b模块

var data1 = 1; //私有数据

var func1 = function() { //私有方法
    return a.run(data1);
}

return {
    data2: 2,
    func2: function() {
        return 'hello';
    }
};

});

如果模块定义没有其它代码,只返回一个对象,还可以有如下简化写法: 
复制代码 代码如下: 
define({ 
data: 1, 
func: function() { 
return ‘hello’; 

});

第三种方法对于定义纯JSON数据的模块非常合适。

简单的实例

helloworld.html源码如下:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Hello Sea.js</title>
</head>
<body>
<script src="sea.js"></script>
<script>
    seajs.use("main");
</script>
</body>
</html>

 

main.js源代码如下:

define(
    "main", //可以不要
    [], //可以不要
    function test() {       
        alert("Hello world!");
    }
);
posted @ 2016-12-08 09:37  墨者杨恒  阅读(194)  评论(0编辑  收藏  举报